[nestJS] Controller

CheolHyeon Park·2021년 2월 15일
0

nestJS

목록 보기
1/1

Controllers의 역할 : 서버측으로 들어온 요청(request)를 handling하고 그에 대한 응답(response)을 클라이언트 측으로 return하기

기본적으로 컨트롤러는 특정한 요청을 받는것이다. 이 특정한 요청을 받기 위해, class와 연관된 decorator를 사용한다. 이 decorator는 요청받은 메타데이터와 클래스(Controller)를 mapping해주고 이를 바탕으로 Nest는 routing map을 만든다.

@Controller() 데코레이터

@Controller() 데코레이터는 연관된 라우팅의 그룹핑을 쉽게 만들어 준다.

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

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

@Controller('cats') 은 라우팅 '/cats' 으로 들어온 라우팅을 컨트롤하는 컨트롤러이다.

$ nest g controller cat CLI로 Controller를 만든다.

@Get() 데코레이터

@Get() 데코레이터는 Get 요청에 대한 핸들링을 한다. 즉, 위의 예제를 기준으로 설명하면

라우팅 GET: '/cats' 요청을 받아, findAll() 메소드를 핸들링 할 수 있도록 mapping해준다.

위의 예제에서 findAll()메소드를 보면 string타입을 리턴하고 있다. 이러한 이유를 설명하기 위해, nest의 두가지의 response형성 방식을 알아야 한다.

Response

  1. Standard 방식
    request에 대한 response를 javascript object나, array로 리턴한다면 nest는 JSON형식으로 포장한다. 하지만, js의 primitive type(string, number, boolean)으로 리턴하게 되면 값 그대로를 리턴하게 되어,serialize하지 않는다. 즉, 간단한 response를 구성할 수 있다. (권장됨)
  2. Library-specific
    Express response object를 이용하는것이다. @Res() 로 주입받고, 주입받은 객체로 response를 핸들링하게 된다.
findAll(@Res() response): string {
	response.status(200).send();
}

Request

팁: express를 사용하기 위해 @types/express 패키지를 설치하면 좋다.

request요청에 대한 처리를 하기 위해, @Req() 를 사용한다.

그 외 @Req, @Res, @Body... 등등 여러가지 decorator들이 존재한다.

커스텀 데코레이터도 만들 수 있다.

또한, resource를 다루기 위해, @Post, @Delete등 과 같은 데코레이터를 제공한다. 모든 HTTP 요청을 받을 수 있는 All()도 존재

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

@Controller('cats')
export class CatsController {
	@Post()
	create(): string {
		return 'this action adds new cat';
	}

Status code

기본적으로 모든 response에 대한 상태코드는 200으로 처리된다.(post요청은 201)

상태코드를 바꿔야하는 상황들이 온다. 그럴 때 바꾸는 방법은 @HttpCode()를 사용한다.

@Post()
@HttpCode(204)
create() {
	return 'this action changes status code and adds new cat';
}

Headers

헤더를 커스텀하기 위해서는 @Header()를 이용한다.

@Post()
@Header('Cach-Control', 'none')
create() {
	return 'this action changes header code and adds new cat';
}

Redirection

특정 URL에 대한, redirection을 수행할 때 이용한다.

res.redirect()를 직접적으로 요청해도 된다.

@Get()
@Redirect('https://nestjs.com', 301) // 기본값은 302

때에 따라, 동적으로 status code를 결정하고 싶을 때는,

{
	"url": string,
	"statusCode": number,
}

위와 같은 객체를 반환하면 된다. 그러면 받은 arguments에 오버라이딩하여 처리한다.

@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
	if(version && version === '5')
		return {url: 'https://docs.nestjs.com/v5/' };
	}
}

Route parameters

Request에 동적으로 값을 받을 때, parameter를 이용한다.

Nests에서는 @Param()으로 받는다.

@Get(':id')
findAll(@Param() params): string {
	console.log(params.id);
	return `this action returns a #${params.id} cat`;
}

Request payloads

Post요청이 들어왔을 때, body에 담긴 내용을 처리해야한다. Body에 대한 처리를 하기 위해

@Body()를 이용한다.

그 전에, typescript를 사용하는 nestjs는 우선 DTO를 만들어 타입을 선언해줘야한다.

보통의 경우 interface를 이용하지만 nestjs에서는 class가 권장된다.

→ Interface는 transpiration때 제거 되기 때문에 runtime에 참조하지 못한다. 즉, 메타타입에 대한 처리가 보장되지 않는다.

export class CreateCatDto {
	name: string;
	age: number;
	breed: string;
}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
	return 'this action adds a new cat';
}

Getting up and running


CatsController 를 모두 작성한 다음에, app.module.ts에 등록해야한다.

import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';

@Module({
  controllers: [CatsController],
})
export class AppModule {}

출처: https://docs.nestjs.com/controllers

profile
나무아래에 앉아, 코딩하는 개발자가 되고 싶은 박철현 블로그입니다.

0개의 댓글