BLOG
Tracefield · 02
Tracefield · 01
블로그 · 14
Vibe Audit · 04
Vibe Audit · 03
Vibe Audit · 02
Vibe Audit · 01
출판편집자 · 01
StudyTree · 01
SecurityOps · 02
SecurityOps · 01
AI챗봇 · 04
AI챗봇 · 03
AI챗봇 · 02
AI챗봇 · 01
퍼플심 · 04
퍼플심 · 03
퍼플심 · 02
퍼플심 · 01
블로그 · 13
rootscan · 07
rootscan · 06
블로그 · 12
블로그 · 11
블로그 · 10
블로그 · 09
블로그 · 08
블로그 · 07
블로그 · 06
블로그 · 05
블로그 · 04
블로그 · 03
블로그 · 02
블로그 · 01
rootscan · 05
rootscan · 04
rootscan · 03
asmspeak · 03
asmspeak · 02
rootscan · 02
asmspeak · 01
rootscan · 01
웹보안도구 · 02
웹보안도구 · 01
루트캠프 · 02
루트캠프 · 01
All notes 167
데코레이터와 클로저
1. 클로저 (Closure)
클로저는 데코레이터를 이해하기 전에 먼저 잡아야 하는 개념이다.
클로저는 자신을 감싼 외부 스코프의 변수를 기억하는 내부 함수다. 외부 함수 실행이 끝난 뒤에도, 내부 함수가 그 변수를 계속 참조하고 있는 상태를 말한다.
성립 조건은 보통 이렇게 본다.
- 함수 안에 중첩 함수가 있어야 한다.
- 내부 함수가 외부 함수의 변수를 참조해야 한다.
- 외부 함수가 내부 함수를 반환해야 한다.
비유하면 타임캡슐에 가깝다. 바깥 공장은 문을 닫았는데, 안에서 나온 함수는 그때 쓰던 재료를 계속 들고 나오는 셈이다.
2. 데코레이터 (Decorator)
데코레이터는 기존 함수를 직접 고치지 않고, 실행 전후에 부가 기능을 붙이고 싶을 때 쓴다.
- 개념:
- 클로저를 활용한 문법적 설탕이다.
@문법으로 함수 위에 붙인다.
- 원리:
- 실제 동작은
target_func = decorator(target_func)와 같다. - 함수를 인자로 받아, 기능이 추가된 새 함수를 반환하는 구조다.
- 실제 동작은
3. 기본 구조
def my_decorator(func):
def wrapper():
print("1. 함수 실행 전")
func() # 원본 함수 실행
print("2. 함수 실행 후")
return wrapper
@my_decorator
def hello():
print("Hello World")
# 실행
hello()
# 출력:
# 1. 함수 실행 전
# Hello World
# 2. 함수 실행 후
4. 실전 활용 예시
실무에서는 반복되는 공통 처리 로직을 분리할 때 자주 쓴다.
4.1. 실행 시간 측정 (Timer)
- 상황: 코드 성능을 확인하고 싶을 때
- 구현: 함수 실행 전
start를 기록하고, 실행 뒤end를 기록해서end - start를 출력한다.
4.2. 로그인/권한 체크 (Authentication)
- 상황: 특정 페이지나 API를 로그인 사용자만 접근하게 해야 할 때
- 구현:
wrapper안에서if user.is_logged_in:같은 조건을 먼저 확인한다.- 로그인하지 않았다면 함수 실행을 막고 에러를 반환한다.
- 로그인 상태면 원본 함수를 실행한다.
- 장점: 글쓰기, 조회 같은 핵심 로직에서 권한 체크용
if문을 걷어낼 수 있다. 관심사를 분리하기 쉬워진다.
5. functools.wraps
데코레이터를 쓰면 원본 함수의 이름(__name__)과 설명(__doc__)이 wrapper 기준으로 바뀌는 문제가 생긴다.
이때 @functools.wraps(func)를 wrapper 위에 붙이면 원본 메타데이터를 유지할 수 있다. 실무에서는 거의 기본으로 붙인다고 보면 된다.

