Research
데코레이터 (Decorator)
Decorator 패턴과 TypeScript 데코레이터의 차이, 그리고 실무 적용 시 주의점을 정리합니다.
데코레이터 (Decorator)
용어를 먼저 분리
실무에서 "데코레이터"는 두 의미로 쓰입니다.
- 디자인 패턴 Decorator: 객체 기능을 런타임에 감싸 확장
- 언어 기능 Decorator(TypeScript): 클래스/메서드에 메타데이터나 동작 주입
둘은 이름만 같고 목적이 다릅니다.
1) 디자인 패턴 Decorator
기존 객체를 감싸 부가 기능(로깅, 캐시, 인증)을 붙입니다. 원본 코드 수정 없이 조합 가능한 것이 장점입니다.
2) TypeScript Decorator
function log(target: any, key: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`[${key}]`, args);
return original.apply(this, args);
};
}
class UserService {
@log
find(id: string) {
return { id };
}
}
평가 순서(복수 데코레이터):
- 표현식 평가: 위 -> 아래
- 실제 적용: 아래 -> 위
실무 주의점
- 런타임 메타프로그래밍은 디버깅 난이도를 올립니다.
- 공통 관심사는 미들웨어/인터셉터로 대체 가능한지 먼저 검토합니다.
- 데코레이터 기반 DI/validation은 팀 숙련도 없으면 유지보수 비용이 큽니다.
요약
데코레이터는 강력하지만 투명성이 떨어질 수 있습니다. "보이지 않는 동작"이 늘어나는 순간부터 테스트와 문서화 규칙이 필수입니다.