데코레이터(decorator)는 「함수나 클래스를 감싸 새 동작을 추가하는」 파이썬의 강력한 패턴입니다.
@ 기호로 표현되며, 「함수의 동작을 바꾸지 않고 외피만 더한다」는 발상에서 나왔습니다.
가장 간단한 데코레이터.
def my_decorator(func): def wrapper(): print("전"); func(); print("후"); return wrapper.
@my_decorator; def hello(): print("안녕").
hello() — 「전 / 안녕 / 후」 순서로 출력.
hello = my_decorator(hello)와 같은 의미입니다.
데코레이터 패턴은 「관심사 분리」에 매우 강합니다.
함수의 본업과 「로깅·시간 측정·인증·캐싱」 같은 부수적 관심사를 분리할 수 있습니다.
본업 함수는 본업만 적고, 부수적 관심사는 데코레이터로 자동 추가합니다.
친숙한 예시들.
@lru_cache — 캐싱.
@property — 게터.
@classmethod, @staticmethod — 메서드 종류.
@app.route("/") — Flask 라우팅.
@login_required — 인증 검사.
파이썬과 그 라이브러리들은 데코레이터로 풍부한 표현력을 만들어 냅니다.
데코레이터의 단점은 「디버깅이 다소 어렵다」는 점입니다.
함수를 감싸므로 스택 트레이스가 복잡해질 수 있고, 함수의 docstring·이름이 wrapper로 바뀌어 버리는 부작용이 있습니다.
이를 피하려면 functools.wraps를 사용해야 합니다(다음 글에서 다룹니다).
한 줄 요약
데코레이터는 함수·클래스를 감싸 새 동작을 추가하는 패턴입니다.
@ 기호로 표현되며, 로깅·캐싱·인증 같은 부수 관심사를 본업과 분리하는 데 강력합니다.
더 알아볼 것
- functools.wraps — 데코레이터의 함수 정보 보존
- 인자가 있는 데코레이터
- 클래스로 만드는 데코레이터