1. Controller
Controller 란 외부(사용자)의 요청을 받는 모듈이다.
하나 이상의 클라이언트가 보내는 요청을 처리하고, 요청을 보낸 클라이언트에게 응답을 반환하는 역할을 한다.
라우팅 메커니즘
어떤 Controller가 해당 요청을 처리할지 조정한다. 보통은 각각의 Controller는 하나 이상의 경로가 있으며, 각기 다른 경로는 각기 다른 행동을 수행한다.
다음과 같이 다양한 Route 정보와 Action 정보를 담고 있는 HTTP Method 가 하나의 기능을 담당하고 있는 Controller 에 가지고 있을 것이다.
Nest 는 기본 Controller 를 생성하기 위하여 클래스와 데코레이터를 사용한다.
import { Controller, Get, Param } from '@nestjs/common'
@Controller('user')
export class UserController {
@Get(':userID')
findOne(@Param(userID) id: String): String {
return Object.assign({id, userName: '이영준'});
}
}
/user/:userID 에 Route 정보를 토대로 특정 유저 정보를 가져오는 API를 Controller 로 구현한 것이다.
@Controller() 은 이 해당 클래스가 Controller 역할을 한다는 뜻이다. 이 안에 메서드들은 @Get, @Post, @Put, @Delete 등의 HTTP Method 형태로 데코레이터를 선언할 수 있다.
의미는 직관적으로 해당 메서드는 서버에 정보를 가져오는 것인지, 상태를 바꾸는 것인지 구분하여 API 를 RESTFul 하게 작성한다.
위 코드는 prefix 로 /user 라는 context URI 를 통해 Request 파라미터를 통해 받은 :userID 정보를 가지고 서버에서 찾아 Response 해주겠다는 코드이다.
# 왜 Controller 에서도 Request - Response 를 처리할 수 있는데 app.service 를 따로 만들어서 로직을 처리할까?
프로젝트의 규모가 커지면 Controller 의 코드량이 증가하여 Clean Code 를 위해 로직은 service에 정의한다.
또한, 함수 등 재사용성이 높은 것은 service 에 정의하여 Controller 에서는 사용자의 요청만 처리하도록 한다.
DTO
Data Transfer Object.
데이터가 네트워크를 통해 전송되는 방식을 정의하는 객체이다.
다음과 같이 간결하게 작성할 수 있다.
2. Service
Provider
Provider 은 Controller 외에 Service, Repository, Factory, Helper 등의 Dependency를 Nest Core 가 Register 할 수 있도록 등록하는 곳이다.
이런 Dependency 를 등록하기 위해서는 @Injectable() 이라는 데코레이터를 선언하여 사용할 수 있다.
Service Dependency
다음은 Provider 라는 개념을 통해 Service Dependency 를 구현한 것이다.
@Injectable() 데코레이터를 통해 AppService 를 Provider 로 만든 것이다.
AppService 를 만들었고 이것을 AppController 에서 사용한다.
AppController 에서 appService 변수의 타입만 AppService 로 지정해준 것 뿐인데 어떻게 AppService 안의 메서드를 사용할 수 있는 것일까?
바로 Dependency 의 Injection 이다. (== 인스턴스화 한다)
변수의 타입을 AppService 로 지정해줌으로써 Nest Injector 가 appService 변수를 AppService 의 인스턴스로 만들어준다.
3. Module
모든 모듈은 각각 선언되어 최종적으로 하나로 취합된다.
앞서 만들었던 app.module.ts 와 user.module.ts 는 하나로 취합되어 최종적으로는 아래와 같은 형태로 병합되어야 한다.
e.g. 배달 서비스 : 로그인 모듈인 UsersModule, 주문 상태 관리 모듈 OrdersModule, 채팅 기능 모듈 ChattingModule 등 여러 개의 모듈이 모여 배달 서비스를 이룬다.
Nest Application 이 실행되기 위해서는 하나의 루트 모듈(일반적으로 AppModule)이 존재하고, 이 루트 모듈은 여러 하위 모듈로 이루어져있다.
@Module() 데코레이터를 사용한다. 또한 인자로 ModuleMetadata 를 받는다.
- imports : 이 모듈에서 사용하기 위한 Provider를 가지고 있는 다른 모듈을 가져온다. e.g. 배달 서비스에서 UsersModule, OrdersModule, ChattingModule 를 가져와 함꼐 빌드한다.
- controllers, providers : 모듈 전반에서 controller와 provider를 사용할 수 있도록 Nest 가 객체를 생성하고 주입할 수 있도록 한다.
- export : 이 모듈에서 제공하는 컴포넌트를 다른 모듈에서 import 하여 사용하기 위해서는 export 해야 한다.