Guide/NestJS

NestJS 개요-컨트롤러.라우팅

Paeng 2020. 11. 8. 16:13
728x90

NestJS 개요-컨트롤러.라우팅

NestJS

컨트롤러

컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답합니다.

image

컨트롤러의 목적은 애플리케이션에 대한 특정 요청을 수신하는 것입니다. 라우팅 컨트롤러는 어떤 컨트롤러가 어떠한 요청을 받는지에 대해 제어합니다. 컨트롤러에 둘 이상의 경로가 있을 수 있으며, 서로 다른 작업을 수행하도록 할 수 있습니다.

컨트롤러를 생성하기 위해 클래스와 데코레이터를 사용합니다. 데코레이터는 요청을 컨트롤러에 연결하여 Nest가 라우팅 맵을 만들 수 있도록 합니다.

라우팅

아래 예제는 컨트롤러를 정의하는 데 필요한 @Controller() 데코레이터를 사용합니다. 데코레이터에서 경로 접두사를 사용하면 관련 경로를 쉽게 그룹화하고 코드가 반복되는 것을 최소화할 수 있습니다. 예제에서는 cats를 라우트 경로 접두사로 사용합니다.

// cats.controller.ts

import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

HINT
CLI를 사용하여 컨트롤러를 작성하려면 $ nest g controller cats 명령어를 입력하면 됩니다.

findAll() 메소드 앞에 있는 @Get() Http 요청 메소드 데코레이터는 Nest에 HTTP 요청에 대한 특정 엔드 포인트에 대한 핸들러를 생성하도록 지시합니다. 엔드 포인트는 HTTP 요청 메소드(위의 경우에는 GET 메소드) 및 라우트 경로에 해당합니다. 라우트 경로란 무엇일까요? 핸들러의 라우트 경로는 컨트롤러에 선택적으로 선언된 접두사와 요청 데코레이터에 지정된 경로를 연결하여 결정됩니다.

모든 경로(위 예제에서의 cats)에 대한 접두사를 선언하고 데코레이터에 하우 경로에 대한 정보를 추가하지 않았으므로 Nest는 GET /cats 요청을 핸들러에 매핑합니다. 언급했듯이, 경로에서는 선택정 컨트롤러 경로 접두사와 요청 메소드 데코레이터에서 선언된 경로 문자열이 모두 포함됩니다. 예를 들어, 데코레이터 @GET('profile')과 결합된 customers 경로 접두사는 GET /customers/profile과 같은 요청에 대한 경로 매핑을 생성합니다.

위의 예제에서, 엔드 포인트에 GET 요청이 있을 때 Nest는 요청을 사용자가 정의한 findAll() 메소드에 라우팅합니다. 위 예제에서의 findAll() 메소드의 이름은 임의적으로 생성된 것입니다. 경로를 바인딩할 메소드를 선언해야 하지만, Nest는 메소드 이름에 대한 의무(규칙)을 부여하지 않습니다.

이 메소드에서 200 상태코드와 관련 Response Data를 반환합니다. 위 예제의 경우 문자열을 반환합니다. 왜 이런 일이 발생할까요? 이를 설명하기 위해 먼저 Nest가 응답을 도닥하기 위해 사용하는 두 가지 옵션을 소개하겠습니다.

Standard
(추천되는 방법)
Library-specific
이 내장 메소드를 사용하면 요청 핸들러가 JavaScript 객체 또는 배열를 반환할 때 JSON으로 직렬화되어 반환됩니다. 하지만, JavaScript 기본 유형(문자열, 숫자, Boolean 값 등)을 반환하면 Nest는 직렬화를 시도하지 않고 값을 내보냅니다.
이렇게 하면 값을 반환하기만 하면 Nest가 나머지 작업을 처리하므로 응답 처리가 간단해집니다.

또한, 응답의 상태 코드 201을 사용하는 POST 요청을 제외하고는 기본적으로 항상 200 코드를 반환합니다. 핸들러 수준에서 @HttpCode(...) 데코레이터를 추가하여 이 동작을 쉽게 변경할 수 있습니다.
메소드 핸들러 서명에서 @Res 데코레이터를 사용하여 라이브러리(Ex. Express)별 response 객체를 사용할 수도 있습니다. (Ex. findAll(@Res() response))

이 접근 방식을 사용하면 해당 객체의 기본 응답 처리 방법을 사용할 수 있습니다. 예를 들어 Express를 사용하면, response.status(200).send() 코드를 사용하여 응답을 구성할 수 있습니다.

경고
두 가지 방법을 동시에 사용할 수 없습니다. Nest는 핸들러가 @Res() 또는 @Next()를 사용했을 때 이를 감지하여 라이브러리 별 옵션을 사용했음을 인식합니다.
두 방법을 동시에 사용하면 단일 경로에 대한 표준 접근 방법이 비활성화되고 정상적으로 동작하지 않습니다.


NestJS 공식 문서 번역에 대한 다른 글도 보고 싶으시다면 아래 글을 확인해주세요.
[Node/NestJS] - NestJS 공식 문서 번역 모아보기

728x90
728x90