다음은 이 글의 동영상 강의입니다.
아래는 컨트롤러 실습 강의 영상입니다.
* 이글은 NestJS 홈페이지를 참조하여 작성하였습니다.
https://docs.nestjs.kr/controllers
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를 지정할 수 있습니다.
- @Get('profile')
이 경우 사용자의 요청 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에 대해 알아보았습니다.
'Nestjs 기초 동영상강좌' 카테고리의 다른 글
NestJS - 09. 회원가입 (2) | 2022.01.22 |
---|---|
NestJS - 08.TypeORM으로 MySQL Data 처리하기 (0) | 2022.01.15 |
NestJS - 07.미들웨어(Middleware) (0) | 2022.01.02 |
NestJS - 06.서비스 만들기 (프로바이더) (0) | 2021.12.24 |
NestJS - 04.소스 자동 생성기 (0) | 2021.12.18 |
NestJS - 03.NestJS 구조 이해하기 (2) | 2021.12.17 |
NestJS - 02.NestJS설치 및 프로젝트생성 (0) | 2021.12.11 |
NestJS - 01.NestJS란? (0) | 2021.12.11 |