NestJS의 controllers 파일에 대한 공부 기록이다.
Controllers
기능
Controllers는 client의 request를 받고, response를 제공하는 역할을 한다.
client의 요청 url router를 분리하는 기능도 한다.
위의 사진에서 볼 수 있듯 client의 request를 Controller에서 받고 있다.
구조
Controller에서 Client의 요청을 받은 후에는 어떻게 될까?
이 요청에 대한 응답을 제공하고, 비즈니스 로직을 수행해야 한다.
요청 라우터 분리와 응답 제공이 Controller의 역할이다.
이후 비즈니스 로직은 Service 파일에서 수행한다.
이제 전체적인 구조를 그릴 수 있다.
- 각 부품 module에서는 Controller를 이용해 라우터를 분리하고, 응답을 반환한다.
- 클라이언트의 요청에 대한 비즈니스 로직을 Service에서 처리하고, 이에 대한 응답을 반환한다.
- Service에서 반환된 응답을 Controller에서 다시 제공한다.
- 위의 과정이 이루어지는 부품 module들을 app module에서 조합해 하나로 만든다.
코드
이제 초기 프로젝트의 코드를 이해할 수 있다.
import {Controller, Get} from '@nestjs/common';
import {AppService} from './app.service';
@Controller()
export class AppController{
constructor(private readonly appService:AppService){}
@Get()
getHello():string{
return this.appService.getHello();
}
}
- Nest에서는 @를 사용하는 데코레이터를 사용하는데 이에 대한 기록은 자세하게 따로 하기로 하자.
- 위의 전체적인 구조를 적용시키면, app module에서 위의 controller 파일을 가져왔을 것이다. Controller 파일에서는 위와 같이 Appservice를 가져와서 비즈니스 로직을 수행한다.
- 전체적인 구조를 익혔으니, 라우터 분리, client request 반영에 집중해보자.
Routing
위의 코드에서 Routing 하는 부분은 아래와 같다.
@Controller()
Controller 데코레이터를 이용해 라우팅을 한다.
인자로 아무것도 전달하지 않은 이유는 root route의 요청을 받는 것이기 때문이다.
Generate Controllers
그렇다면 직접 Controller 파일을 만들어 routing 해보자
todos Controller을 만들 것이다.
앞서 언급한 대로 todos는 하나의 부품 모듈이 될 것이다.
그럼 todos module을 먼저 만들고, Controller를 만드는 것이 맞는 것 같다.
nest cli를 이용해 module을 만들어보자.
$nest generate module
$nest g mo
이후에 이름을 입력하라고 나오는데 todos로 생성해주면 된다.
생성하면 자동으로 app module의 imports에 TodosModule이 들어가고, todos dir가 생성된다.
이제 Contoller를 만들어주자.
$nest generate controller
$nest g co
이후에 이름은 위와 같이 todos로 생성해준다.
생성하면 자동으로 todos module에 controllers에 TodosController가 들어가는 것을 볼 수 있다.
TodosController 파일을 보자.
import { Controller } from '@nestjs/common';
@Controller('todos')
export class TodosController {}
@Controller 데코레이터에 'todos' 인자가 전달된 것을 볼 수 있다.
위에서 말한 대로 @Controller 데코레이터는 Entry Point를 지정한다.
이제 유저가
http://localhost:3000/todos
를 Entry Point로 한 요청을 했을 때의 Control을 위 파일에서 하는 것이다.
Request
client는 server의 resource의 상태를 변경하고 조회하는 등의 요청을 보낸다.
이 요청을 지정해주는 것도 Controller의 역할이다.
비즈니스 로직은 Service 파일에서 하기 때문에
이번 기록에서는 각 Route에 사용자 요청 지정, 반영에 집중하자.
client가 todos 목록을 조회한다고 해보자.
전체 todos를 조회할 수도 있고, 하나의 todo를 조회할 수도 있다.
먼저 전체 todos를 조회하는 요청을 만들어보자.
@Controller('todos')
export class TodosController {
@Get()
getAll(){
return 'All Todos';
}
}
- 요청 형태를 Get으로 지정해주고, 문자열을 반환했다.
- Post man으로 해당 요청을 보내보자.
$npm run start:dev
위의 명령어로 서버를 실행하고,
postman에 요청을 보내면
위와 같이 정상적으로 응답이 간 것을 볼 수 있다.
하나의 todo를 조회하는 요청도 만들어보자.
@Get('/:id')
getOne(@Param('id') id: string): string {
return `todo id : ${id}`;
}
- 위와 같이 Get 데코레이터 인자로 Entry Point이후의 urI를 전달할 수 있다.
- Param 데코레이터로 id를 받고, id를 응답으로 보내주자.
정상적으로 id를 받아온 것을 볼 수 있다.
Param 데코레이터 외에도 Body, Query 등 사용자의 요청을 반영할 수 있는 데코레이터가 있다.
- @Body : request body를 받아옴
- @Query : request query를 받아옴
import {
Controller,
Get,
Param,
Post,
Delete,
Patch,
Body,
} from '@nestjs/common';
@Controller('todos')
export class TodosController {
@Get()
getAll() {
return 'All Todos';
}
@Get('/:id')
getOne(@Param('id') id: string): string {
return `todo id : ${id}`;
}
@Post()
create(@Body() todoData) {
return `create todo : ${todoData}`;
}
@Delete('/:id')
remove(@Param('id') id: string) {
return `delete todo id : ${id}`;
}
@Patch('/:id')
patch(@Param('id') id: string, @Body() todoData) {
return `update todo : ${id}`;
}
}
todos 요청들을 간단하게 만들어봤다.
출처
마치며
잘못된 정보에 대한 피드백은 환영입니다.
감사합니다.
'Backend > NestJS' 카테고리의 다른 글
[NestJS Overview] NestJS jest로 테스트하기(2) (e2e testing) (1) | 2022.12.09 |
---|---|
[NestJS Overview] NestJS jest로 테스트하기(1) (unit testing) (0) | 2022.12.07 |
[NestJS Overview] NestJS DTO 생성, 유효성 검사 해보기 (0) | 2022.12.07 |
[NestJS Overview] Service.ts(서비스 파일, 반환 클래스, 예외처리) (0) | 2022.12.07 |
[NestJS Overview] NestJS 시작하기(NestJS 프로젝트 시작, 구성) (0) | 2022.12.07 |