Javascript/NestJS

NestJS Controller에 대해 알아보기

kyoulho 2023. 3. 13. 20:11

Controller 생성하기


 

nest g controller [컨트롤러 이름]

 

*.controller.spec.ts 은 테스트 파일로 생성을 원치 않으면 명령어 뒤에 --no-spec 을 붙여주면 된다.

 

요청 처리 방식


@Controller('boards')
export class BoardsController {

  @Get()
  getBoards() {
    return []
  }
}

NestJS의 컨트롤러는 스프링의 컨트롤러와 매우 유사하다. 엔드포인트를 설정하는 데코레이터는 다르지 않지만 파라미터를 바인딩하는 데코레이터에는 차이가 있다.

 

Path Parameter

@Controller('boards')
export class BoardsController {

  // GET hostname:3000/boards/1
  @Get('/:id')
  getBoardById(@Param('id') id: string): Board {
    return this.boardsService.getBoardById(id);
  }
}

 

메소드 배치를 주의해서 사용해야 하는데 이런 순서대로 배치할 경우 search 도 id라는 변수의 값으로 인식하기 때문에 아래와 같은 순서대로 바꿔주어야 한다. 위에서부터 차례대로 매칭하며 내려간다고 생각하면 좋을 거 같다.

// AS-IS
@Get('/:id')
@Get('/search')

// TO-BE
@Get('/search')
@Get('/:id')

 

Query Parameter

@Controller('boards')
export class BoardsController {
    
    // POST hostname:3000/boards?title=제목&description=내용
    @Post()
    createBoard(
      @Query('title') title: string,
      @Query('description') description: string,
    ){
      this.boardsService.createBoard(title, description);
    }
}

Query 파라미터는 @Query() 데코레이터가 아닌 @Param() 데코레이터를 사용해도 정상 작동한다. 하지만 범용성 보다는 명확한 게 항상 좋은 법이기 이에 @Query 데코레이터를 사용하자.

또한 변수명이 하나이거나 같더라고 꼭 데코레이터에 인자로 변수명을 주어야하며 필요에 의해서는 직접 Pipe를 구현하여야 선언한 타입으로 값을 받을 수 있다. [NestJS 커스텀파이프로 데이터 바인딩 및 유효성 검사]

 

Request Body

@Controller('boards')
export class BoardsController {
    
    // POST localhost:3000/boards
    @Post()
    createBoard(
      @Body('title') title: string,
      @Body('description') description: string,
    ){
      return this.boardsService.createBoard(title, description);
    }

/*  DTO 방식
    @Post()
    createBoard(@Body() createBoardDto: CreateBoardDto){
      return this.boardsService.createBoard(createBoardDto);
    }
*/
}

@Body 데코레이터를 사용하며 직접 필드 하나하나를 선언해도 되지만 DTO를 파라미터로 선언하면 알아서 바인딩해 준다. [NestJS 커스텀파이프로 데이터 바인딩 및 유효성 검사]

728x90