데코레이터는 파이썬에서 함수나 메서드의 동작을 변경하거나 확장할 수 있는 강력한 도구입니다. 일반적으로 하나의 함수에 하나의 데코레이터가 적용되는 경우가 많지만, 이는 필수적인 제약이 아니라 관례일 뿐입니다. 핵심은 데코레이터가 기존 함수를 수정하지 않고도 그 행동을 감싸거나 변형한다는 점에 있습니다.
기술적으로 데코레이터는 함수를 인자로 받아 새로운 함수를 반환하는 고차 함수입니다. 이를 통해 함수 호출 전후로 부가 작업을 삽입할 수 있으며, 로깅, 성능 측정, 인증 처리 등 다양한 용도로 사용됩니다.
기본 구조
다음은 데코레이터의 전형적인 형태입니다:
def simple_decorator(target_function):
def inner_wrapper(*args, **kwargs):
print("함수가 시작되기 전")
output = target_function(*args, **kwargs)
print("함수가 종료된 후")
return output
return inner_wrapper
inner_wrapper는 실제 대체 함수로, 원래 함수를 호출하기 전후로 추가 로직을 수행합니다.*args와**kwargs를 사용함으로써 다양한 시그니처의 함수에도 적용 가능하게 됩니다.- 반환값은 함수 객체이므로, 원본 함수 대신 이 래퍼가 실행됩니다.
실제 예시: 로그 출력 데코레이터
def logging_call(func):
def execute_with_log(*args, **kwargs):
print(f"[LOG] '{func.__name__}' 함수가 호출되었습니다.")
value = func(*args, **kwargs)
print(f"[LOG] '{func.__name__}' 함수가 완료되었습니다.")
return value
return execute_with_log
@logging_call
def introduce(name, age):
print(f"저는 {name}이고, {age}살입니다.")
introduce("지훈", 28)
실행 결과:
[LOG] 'introduce' 함수가 호출되었습니다. 저는 지훈이고, 28살입니다. [LOG] 'introduce' 함수가 완료되었습니다.
웹 프레임워크에서의 다중 바인딩 예
Flask 같은 프레임워크에서는 하나의 함수를 여러 경로에 연결할 수 있습니다:
@app.route('/home')
@app.route('/dashboard')
def show_dashboard():
return '<h1>대시보드 페이지</h1>'
이 경우 /home과 /dashboard 모두 동일한 응답을 반환합니다. 즉, 여러 조건(경로)이 하나의 함수를 가리키는 "다대일" 매핑이 가능하다는 의미입니다.
이처럼 데코레이터는 단순한 문법적 설탕을 넘어서, 코드 재사용성과 유지보수성을 높이는 핵심 패턴으로 자리 잡고 있습니다.