뭐지?
파이썬의 데코레이터는 함수나 메소드의 변환을 위해 사용되는 함수입니다. 데코레이터를 사용하면 기존의 코드를 수정하지 않고도
함수의 기능을 확장하거나 변경할 수 있습니다. 이는 코드의 재사용성을 높이고, 가독성을 향상시키며, 유지보수를 용이하게 합니다.
데코레이터는 @(골뱅이) 기호를 함수 위에 적용하게 됩니다. 데코레이터는 실행시간에 함수를 감싸서(wrap)
실행 전후에 추가적인 코드를 실행할 수 있게 해주며, 이를 통해 함수의 행동을 수정합니다.
기본구조
def my_decorator(func):
def wrapper():
# 여기에 함수 호출 전 실행할 코드를 작성합니다.
print("함수 호출 전")
func()
# 여기에 함수 호출 후 실행할 코드를 작성합니다.
print("함수 호출 후")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
위 예제에서 my_decorator
는 데코레이터 함수이며, say_hello
함수 위에 적용되어 있습니다.say_hello
함수를 호출하면 실제로는 wrapper
함수가 호출됩니다. wrapper
함수 안에서는 say_hello
함수 호출 전후에 추가적인
코드를 실행할 수 있습니다.
매개변수가 있는 함수 데코레이팅
함수가 매개변수를 받는 경우, wrapper
함수 내에서 *args
와 **kwargs
를 사용하여 모든 종류의 매개변수를 받을 수 있게 할 수 있습니다.
def my_decorator(func):
def wrapper(*args, **kwargs):
print("함수 호출 전")
result = func(*args, **kwargs) # 원래 함수에 매개변수를 전달합니다.
print("함수 호출 후")
return result
return wrapper
@my_decorator
def say_message(message):
print(message)
say_hello()
데코레이터 사용 사례
데코레이터는 로깅
, 접근제어
, 측정 및 성능 테스트
, 트랜잭션
처리 등 다양한 상황에서 유용하게 사용됩니다.
예를들어, 함수의 실행 시간을 측정하는 데코레이터는 다음과 같이 작성 할 수 있습니다.
import time
def timer_decorator(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
@time_decorator
def long_runninig_function():
for _ in range(1000000):
pass
long_runninig_function()
이러한 방식으로 데코레이터를 사용하면 기존 코드의 변경 없이도 추가 기능을 쉽게 적용할 수 있습니다.
데코레이터는 파이썬에서 함수 또는 메서드의 기능을 변경하거나 확장할 때 매우 유용한 도구입니다. 하지만 그 사용에는 장점과 단점이 모두 존재합니다. 또한, 특정 상황에서는 데코레이터 대신 다른 방법을 사용하는 것이 더 적합할 수 있습니다.
데코레이터의 장점:
- 코드 재사용성: 데코레이터를 사용하면 비슷한 기능을 여러 함수에 적용할 때 중복 코드를 줄일 수 있습니다. 이는 코드의 재사용성을 높여줍니다.
- 코드 분리 및 관심사의 분리: 데코레이터를 사용하면 기능 확장이나 변경을 위한 코드를 별도로 분리할 수 있습니다. 이는 함수의 주요 로직과 부가적인 기능 사이의 관심사를 분리하는 데 도움을 줍니다.
- 가독성 및 유지 보수: 데코레이터를 사용하면 함수의 기능 변경이나 확장이 필요할 때 기존 코드를 수정하지 않아도 됩니다. 이는 코드의 가독성을 향상시키고 유지 보수를 용이하게 합니다.
데코레이터의 단점:
- 디버깅의 어려움: 데코레이터를 사용하면 스택 트레이스가 복잡해져서 디버깅이 어려울 수 있습니다. 데코레이터 내부의 오류는 추적하기가 더 복잡해질 수 있습니다.
- 가독성 저하: 때때로 데코레이터 사용이 코드의 가독성을 저하시킬 수 있습니다. 특히 데코레이터를 과도하게 사용하거나 복잡한 데코레이터를 사용하는 경우에 해당합니다.
- 학습 곡선: 파이썬 초보자에게는 데코레이터의 개념이 다소 어려울 수 있으며, 효과적으로 사용하기 위해서는 추가적인 학습이 필요합니다.
데코레이터의 대안:
고차 함수(Higher-order functions): 데코레이터와 유사하게 함수를 인자로 받거나 함수를 반환하는 함수를 사용하여 기능을 확장할 수 있습니다.
- 클래스 기반 데코레이터: 함수 기반 데코레이터 대신 클래스를 사용하여 데코레이터를 구현할 수 있습니다. 클래스 기반 데코레이터는 상태 관리가 필요할 때 유용합니다.
- 미들웨어: 특히 웹 프레임워크에서 요청 처리 파이프라인에 기능을 추가하기 위해 사용됩니다. 미들웨어는 데코레이터와 유사한 역할을 할 수 있지만, 애플리케이션의 전체 흐름에 적용됩니다.
- 디자인 패턴: 특정 상황에서는 옵서버 패턴, 전략 패턴, 커맨드 패턴과 같은 디자인 패턴을 사용하여 데코레이터와 비슷한 결과를 달성할 수 있습니다. 디자인 패턴은 더 큰 설계 문제를 해결하는 데 도움을 줄 수 있습니다.
데코레이터의 사용 여부는 프로젝트의 요구 사항, 코드의 복잡성, 팀의 선호도 및 경험 등 여러 요소를 고려하여 결정해야 합니다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
MRO(Method Resolution Order) (0) | 2024.03.20 |
---|---|
GIL(Global Interpreter Lock) (0) | 2024.03.20 |
코루틴이란? (0) | 2024.03.20 |
List와 Tuple의 차이 (0) | 2024.03.20 |
FastAPI를 이용한 TDD 개발 - 7 (0) | 2024.03.19 |