[NestJS 공식문서 정독하기] Overview - Custom decorators
2022. 8. 6. 19:46ㆍWeb/NestJS
반응형
🔗 https://docs.nestjs.com/custom-decorators
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac
docs.nestjs.com
Custom route decorators
- NestJS는 decorator라는 기능으로 구성되어 있임
- decorator는 여러 언어에서 익숙한 개념이지만 Javascript에서는 비교적 새로운 개념임
- decorator를 더 이해하고 싶다면 링크를 참조
Param decorators
- NestJS는 HTTP route handler와 함께 사용할 수 있는 param decorator를 제공함
- param decorator 목록
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);
@Get()
async findOne(@User() user: UserEntity) {
console.log(user);
}
- custom decorator도 생성할 수 있음
- node.js에서는 요청 객체에 프로퍼티를 추가하고 route handler에서 추출해 사용하는 방식이 흔히 사용됨
- 위와 같이
@User()
decorator를 만들어서 필요한 곳에 사용할 수 있음
Passing data
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator(
(data: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
const user = request.user;
return data ? user?.[data] : user;
},
);
@Get()
async findOne(@User('firstName') firstName: string) {
console.log(`Hello ${firstName}`);
}
- custom decorator를 특정 조건에 따라 다른 처리하도록 하기 위해
data
매개 변수를 활용할 수 있음 - 해당 매개 변수의 한 가지 사용 사례가 있다면, 요청 객체의 특정 데이터를 키값으로 추출하는 것임
- 위와 같이
@User('firstName')
decorator로request.user.firstName
을 추출할 수 있음 - 해당 decorator를 사용해
requset.user
의 다양한 다른 데이터를 키값으로 추출 할 수 있음 - typescript 환경에서는
createParamDecorator<T>()
는 generic이기 때문에data
매개 변수의 타입을 강제할 수 있음
Working with pipes
@Get()
async findOne(
@User(new ValidationPipe({ validateCustomDecorators: true }))
user: UserEntity,
) {
console.log(user);
}
- NestJS는 custom decorator를 내장 decorator들과 같은 방식으로 처리하기 때문에 모두 pipe가 적용 가능함
- 다만, custom decorator는 pipe를 적용하기 위해서는
validateCustomDecorators
옵션이 true이어야 함
Decorator composition
import { applyDecorators } from '@nestjs/common';
export function Auth(...roles: Role[]) {
return applyDecorators(
SetMetadata('roles', roles),
UseGuards(AuthGuard, RolesGuard),
ApiBearerAuth(),
ApiUnauthorizedResponse({ description: 'Unauthorized' }),
);
}
@Get('users')
@Auth('admin')
findAllUsers() {}
- NestJS는 여러가지 decorator들 하나의 decorator로 합성하기 위한 helper method를 제공함
반응형