@ 아래에는 평범한 함수 호출이 있어
@deco를 붙인 함수는 정의가 끝난 뒤 f = deco(f)로 다시 묶여. 데코레이터는 함수를 받아 호출 가능한 값을 돌려주는 변환일 뿐이야.
래퍼는 호출 계약을 그대로 전달해
래퍼는 보통 *args, **kwargs를 받아 원래 함수에 넘기고 결과를 그대로 돌려줘. 그 앞뒤에 기록, 시간 측정, 권한 확인, 캐시 같은 공통 동작을 넣을 수 있어.
여러 개를 쌓으면 아래부터 적용돼
가장 함수에 가까운 데코레이터가 먼저 함수를 감싸고, 그 결과를 위의 데코레이터가 다시 감싸. 호출 시에는 바깥쪽부터 들어가므로 적용 순서와 실행 순서를 구분해야 해.
원칙: 핵심 동작을 바꾸지 않고 여러 함수에 같은 주변 책임을 붙일 때 데코레이터를 써.