데코레이터(decorator)는 일종의 "래퍼(wrapper)"입니다. 함수 자체의 코드를 전혀 수정하지 않으면서도, 해당 함수가 실행되기 전과 후에 원하는 코드를 추가로 실행할 수 있게 해주는 강력한 기능입니다.
데코레이터 체인 예제
여러 개의 데코레이터를 하나의 함수에 연달아 적용하는 것을 "데코레이터 체인"이라고 합니다. 아래 예제는 hello 함수를 두 개의 데코레이터(@makebold, @makeitalic)로 감싸는 코드입니다.
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makebold
@makeitalic
def hello():
return "hello world"
print(hello())실행 결과
<b><i>hello world</i></b>
동작 원리 이해하기
위 코드가 실행되면 다음과 같은 순서로 동작합니다.
- Python은 데코레이터를 아래에서 위로 적용합니다. 즉,
hello함수가 먼저makeitalic으로 감싸지고, 그 결과가 다시makebold로 감싸집니다. - 따라서 최종 출력은
<b><i>hello world</i></b>가 되어, 화면에는 hello world처럼 굵은 기울임꼴 텍스트로 표시됩니다.
이처럼 데코레이터를 체인으로 연결하면 로깅, 인증, 캐싱, HTML 태그 변환 등 다양한 부가 기능을 기존 함수의 코드를 건드리지 않고 손쉽게 추가할 수 있습니다.