데코레이터란?
NestJS에서 데코레이터는 메타데이터를 정의하고 클래스, 메서드, 속성 및 매개변수의 동작을 확장하는데 사용된다.
**메타데이터 : 데이터가 가지고 있는 정보(설명, 구조, 속성 등)을 추가적으로 제공하는 데이터
•
ex) 사진 파일(IMG_001.jpg)의 메타데이터
◦
촬영 날짜: 2025-02-07
◦
해상도: 1920x1080
◦
카메라 모델: Canon EOS 5D
데코레이터의 종류
1.
클래스 데코레이터
클라스 자체에 메타데이터를 추가하는데 사용된다.
@Controller('/users')
export class UserController {
@Get()
getUsers() {
return [{ id: 1, name: 'John Doe' }];
}
}
TypeScript
복사
위 코드를 실행하면 다음과 같은 과정을 거친다.
a.
UserController 클래스에 @Controller(’/users’) 메타데이터 저장
b.
getUsers() 메서드에 @Get()을 적용하여 라우팅 정보 저장
•
@Controller의 내부 동작
export function Controller(prefix?: string): ClassDecorator {
return (target) => {
Reflect.defineMetadata('path', prefix, target); // 컨트롤러가 처리할 URL('/user')을 메타데이터로 저장
Reflect.defineMetadata('isController', true, target); // NestJS가 이 클래스를 Controller로 인식할 수 있게 설정
};
}
TypeScript
복사
NestJS는 위 메타데이터를 바탕으로 HTTP 라우팅을 자동 설정한다.
@Get 같은 HTTP 메서드 데코레이터도 위와 같은 방식으로 getUsers() 메서드가 GET ‘/users’ 요청을 처리하도록 라우팅을 한다.
export function Get(path?: string): MethodDecorator {
return (target, key, descriptor) => {
Reflect.defineMetadata('method', 'GET', descriptor.value);
Reflect.defineMetadata('path', path || '', descriptor.value);
};
}
TypeScript
복사