파이썬 데코레이터의 기본 개념과 활용

데코레이터는 파이썬에서 함수나 메서드의 동작을 변경하거나 확장할 수 있는 강력한 도구입니다. 일반적으로 하나의 함수에 하나의 데코레이터가 적용되는 경우가 많지만, 이는 필수적인 제약이 아니라 관례일 뿐입니다. 핵심은 데코레이터가 기존 함수를 수정하지 않고도 그 행동을 감싸거나 변형한다는 점에 있습니다.

기술적으로 데코레이터는 함수를 인자로 받아 새로운 함수를 반환하는 고차 함수입니다. 이를 통해 함수 호출 전후로 부가 작업을 삽입할 수 있으며, 로깅, 성능 측정, 인증 처리 등 다양한 용도로 사용됩니다.

기본 구조

다음은 데코레이터의 전형적인 형태입니다:

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 모두 동일한 응답을 반환합니다. 즉, 여러 조건(경로)이 하나의 함수를 가리키는 "다대일" 매핑이 가능하다는 의미입니다.

이처럼 데코레이터는 단순한 문법적 설탕을 넘어서, 코드 재사용성과 유지보수성을 높이는 핵심 패턴으로 자리 잡고 있습니다.

태그: python decorator flask higher-order-function function-wrapper

6월 13일 20:04에 게시됨