[nestjs] Controller (1)

Dev.Jo·2022년 2월 22일
0

nestjs

목록 보기
1/2
post-thumbnail

Controller

컨트롤러는 서버로 들어오는 request를 처리하고 그에 맞는 response를 응답합니다

목차

  1. decorators
    컨트롤러가 처리하는 응답에 대한 메타데이터를 설정할 수 있는 데코레이터에 대해 알아봅니다.
  2. Routing
    서버로 들어오는 요청을 처리하려면 경로에 따라 응답을 하는 라우팅에 대해 알아봅니다.
  3. HTTP request method decorator
    HTTP 요청 메서드를 처리할 수 있는 데코레이터를 알아봅니다.
  4. request handler
    라우팅을 통해 들어오는 요청을 처리하는 request handler에 대해 알아봅니다.
  5. Status Code
    응답 상태코드를 커스텀할 수 있는 방법을 알아봅니다.
  6. Headers
    응답 Header를 커스텀할 수 있는 방법을 알아봅니다.
  7. Redirection
    redirect 하는 응답을 작성하는 방법을 알아봅니다.

decorators

nestjs에서 컨트롤러를 만드려면 classdecorator를 사용합니다. decorator는 class와 메타데이터를 연결하고 라우팅을 가능하게 합니다.

간단한 컨트롤러 만들기

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

@Controller('')
export class Controller {
  
}
  • class 형태의 컨트롤러를 선언합니다.
  • @기호로 컨트롤러 데코레이터를 선언합니다.

Routing

컨트롤러는 라우팅을 통해 서버로 들어오는 request를 처리합니다.
라우트 경로를 설정하기 위해@Controller(path) 컨트롤러 데코레이터 안에 경로를 설정합니다.

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

@Controller('cats')
export class CatsController {
  
}
  • @Controller('cats') 컨트롤러는 /cats경로로 들어오는 request를 처리합니다.

HTTP request method decorator

HTTP request method 중 GET 메서드를 처리하기 위해서는 @Get() 데코레이터를 사용합니다.

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

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}
  • 서버로 GET /cats 요청이 오면 findAll() 핸들러가 처리하게 됩니다.
  • 만약 GET /cats/all 경로를 설정해주고 싶다면 @Get('all')을 해주면 됩니다.
  • 그 밖에 HTTP methods decorator는 @Get() @Post() @Put()등이 있습니다.

request handler

위 코드에서 GET /cats 요청을 처리하는 handler인 findAll() request handler를 정의했습니다.

nestjs에서 request handler는 다음과 같은 특성을 가집니다.

  • request handler의 reuturn 값이 object 또는 array라면 자동으로 JSON으로 변환하여 응답하게 됩니다.
  • return 값이 Primitive 값이라면 값 그 자체를 반환하게 됩니다.

request object

서버에서 응답을 처리하기 위해서 request의 정보를 알아야할 때가 있습니다. 이때 request object를 사용합니다. request object를 사용하기 위해서는 @Req 데코레이터가 필요합니다.


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

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

Status code

응답을 처리하는 response의 기본 상태 코드는 200입니다. (POST 요청에 대한 상태코드는 201입니다)

@HttpCode() 데코레이터를 추가하여 Status Cod를 바꿀 수 있습니다.

import {HttpCode} from '@nestjs/common'
@Post()
@HttpCode(204)  // 204 상태코드를 응답합니다
create() {
  return 'This action adds a new cat';
}

Headers

Header를 커스텀하여 응답하기 위해서는 @Header() 데코레이터를 사용합니다.

import {Header} from "@nestjs/common"
@Post()
@Header('Cache-Control', 'none')
create() {
  return 'This action adds a new cat';
}

Redirection

요청에 대해 redirect 하기 위해서는 @Redirect() 데코레이터를 사용하거나 response objectredirect()메서드를 사용합니다.

@Get()
@Redirect('https://nestjs.com', 301)
findAll(){
  return ...
}
  • @Redirect(url,statusCode) 데코레이터는 redirect할 urlstatusCode가 필요합니다.
  • statusCode를 지정하지 않는 경우 기본값은 302 상태코드로 응답됩니다.

만약 동적으로 변하는 url 또는 statusCode를 반환하고 싶다면 request handler가 다음 객체형태를 반환하도록 합니다.

{
	"url" : redirection URL,
    "statusCode" : statusCode
}

request handler가 위 객체를 반환하면 이미 선언된 @Redirect()를 오버라이드해서 값을 리턴합니다.

@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
  if (version && version === '5') {
    return { 
      url: 'https://docs.nestjs.com/v5/',
      statusCode : 301
    };
  }
}
  • Query version을 확인해 조건을 만족하면 @Redirct를 오버라이드해서 반환합니다.
profile
소프트웨어 엔지니어, 프론트엔드 개발자

0개의 댓글