파이썬 데코레이터 완벽 가이드: 활용법과 예제
파이썬 데코레이터란?
데코레이터는 파이썬에서 제공하는 고급 기능으로, 함수나 메서드의 동작을 수정하거나 확장할 수 있는 도구입니다. 데코레이터는 함수를 인자로 받아 새로운 함수를 반환하는 고차 함수로, 기존 함수의 코드를 변경하지 않고도 추가적인 기능을 구현할 수 있습니다.
이를 통해 코드의 중복을 줄이고, 가독성을 높이며, 유지보수성을 향상시킬 수 있습니다. 특히, 로깅, 인증, 성능 측정 등과 같은 공통 기능을 여러 함수에 적용할 때 유용합니다.
👇👇👇 내용 자세히 보기 👇👇👇
데코레이터의 기본 구조
데코레이터는 다음과 같은 구조를 가집니다:
def decorator(func):
def wrapper(*args, **kwargs):
# 함수 실행 전 작업
result = func(*args, **kwargs)
# 함수 실행 후 작업
return result
return wrapper
위 구조에서 wrapper
는 실제로 작업을 수행하는 내부 함수입니다. @decorator
구문을 사용하면 데코레이터를 간단히 적용할 수 있습니다.
간단한 예제
def my_decorator(func):
def wrapper():
print("함수 실행 전")
func()
print("함수 실행 후")
return wrapper
@my_decorator
def say_hello():
print("안녕하세요!")
say_hello()
결과:
함수 실행 전
안녕하세요!
함수 실행 후
데코레이터의 활용 사례
1. 로깅 기능 추가
데코레이터를 활용해 함수 호출 시 로그를 남길 수 있습니다.
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"{func.__name__} 함수가 호출되었습니다.")
return func(*args, **kwargs)
return wrapper
@log_decorator
def add(a, b):
return a + b
print(add(3, 5))
결과:
add 함수가 호출되었습니다.
8
2. 인증 기능 구현
사용자 인증이 필요한 경우 데코레이터로 쉽게 구현할 수 있습니다.
def auth_decorator(func):
def wrapper(user):
if user == "admin":
return func(user)
else:
return "접근 권한이 없습니다."
return wrapper
@auth_decorator
def view_dashboard(user):
return f"{user}님 대시보드에 오신 것을 환영합니다."
print(view_dashboard("admin"))
print(view_dashboard("guest"))
결과:
admin님 대시보드에 오신 것을 환영합니다.
접근 권한이 없습니다.
3. 실행 시간 측정
데코레이터를 사용해 함수의 실행 시간을 측정할 수 있습니다.
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"실행 시간: {end_time - start_time:.2f}초")
return result
return wrapper
@timer_decorator
def slow_function():
time.sleep(2)
print("작업 완료")
slow_function()
결과:
작업 완료
실행 시간: 2.00초
클래스 메서드와 데코레이터
파이썬에서는 클래스 메서드에도 데코레이터를 사용할 수 있습니다. 대표적인 예로 @staticmethod
, @classmethod
, @property
가 있습니다.
1. @staticmethod와 @classmethod
@staticmethod
: 클래스와 독립적인 정적 메서드를 정의합니다.@classmethod
: 클래스 자체를 첫 번째 인자로 받는 메서드를 정의합니다.
class MyClass:
@staticmethod
def static_method():
print("정적 메서드 호출")
@classmethod
def class_method(cls):
print(f"{cls} 클래스 메서드 호출")
MyClass.static_method()
MyClass.class_method()
결과:
정적 메서드 호출
<class '__main__.MyClass'> 클래스 메서드 호출
2. @property
@property
는 게터(getter)와 세터(setter)를 쉽게 정의할 수 있도록 돕습니다.
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value > 0:
self._radius = value
else:
raise ValueError("반지름은 양수여야 합니다.")
circle = Circle(5)
print(circle.radius) # 5
circle.radius = 10 # 반지름 변경 가능
print(circle.radius) # 10
데코레이터의 장점과 주의점
장점
- 재사용성 증가: 동일한 로직을 여러 함수에 적용 가능.
- 가독성 향상: 코드 중복 제거 및 간결화.
- 유지보수 용이: 공통 기능을 한 곳에서 관리 가능.
주의점
- 디버깅 어려움: 디버거에서 원래 함수 대신 래퍼(wrapper)가 표시될 수 있음.
- 복잡성 증가: 과도한 사용은 코드 이해도를 낮출 수 있음.
결론
파이썬 데코레이터는 코드의 효율성과 가독성을 높이는 강력한 도구입니다. 이를 통해 반복 작업을 줄이고 유지보수를 쉽게 할 수 있으며, 다양한 상황에서 유용하게 활용될 수 있습니다. 특히 로깅, 인증, 성능 측정 등과 같은 공통 작업에 적합합니다.
데코레이터를 잘 활용하면 더욱 깔끔하고 효율적인 파이썬 코드를 작성할 수 있습니다. 앞으로 프로젝트에서 적극적으로 활용해 보세요.
자주 묻는 질문(FAQ)
Q1. 데코레이터는 필수적으로 사용해야 하나요?
A1. 아니요. 데코레이터는 선택 사항이며, 필요에 따라 사용하면 됩니다.
Q2. 여러 개의 데코레이터를 동시에 사용할 수 있나요?
A2. 가능합니다. 여러 데코레이터를 쌓아 올릴 수 있으며, 위에서 아래로 순차적으로 적용됩니다.
Q3. 클래스에도 데코레이터를 사용할 수 있나요?
A3. 네, 클래스에도 사용할 수 있으며 대표적인 예로 @staticmethod
, @classmethod
, @property
등이 있습니다.
댓글