Controllers의 역할 : 서버측으로 들어온 요청(request)를 handling하고 그에 대한 응답(response)을 클라이언트 측으로 return하기
기본적으로 컨트롤러는 특정한 요청을 받는것이다. 이 특정한 요청을 받기 위해, class와 연관된 decorator를 사용한다. 이 decorator는 요청받은 메타데이터와 클래스(Controller)를 mapping해주고 이를 바탕으로 Nest는 routing map을 만든다.
@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: '/cats'
요청을 받아, findAll()
메소드를 핸들링 할 수 있도록 mapping해준다.
위의 예제에서 findAll()메소드를 보면 string타입을 리턴하고 있다. 이러한 이유를 설명하기 위해, nest의 두가지의 response형성 방식을 알아야 한다.
findAll(@Res() response): string {
response.status(200).send();
}
팁: 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';
}
기본적으로 모든 response에 대한 상태코드는 200으로 처리된다.(post요청은 201)
상태코드를 바꿔야하는 상황들이 온다. 그럴 때 바꾸는 방법은 @HttpCode()
를 사용한다.
@Post()
@HttpCode(204)
create() {
return 'this action changes status code and adds new cat';
}
헤더를 커스텀하기 위해서는 @Header()를 이용한다.
@Post()
@Header('Cach-Control', 'none')
create() {
return 'this action changes header code and adds new cat';
}
특정 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/' };
}
}
Request에 동적으로 값을 받을 때, parameter를 이용한다.
Nests에서는 @Param()
으로 받는다.
@Get(':id')
findAll(@Param() params): string {
console.log(params.id);
return `this action returns a #${params.id} cat`;
}
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';
}
CatsController
를 모두 작성한 다음에, app.module.ts에 등록해야한다.
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
@Module({
controllers: [CatsController],
})
export class AppModule {}