본문 바로가기
프로그래밍언어/파이썬[중급]

[파이썬][중급] Chapter10. 데코레이터 함수의 작성과 활용

by about_IT 2025. 5. 18.
728x90

데코레이터는 함수의 실행 전후에 부가적인 로직을 삽입할 수 있도록 해주는 파이썬 고유의 문법입니다. 기존 함수를 수정하지 않고 기능을 확장할 수 있어 코드의 재사용성과 가독성을 높이는 데 매우 유용합니다.


● 데코레이터란?

데코레이터는 다른 함수를 인자로 받아, 그 함수에 기능을 추가한 후 반환하는 고차 함수입니다. @데코레이터_이름 형식으로 함수 위에 사용됩니다.

def decorator_func(func):
    def wrapper():
        print("함수 실행 전")
        func()
        print("함수 실행 후")
    return wrapper

@decorator_func
def say_hello():
    print("Hello!")

say_hello()

위 예제에서 say_hello 함수는 decorator_func에 의해 래핑되어 실행 전후에 메시지를 출력합니다.


● 인자가 있는 함수에 데코레이터 사용

데코레이터 내부 함수에서 가변 인자(*args, **kwargs)를 사용하면 어떤 인자든 처리할 수 있습니다.

def log_args(func):
    def wrapper(*args, **kwargs):
        print(f"인자: {args}, {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_args
def add(a, b):
    return a + b

print(add(3, 5))

● 데코레이터 체이닝

여러 데코레이터를 동시에 적용할 수도 있습니다. 이 경우 가장 가까운 데코레이터부터 순차적으로 적용됩니다.

@decorator1
@decorator2
def my_func():
    pass

위 예제는 decorator2가 먼저 적용되고, 그 결과에 decorator1이 적용됩니다.


● functools.wraps의 활용

데코레이터를 적용하면 원래 함수의 이름이나 docstring이 변경될 수 있습니다. 이를 방지하려면 functools.wraps를 사용합니다.

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

● 마무리

데코레이터는 코드의 중복을 줄이고, 실행 흐름을 깔끔하게 제어할 수 있는 고급 기능입니다. 특히 로깅, 권한 검사, 실행 시간 측정 등 다양한 곳에서 자주 활용되므로, 함수형 프로그래밍의 개념과 함께 익혀두는 것이 좋습니다.

728x90