티스토리 뷰
개인적인 공부를 위해 공식문서를 읽고 저의 해석을 곁들였습니다.
틀린 부분이 있다면 언제든 피드백 환영입니다.
컨트롤러의 정의
컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 일을 담당합니다. 컨트롤러는 바로 응용프로그램에 대한 특정 요청을 받는 것으로 자신의 역할을 시작합니다.
라우팅
Controller는 경로를 지정해주는 라우터라고 생각하시면 편할 것 같습니다.
class 상단에 @Controller() 라는 데코레이터만 작성해주시면 Nest.js가 Controller라는 것을 알아차리게 됩니다.
또한 @Controller('user')와 같이 Contorller 데코레이터 소괄호 안에 prefix를 넣으면 경로 집합을 쉽게 그룹화도 가능합니다.
자세한 내용은 아래 예제와 같이 살펴보도록 하겠습니다.
import { Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('abc')
export class AppController {
@Get('hello') // GET /abc/hello
getHello(): string {
return 'this.appService.getHello()';
}
@Post('hi') // POST /abc/hi
postHello(): string {
return this.appService.getHello();
}
}
공통 주소로 사용할 것은 Controller 데코레이터 소괄호 안에, 세부적인 주소는 @Get, @Post 등과 같은 데코레이터 안에 작성해주시면 됩니다. 이제 위 예제에서는 /abc/hello 라는 경로에 GET 요청을, /abc/hi 라는 경로에는 POST 요청을 보낼 수 있습니다.
데코레이터를 이용해서 라우팅을 편하게 관리할 수 있고, AppController 내에 있는 메서드들에 있는 함수들은 선언만 해도 네스트가 알아서 연결해주어 매우 편리하네요!
Request object
때때로는 클라이언트 요청 세부 정보에 액세스해야 할 경우도 있습니다! Nest는 기본 플랫폼의 request object에 대한 액세스를 제공합니다. 아래 예제와 같이 데코레이터를 추가하여 request object에 액세스할 수 있습니다.
import { Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';
import { Request } from 'express';
@Controller('abc')
export class AppController {
@Get('hello') // GET /abc/hello
getHello(@Req() request: Request): string {
return 'this.appService.getHello()';
}
}
request object는 HTTP 요청을 나타내며 요청 쿼리 문자열, 매개 변수, HTTP 헤더 및 본문에 대한 속성을 가지고 있습니다.
아래의 사진을 통해 기존의 express 및 fastify에서의 지식을 토대로 데코레이터를 사용하시면 됩니다!
상태 코드
응답 상태 코드는 201인 POST 요청을 제외하고 기본적으로 항상 200입니다. 그러나 우리는 때때로 응답코드를 200 혹은 201이 아닌 코드가 필요할 수 있습니다! 이때는 @HttpCode 데코레이터를 추가하여 이 동작을 쉽게 변경할 수 있습니다.
@Post()
@HttpCode(204)
create() {
return 'This action adds a new record';
}
Route parameters
지금까지 우리는 정적인 경로에 대한 케이스만 보았습니다! 그러나 요청 경로의 경우에는 늘 정적인 것이 아니라 동적인 경우도 있죠! 그럴 때는 토큰(':') 하나를 추가하여 동적인 경로에 대한 케이스를 대비할 수 있습니다.
@Get(':id')
findOne(@Param() params: any): string {
console.log(params.id);
return `This action returns a #${params.id}`;
}
여기서 @Param()은 메서드 매개 변수를 데코레이팅하는 데 사용되며, findOne 메서드 내에서 사용할 수 있도록 도와줍니다!
시작 및 실행
위처럼 컨트롤러를 정의해놓아도 Nest는 해당 컨트롤러의 존재 유무를 전혀 알 수 없습니다. 따라서 결과적으로 Nest는 해당 컨트롤러 클래스의 인스턴스를 생성하지 않게 됩니다! 컨트롤러는 항상 모듈에 속하기 때문에 우리는 app.module.ts 파일에 들어가서 데코레이터 내에 배열을 포함시킬 것입니다.
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
controllers: [AppController],
})
export class AppModule {}
위 예제와 같이 데코레이터를 사용하여 메타데이터를 모듈 클래스에 연결하였으며, 이제 Nest는 마운트해야하는 컨트롤러를 쉽게 반영할 수 있게 되었습니다!
- Total
- Today
- Yesterday