클래스와 그 멤버(메서드, 프로퍼티)를 수정하거나 메타데이터를 주입하는 특수한 문법(@)입니다. 프레임워크(NestJS, Angular 등)에서 매우 활발하게 사용되는 고급 메타 프로그래밍 기술입니다.
@
기존 코드의 내부 로직을 뜯어고치지 않고도,마치 포장지로 감싸듯 외부에서 새로운 기능(로깅, 인증, 측정 등)을 우아하게 덧붙이는 마법입니다.
// 데코레이터를 사용하려면 tsconfig.json에서 // "experimentalDecorators": true 설정이 필요합니다. // 1. 클래스 데코레이터 팩토리 (인자를 받는 데코레이터) function Controller(route: string) { return function (constructor: Function) { console.log(`[Controller Loaded] Route: ${route} for ${constructor.name}`); }; } @Controller("/api/users") class UserController { constructor() {} } // 2. 메서드 데코레이터 (실행 시간 측정기) function LogTime() { return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; // 기존 메서드 보관 // 기존 메서드 가로채기 (Override) descriptor.value = function (...args: any[]) { console.time(propertyKey); const result = originalMethod.apply(this, args); console.timeEnd(propertyKey); return result; }; }; } class Calculator { @LogTime() // 메서드 실행 시간을 자동으로 측정합니다. calculate() { for (let i = 0; i < 1000000; i++) {} } } new Calculator().calculate(); // calculate: 1.2ms