다음은 이 글의 동영상 강의입니다.
https://youtu.be/v66oRI3peh8
VIDEO
아래는 컨트롤러 실습 강의 영상입니다.
https://youtu.be/BJbL6zT16DM
VIDEO
* 이글은 NestJS 홈페이지를 참조하여 작성하였습니다.
https://docs.nestjs.kr/controllers
네스트JS 한국어 매뉴얼 사이트
네스트JS 한국, 네스트JS Korea 한국어 매뉴얼
docs.nestjs.kr
Controller의 역할
NestJS의 Controller는 Client의 request(요청)를 받아 처리한 후 response(응답)하는 역할을 합니다.
Client의 요청이 들어왔을 때 요청에 따라 처리할 Controller로 분기 처리하는 것을 Routing이라고 합니다.
@Controller()
Controller는 @Controller() 데코레이터를 사용합니다.
마지막에 사용된 () 안에는 다음과 같이 요청 라우팅 path를 지정할 수 있습니다.
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {}
이때 정의된 cats는 하위 메소드들의 접두어 역할을 하므로 반복하여 작성할 필요가 없습니다.
라우팅 path가 없을 경우에는 root path('/')로 사용됩니다.
사용 예는 다음과 같습니다.
http://localhost:3000/ => @Controller()
http://localhost:3000/cats => @Controller('cats')
Controller에서는 다음과 같이 HTTP Request Method 데코레이터를 사용할 수 있습니다.
@Get, @Post, @Put, @Delete
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
위의 @Get() 데코레이터는 Controller의 라우팅 패스를 상속 받기 때문에 Client에서는 다음과 같이 요청할 수 있습니다.
http://localhost:3000/cats
@Get() 데코레이터도 @Controller와 마찬가지로 routing path를 지정할 수 있습니다.
이 경우 사용자의 요청 URL은 다음과 같습니다.
http://localhost:/3000/cats/profile
@Get() 데코레이터 아래 선언된 Method의 이름은 어떤 의미도 부여하지 않습니다. 다만, 코드를 해석하기 쉬운 형태로 작성해 주시면 됩니다.
Method 옆에 선언된 type은 response 형식입니다.
@Get()
findAll(): string
Request 객체
NestJS는 Express를 사용하고 있으므로 인해 Request 객체를 사용할 수 있습니다.
핸들러 parameter에 @Req() 데코레이터를 사용하면 됩니다.
import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';
@Controller('cats')
export class CatsController {
@Get()
findAll(@Req() request: Request): string {
console.log(request);
return 'This action returns all cats';
}
}
Route parameters
동적 라우팅을 위해서는 매개변수를 ':'과 함께 사용할 수 있습니다.
다음은 동적 매개변수를 사용한 예입니다.
@Get(':id')
findOne(@Param() params): string {
console.log(params.id);
return `This action returns a #${params.id} cat`;
}
만약 id가 1일 경우 호출 url은 다음과 같습니다.
http://localhost:3000/cats/1
매개 변수는 @Param() 데코레이터로 받아서 처리하면 됩니다.
위에서는 params.id로 라우팅 매개변수 값을 추출할 수 있습니다.
다음과 같은 방법으로도 처리할 수 있습니다.
@Get(':id')
findOne(@Param('id') id: string): string {
return `This action returns a #${id} cat`;
}
비동기 처리
비동기 함수는 아래 예제와 같이 Promise를 반환해야 합니다.
@Get()
async findAll(): Promise<any[]> {
return [];
}
Post의 Body DTO
Post 라우트 핸들러에서는 @Body() 데코레이터를 사용할 수 있습니다.
이때 DTO 스키마 클래스를 생성해서 데이터를 처리할 수 있습니다.
다음은 DTO를 사용한 예제입니다.
export class CreateCatDto {
name: string;
age: number;
breed: string;
}
해당 DTO를 Controller에서 사용하는 방법은 다음과 같습니다.
@Post()
async create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
일반적인 API의 구조를 모두 포함한 예제는 다음과 같습니다.
findAll : 전체 데이터 목록 조회
findOne : 데이터 상세 조회
create : 데이터 생성
update : 데이터 수정
remove : 데이터 삭제
import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';
@Controller('cats')
export class CatsController {
@Post()
create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
@Get()
findAll(@Query() query: ListAllEntities) {
return `This action returns all cats (limit: ${query.limit} items)`;
}
@Get(':id')
findOne(@Param('id') id: string) {
return `This action returns a #${id} cat`;
}
@Put(':id')
update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
return `This action updates a #${id} cat`;
}
@Delete(':id')
remove(@Param('id') id: string) {
return `This action removes a #${id} cat`;
}
}
이상으로 nestjs의 controller에 대해 알아보았습니다.