ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Nest.js 공식문서 읽기] Controller
    Server/Nest.js 2023. 1. 27. 14:57

    컨트롤러

    컨트롤러는 애플리케이션에 대한 특정 요청을 받고 응답을 리턴하는 곳이다.

    라우팅

    express에서는 라우터와 컨트롤러를 분리했었는데, nest는 express의 라우터와 컨트롤러를 합쳐놓은 모습이었다.

    nest에서는 express에서 사용하지 않던 데코레이터라는 것을 사용한다.

    📌 데코레이터
    데코레이터는 클래스의 필수 메타데이터를 등록하고 nest가 라우팅 맵을 생성할 수 있도록 한다.
    Nest에서 제공하는 데코레이터를 사용할 경우 자체적으로 인스턴스를 생성해준다.
    - Nest에서는 불필요한 메모리 사용을 방지하기 위하여 싱글톤 패턴을 적용시킬 수 있는 데코레이터를 제공한다.
    - @Resolver(for GraphQL), @Controller(), @injectable() 등, 해당하는 것을 모듈의 프로바이더에 넣는 것으로 싱글톤이 적용된다.

     

    @Controller() 데코레이터에 라우트 경로의 대분기(prefix)를 넣고 소분기 경로를 각 메소드 데코레이터(@Get 같은)의 인자로 넣어주면 된다.

    CLI를 사용하여 컨트롤러를 만들어주게 되면 데코레이터 안에 컨트롤러의 이름으로 대분기 라우팅의 경로가 자동삽입된다.

    // boards.controller.ts
    import { BoardsService } from './boards.service';
    import { Controller, Get } from '@nestjs/common';
    import { Board } from './board.entity';
    
    @Controller('boards')
    export class BoardsController {
      constructor(private boardsService: BoardsService) {}
    
      @Get('/')
      getAllBoard(): Promise<Board[]> {
        return this.boardsService.getAllBoards();
      }
    }

    nest에서 응답을 처리하는 방식에는 2가지가 있다. (standard 방식이 권장 됨)

    • Standard : 내장 메서드를 사용하면 요청 핸들러가 JS 객체나 배열을 반환할 때 자동으로 JSON으로 직렬화되고, 원시 타입(문자열, 숫자, 불리언 값)을 반환할 때는 직렬화 하지 않고 값을 그대로 리턴한다. 그 값을 리턴하면 그 뒤는 nest가 알아서 처리해준다. 더욱이 응답 상태코드는 기본값 200으로 되어있다.(post메소드는 201이다) 상태코드를 수정하고 싶다면 @HttpCode() 데코레이터로 수정해줄 수 있다.
    • Library-specific : 라이브러리의 응답 객체를 사용하는 방법도 있다. express 같은 경우 @Res() 데코레이터를 메서드 핸들러의 시그니처에 주입하는 것이다.

    댓글