파이썬 데코레이터 완벽 이해와 활용 예시

안녕하세요. 오늘은 파이썬 데코레이터에 대해 알아보겠습니다. 파이썬에서 데코레이터는 코드를 간결하고 읽기 쉽게 만들어주는 기능입니다. 이번에 데코레이터의 기본 개념부터 실제 사용 예제까지 다루어 보겠습니다.

파이썬 데코레이터란?
데코레이터는 다른 함수를 감싸는 함수라고 생각하시면 됩니다.
감싼 함수의 기능을 확장하거나 변경할 때 사용하는데, 데코레이터는 함수를 변경하지 않고 추가적인 기능을 부여할 수 있는 기법 중 하나입니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
def deco(func): def wrapper(): print("바보: ", end="") func() return wrapper @deco def hello(): print("안녕하세요") say_hello() |
데코레이터는 함수 위에 @를 입력한 뒤 지정한 데코레이터 이름을 써주시면 됩니다.
이 코드에서는 앞에 ‘바보’ 라는 문자열을 붙이게 해보았습니다.
1 2 |
바보: 안녕하세요 |
데코레이터의 사용 예
파이썬 데코레이터는 저런식으로 사용하지 않고도 로깅, 실행 시간 측정, 권한 검사 등에서 유용하게 사용됩니다. 예를 들어 함수의 실행 시간을 측정하는 데코레이터를 작성해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import time def timer_deco(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} 실행 시간: {end_time - start_time}초") return result return wrapper @timer_decorator def long_run_func(): for _ in range(1000000): pass long_running_function() |
이 데코레이터를 사용하면 long_running_function
함수의 실행 시간을 측정할 수 있습니다.
*arg와 **kargs에 대해 궁금하실 수도 있는데, *args
는 함수에 임의의 개수의 위치 인자를 전달할 때 사용되고
**kwargs
는 함수에 임의의 개수의 키워드 인자를 전달할 때 사용됩니다. func(a=1, b=2)
와 같이 함수를 호출하면 {‘a’: 1, ‘b’: 2}로 묶여 함수 내부로 전달됩니다.”
데코레이터의 활용
그래서 이걸 어디다 쓰냐구요?
사용할 수 있는 상황은 많은데 예를 들어 웹 애플리케이션에서 특정 기능을 수행하기 전에 사용자가 관리자인지 확인해야 할 때가 있습니다. 이런 경우에 데코레이터를 활용하면 코드를 가독성 좋고 깔끔하게 유지할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def admin_required(func): def wrapper(*args, **kwargs): user = kwargs.get('user') if not user.is_admin: raise PermissionError("이 기능을 사용하기 위해서는 관리자 권한이 필요합니다.") return func(*args, **kwargs) return wrapper @admin_required def delete_user(user, target_user_id): print(f"{target_user_id} 사용자가 삭제되었습니다.") # 관리자 권한이 있는 사용자로 가정 class User: def __init__(self, is_admin): self.is_admin = is_admin admin_user = User(is_admin=True) delete_user(user=admin_user, target_user_id=123) # 사용자 삭제 성공 normal_user = User(is_admin=False) delete_user(user=normal_user, target_user_id=123) # PermissionError 발생 |
위처럼 @admin_required 라는 데코레이터를 추가하면 읽기에도 아 이게 관리자 권한이 필요한 함수이구나 하고 알아들을 수 있고, 함수 안에 따로 권한을 검증하는 코드를 추가하지 않고 깔끔하게 작성할 수 있습니다.
데코레이터는 이처럼 코드의 재사용성을 높이고 함수의 기능을 확장하는 데 매우 유용합니다.
이 글을 통해 데코레이터의 기본적인 사용 방법과예제를 통한 활용 방법을 이해하셨기를 바랍니다. 다른 글도 확인하시려면 여기를 눌러 블로그 메인도 방문해주세요. 감사합니다.