controller는 클라이언트에서 보낸 HTTP 요청을 받아 라우팅 하며, 프로바이더에게 전달한다. 또한, 프로바이더에게 받은 응답을 다시 클라이언트에게 반환한다. @Controller() 데코레이터를 붙여 정의하는 클래스이다.
다음 예시를 보며 설명해 보겠다.
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { TestService } from './test.service';
import { CreateTestDto } from './dto/create-test.dto';
import { UpdateTestDto } from './dto/update-test.dto';
@Controller('test')
export class TestController {
constructor(private readonly testService: TestService) {}
@Post()
create(@Body() createTestDto: CreateTestDto) {
return this.testService.create(createTestDto);
}
@Get()
findAll() {
return this.testService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.testService.findOne(+id);
}
@Patch(':id')
update(@Param('id') id: string, @Body() updateTestDto: UpdateTestDto) {
return this.testService.update(+id, updateTestDto);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.testService.remove(+id);
}
}
@Controller('test')는 해당 컨트롤러가 'API/test' 경로에 대한 요청을 처리한다는 것을 의미한다.
constructor(private readonly testService: TestService) 코드는 TestService를 주입하여 testService 멤버 변수를 생성한다. 의존성 주입을 사용하여 TestService 인스턴스를 컨트롤러에 주입한다.
@Post, @ Get, @Patch, @Delete 등의 컨트롤러 메서드에 적용되는 데코레이터로 HTTP 요청 별 작업을 수행할 수 있고, () 안에 경로를 넣어 라우팅을 할 수 있다. 추가적으로 @Put() 데코레이터는 PUT 요청을 처리한다.
@Param, @Body 등의 데코레이터로는 요청에 담겨 있는 정보를 얻을 수 있다.
@Param(':id')는 경로의 ':id' 파라미터 값을 id 매개변수로 전달한다.
@Body()는 HTTP 요청의 Body에 있는 정보들을 DTO에 전달한다.
다음은 추가적인 데코레이터 중 필자가 사용해 본 데코레이터들이다.
@Headers(): HTTP 요청의 Header에 있는 정보를 전달한다.
@UploadedFile(): 멀티파트(form-data) 요청에서 파일 업로드 필드의 값을 추출하여 매개변수에 주입한다.
@Query(): 쿼리 파라미터 값을 매개변수로 주입한다.
@Res(): 클라이언트에 대한 응답을 생성하고 전송하는 데 사용되는 Express 응답 객체를 매개변수로 주입한다.
@Req(): 클라이언트로부터의 HTTP 요청에 대한 정보를 담고 있는 Express 요청 객체를 매개변수로 주입한다.
실제로는 훨씬 더 많은 데코레이터들이 있다.
간단하게 요약하자면, controller는 요청을 받아 해당 요청에 있는 데이터들을 처리해 비즈니스 로직을 담당하는 service에 넘겨준 후, 반환받은 응답을 클라이언트에게 다시 넘겨주는 역할을 한다.
'NestJS' 카테고리의 다른 글
NestJS에서 openAI API 연동으로 ChatGPT 활용하기 (0) | 2023.08.30 |
---|---|
Throttler를 사용한 Rate Limiting (0) | 2023.08.24 |
Provider (0) | 2023.07.24 |
NestJS의 프로젝트 구조 (0) | 2023.07.18 |
NestJS 소개 (0) | 2023.04.15 |