TypeScript
[TypeScript] 타입스크립트 데코레이터
깅민
2025. 5. 27. 10:21
1. 데코레이터 (Decorator)
데코레이터는 클래스나 클래스 맴버(속성, 메서드 등)에 메타프로그래밍 기능을 추가하고 싶을 때 사용합니다.
데코레이터는 @데코레이터명 을 붙이면 사용할 수 있습니다.
데코레이터 | 시그니처 |
클래스 | (constructor: { new (...args: any[] ) => {} }) |
메서드 | (target: any, propertyKey: string, propertyDescriptor: PropertyDescriptor) |
속성 | (target: any, propertyKey: string) |
매개변수 | (target: object, propertyKey: string, parameterIndex: number) |
접근자 | (target: any, propertyKey: string, descriptor: PropertyDescriptor) |
1-1. 클래스
간단한 데코레이터 예시입니다.
실행하면 클래스 생성 전인데 "init" 이 출력됩니다.
function InitDecorator(constructor: Function) {
console.log("init");
}
@InitDecorator
class Test {
constructor() {
console.log("test");
}
}
1-2. 메서드
다음은 로그를 출력하는 데코레이터 예시입니다.
결과값(3)이 나오기 전에 "Called doSomething with [ 1, 2 ] " 가 출력됩니다.
function Log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Called ${propertyKey} with`, args);
return originalMethod.apply(this, args);
};
}
class MyClass {
@Log
doSomething(a: number, b: number) {
return a + b;
}
}
const my = new MyClass();
const res = my.doSomething(1, 2);
console.log("res", res);
// Called doSomething with [ 1, 2 ]
// res 3
1-3. 속성
function PropertyLogger(target: any, propertyKey: string) {
console.log(`Property decorator called for: ${propertyKey}`);
}
class Person {
@PropertyLogger
name: string;
constructor(name: string) {
this.name = name;
}
}
// Property decorator called for: name
PropertyLogger는 단순히 데코레이터가 호출되는 시점에 로그만 찍습니다.
실제로 값을 바꾸거나 검증하려면 getter/setter 또는 proxy를 함께 사용해야 합니다.
1-4. 매개변수
function ParamLogger(target: any, methodName: string, parameterIndex: number) {
console.log(
`Parameter decorator on ${methodName}, parameter #${parameterIndex}`
);
}
class Car {
start(@ParamLogger speed: number) {
console.log(`Starting at speed ${speed}`);
}
}
const c = new Car();
c.start(100);
// Parameter decorator on start, parameter #0
// Starting at speed 100
매개변수 데코레이터는 주로 메타데이터를 수집하거나 유효성 검사 라이브러리에서 사용됩니다.
1-5. 접근자
function AccessorLogger(
target: any,
propertyKey: string,
descriptor: PropertyDescriptor
) {
console.log(`Accessor decorator on: ${propertyKey}`);
}
class Account {
private _balance: number = 0;
@AccessorLogger
get balance() {
return this._balance;
}
set balance(amount: number) {
this._balance = amount;
}
}
const acc = new Account();
acc.balance = 500;
console.log(acc.balance);
// Accessor decorator on: balance
// 500
접근자 데코레이터는 get 또는 set 에만 사용할 수 있으며, 속성과는 다르게
PropertyDescriptor를 수정할 수 있습니다.