티스토리 뷰

데코레이터

네스트에는 많은 데코레이터가 존재한다.
@Body() , @Param() 등 데코레이터를 통해 특정 요청에 대한 값을 접근할 수 있다.

예를들어 request객체 안에 body 에 접근하고자 한다면 해당 값을 가져오기 위해 이렇게 작성 할 것이다.

const data= req.body

하지만 여기서 더 readable하고 transparent하게 만들기 위해 @Body() 데코레이터를 사용할 수 있다.

login(@Body('user') loginUserDto: LoginUserDto)

이런식으로 req.body 안에 있는 user의 값을 loginUserDto 라는 변수에 쉽게 담을 수 있다.

커스텀 데코레이터

위에 설명한 데코레이터를 커스텀하여 사용할 수 있다.

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);

@nestjs/common 으로 부터 createParamDecorator 를 사용하여 데코레이터를 만들어 주면 된다.
그리고 ctx.switchToHttp().getRequest(); 를 통해 request에 접근할 수 있다.
위 함수는 단순히 request로 부터 user 데이터만을 전달 하는 데코레이터 이다.

이제 이렇게 만든 데코레이터를 사용할 수 있다. 조금 더 코드가 직관적으로 바뀌었다.

@Get()
async findOne(@User() user: UserEntity) {
  console.log(user);
}

Passing data

커스텀 데코레이터를 @Body() 데코레이터와 같이 특정 key에 대한 값만을 받아올 수 있다.
커스텀 데코레이터를 다음과 같이 구현하면 된다.

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;
  },
);

이렇게 하면 @User('id') 와 같은 데코레이터 호출이 가능하다.

Etc..

nest에 미리 정의되어있는 데코레이터와 마찬가지로 pipe를 적용하는것과 composition하는 것도 가능하다.

자세한 사용방법은 nest js 공식문서 를 참고하자.

'Nest.js' 카테고리의 다른 글

[Nest.js] 네스트 미들웨어(Nest Middleware)  (0) 2022.01.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함