데코레이터(decorator)는 함수나 메서드에 적용되어, 해당 함수나 메서드의 기능을 확장하거나 변경하는 역할을 합니다.
데코레이터는 일반적으로 @기호와 함께 사용되며, 함수 또는 메서드 위에 위치합니다.
데코레이터는 기본적으로 함수를 인자로 받고, 또다른 함수를 반환하는 고차 함수(Higher-order function)입니다.
지금까지 클래스에서 메서드를 만들 때, @staticmethod, @classmethod, @abstractmethod 등을 붙였는데, 이렇게 @로 시작하는 것들 이 데코레이터
장식자라고 부르기도 함.
데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용.
def hello(func):
def wrapper():
print(func.__name__, '함수 시작')
func()
print(func.__name__, '함수 끝')
return wrapper
@hello
def hi():
print("Hi")
hi()
# 실행 결과
hi 함수 시작
Hi
hi 함수 끝
데코레이터를 여러 개 붙일 수도 있음.
def deco1(func):
def wrapper():
print("deco1")
func()
return wrapper()
def deco2(func):
def wrapper():
print("deco2")
func()
return wrapper()
@deco1
@deco2
def sample():
print('sample')
# 실행 결과
deco1
deco2
sample
순차적으로 실행된다.
그렇다면 Spring의 annotation과는 무슨 차이일까?
둘 다 똑같이 @를 쓴다는 점에서 기능적으로 비슷해 보일 수 있다.
하지만 둘은 명확히 차이가 크다.
@ 어노테이션의 용도는
1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
3. 런타임 시 특정 기능을 실행하도록 정보를 제공한다.
둘의 비슷한 점은
결론