NestJS Controller
애플리케이션의 관문이며 기본적으로 클래스와 데코레이터를 사용한다.

클라이언트로부터 특정 요청을 수신하고 그에 대한 응답을 반환하는 인터페이스 역할을 수행한다. 서버에서 정의한 리소스를 클라이언트와 어떤 식으로 주고받을지에 대한 정보와 데이터의 구조를 정의한다. 각각의 컨트롤러는 하나 이상의 경로(/user, /user/:userId)가 있고 각기 다른 로직을 실행할 수 있다.
- 컨트롤러 클래스 작성 후 @Controller 데코레이터를 사용해 Prefix를 명시한다.
- @Get, @Post 등 HTTP Method 데코레이터 인수로 경로(Path)를 명시한다.
다음 사용자 컨트롤러의 getUserList 메서드의 경로는 /user/user-list와 같다.
import { Controller, Get } from '@nestjs/common';
@Controller('user')
export class UserController {
@Get('user-list')
getUserList(): string {
return '사용자 목록';
}
}
사용자 컨트롤러를 필요로 하는 모듈에 등록을 해주고 해당 모듈 또한 Root 모듈에 등록한다.
// 사용자 컨트롤러를 사용할 사용자 모듈
import { Module } from '@nestjs/common';
import { UserController } from 'src/controllers';
@Module({
imports: [],
controllers: [UserController],
providers: [],
exports: [],
})
export class UserModule {}
// 사용자 모듈을 사용할 애플리케이션 모듈
import { Module } from '@nestjs/common';
import { UserModule } from 'src/modules';
@Module({
imports: [
UserModule,
],
controllers: [],
providers: [],
})
export class AppModule {}
요청 객체(@Body, @Query, @Param)
Express에 req.body, req.query, req.param과 대응된다.
@Req, @Res 데코레이터로 요청, 응답 객체에 접근할 수 있지만 과도한 유연성 허용으로 사용을 지양하는 게 좋다.
import { Controller, Body, Query, Param, Get, Post } from '@nestjs/common';
@Controller('user')
export class UserController {
@Post()
createUser(@Body() createUserDto) {
console.log(createUserDto);
}
@Get('user-list')
getUserList(@Query() getPaginationDto) {
console.log(getPaginationDto);
}
@Get(':userId')
getUserProfile(@Param('userId') userId: string) {
console.log(+userId);
}
}
응답 객체
Controller에 결과값이 배열 또는 객체일 경우 내부적으로 JSON 직렬화를 수행하며 기본 응답 상태 코드는 200이며 @HttpCode 데코레이터를 통해 별도 명시한다.
import {
Controller,
Body,
Query,
Param,
Get,
Post,
HttpCode,
} from '@nestjs/common';
@Controller('user')
export class UserController {
@HttpCode(418)
@Get('user-list')
getUserList(@Query() getPaginationDto) {
console.log(getPaginationDto);
return [
{ idx: 1, name: '사용자 1' },
{ idx: 2, name: '사용자 2' },
];
}
}

Versining
컨트롤러에 경로(Prefix)와 버전을 명시하지 않아도 setGlobalPrefix와 enableVersionig을 통해 Prefix와 버전 설정이 가능하다. 다음 코드의 API 경로는 GET /api/v1/app/version
import { NestFactory } from '@nestjs/core';
import { VersioningType } from '@nestjs/common';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.setGlobalPrefix('api');
app.enableVersioning({
defaultVersion: '1',
type: VersioningType.URI,
prefix: 'v',
});
await app.listen(3000);
}
bootstrap();
import {
Controller,
Body,
Query,
Param,
Get
} from '@nestjs/common';
@Controller('app')
export class UserController {
@Get('version')
getVersion(): string {
return 'v1';
}
}
참고
https://docs.nestjs.com/controllers
https://www.wisewiredbooks.com/nestjs/overview/02-controller-1.html
'서버 > Nest' 카테고리의 다른 글
NestJS Module (0) | 2022.12.12 |
---|---|
NestJS (0) | 2022.11.19 |