[TIL] NestJS 공부 15일차

정인교·2021년 6월 18일
0

TIL(Today I Learned)

목록 보기
26/67
post-thumbnail

인터셉터

더 많은 연산자

전 내용이 스트림을 재정의, 즉 override하는 것이였는데 이렇게 바꿀 수 있는 점은 많은 기능으로 연결된다.
timeout 처리를 해야한다면 아래 코드처럼 timeout()을 이용하여 5초 후에 요청 처리를 취소한다.

import {
  Injectable,
  NestInterceptor,
  ExecutionContext,
  CallHandler,
  RequestTimeoutException,
} from '@nestjs/common';
import { Observable, throwError, TimeoutError } from 'rxjs';
import { catchError, timeout } from 'rxjs/operators';

@Injectable()
export class TimeoutInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): 
  Observable<any> {
    return next.handle().pipe(
      timeout(5000),
      catchError((err) => {
        if (err instanceof TimeoutError) {
          return throwError(new RequestTimeoutException());
        }
        return throwError(err);
      })
    );
  }
}

Custom Decorator

NestJS는 decorator를 중심으로 만들어졌다. decorator는 프로그래밍 언어에서 어느정도 잘 쓰였지만, Javascript에서는 새로운 개념이라 볼 수 있다. 데코레이터를 이해하기 위해선 어느정도 기초 공부가 필요하니 다른 문서를 찾아보는 것을 추천해줬다.
어쨌든 여기까지 공부하면서 수 많은 데코레이터를 사용해봤고, 그래서 알 수 있는 점은
@로 시작하여 decorate하고 싶어하는 맨 위에 적용시킨다. 라는 것이다.
Express Decorator는 @Req, @Res 등 여러가지 있는데 사용자 지정 데코레이터는 왜 필요할까?

일단 가독성이 올라간다. request를 받을 때에도

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

이렇게 간단하게 코드를 작성할 수 있다.

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

첫 번째는 데코레이터 코드, 두 번째는 사용 코드다.
컨트롤러는 @User데코레이터를 통해 특정 속성에 접근하여 그 값을 바꿀 수 있다. 라는 걸 보여주는 사용 코드다.

profile
백엔드 개발자 정인교입니다!

0개의 댓글