데코레이터(Decorator)는 클래스나 그 멤버 선언 앞에 @표현식을 붙여, 정의 시점에 대상을 감싸거나 메타데이터를 등록하는 문법이다. 기존 코드를 고치지 않고 기능을 덧붙인다는 점에서 데코레이터 패턴과 생각이 같다.
function Logger(prefix: string) { // 데코레이터 팩토리: 인자를 받아 데코레이터를 반환
return function (target: Function) { console.log(prefix, target.name) }
}
@Logger('LOG')
class Person {}- 언제 실행되나: 인스턴스를 만들 때가 아니라 클래스가 정의될 때 한 번 실행된다. 메서드를 부를 때마다 도는 이벤트 리스너가 아니다
- 순서: 여러 개를 쌓으면 팩토리 호출은 위에서 아래로, 데코레이터 적용은 아래에서 위로 일어난다
- 대표 용례: 메서드에
this를 묶어 주는 AutoBind, 속성에 검증 규칙을 등록하는 class-validator(@IsNotEmpty()), NestJS·Angular의 컨트롤러·DI(Dependency Injection) 등록. 프레임워크가 데코레이터로 정보를 모으는 방식은 의존성 주입 (DI)과 연결된다
두 가지 데코레이터 (2026 기준)
- 레거시(
experimentalDecorators): 옛 TC39(Ecma Technical Committee 39) 초안 기반. 클래스·메서드·접근자·속성·매개변수 데코레이터가 있고, 메서드는(target, name, descriptor)를 받는다. NestJS 등 기존 생태계가 아직 이것을 쓴다 - 표준(TS 5.0+): 플래그 없이 쓰는 ECMAScript 데코레이터.
(value, context)를 받으며 매개변수 데코레이터는 없다. 둘은 시그니처가 달라 섞어 쓸 수 없다