NestJS의 가장 기본적인 구성요소들을 알아보자
NestJS는 상당히 구조가 잘 잡힌 프레임워크다.
DI(Dependency Injection)을 권장하고 있어서 그런지 스프링과 비슷한 느낌을 준다.
처음 프로젝트를 생성하면 나오는 파일들을 다시 한 번 가볍게 살펴보자.
- main.ts
- 프로그램 엔트리 파일
- NestFactory를 통해 Nest Application 인스턴스를 생성한다
- app.module.ts
- Nest Application의 root 모듈
- main.ts에서 인스턴스 생성에 사용한다
- app.controller.ts
- 최초에 생성해주는 컨트롤러
- Request를 받아주는 역할
- app.service.ts
- 최초에 생성해주는 서비스 (Provider로 분류된다)
- 비즈니스 로직을 컴포넌트화 하여 분리하는 역할
- app.controller.spec.ts
- 유닛 테스트를 위한 파일. 지금은 신경쓰지 말자.
[Module]
클래스에 @Module() 데코레이터를 붙여서 선언한다.
모든 Nest 어플리케이션은 최소 한 개의 root 모듈을 가진다.
Root 모듈 하나로도 어플리케이션 구성은 가능하다.
하지만 컴포넌트들을 구조화하기 위해 기능과 역할에 맞춰 모듈화 해주는 것이 좋다.
ex) AuthModule, UserModule, OrderModule, ChatModule, etc.
@Module() 데코레이터는 모듈의 속성을 표현하는 한 개의 객체를 인자로 받는다.
@Module({
imports: [],
controllers: [],
providers: [],
exports: [],
})
- imports
- 현재 모듈에서 import할 Module들을 포함하는 배열
- import 할 모듈들은 현재 모듈에서 사용할 Provider를 export 해줘야한다
- controllers
- 이 모듈에서 사용할 Controller들을 포함하는 배열
- 현재 모듈이 Root 모듈에 import 되면 Nest에 의해 Route Endpoint로서 기능한다
- providers
- 현재 모듈에 집어넣을 Provider들을 포함하는 배열
- Provider들은 모듈 안에 캡슐화되므로 현재 모듈 밖에서 사용하려면 export 해줘야한다
- exports
- 현재 모듈에 지정한 providers 배열의 subset.
- 다른 모듈에서 import 하여 사용할 Provider들을 포함하는 배열
예를 들어 UserModule을 만든다고 생각해보자.
// user.module.ts
@Module({
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}
위와 같은 코드가 나올 수 있을 것이다.
- import 할 모듈이 없기 때문에 imports 속성은 넣지 않았다
- UserController, UserService를 모듈에 넣었다
- UserService를 export 하면 다른 모듈에 UserModule을 import 하여 UserService에 접근할 수 있다.
이렇게 UserModule을 만들었다면, Root 모듈에 import까지 해주어야 정상적으로 동작한다.
(만약 nest-cli를 이용하여 module의 보일러플레이트를 생성했다면 자동으로 추가되었을 것이다)
// app.module.ts
@Module({
imports: [UserModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Nest-CLI로 모듈 생성하기
$ nest generate module user
또는
$ nest g mo user
[NestJS] Modules & Controllers & Providers (2) 에서 이어집니다.
'개발공부 > NestJS' 카테고리의 다른 글
[NestJS] Controller로 Request를 받아보자! (0) | 2021.09.11 |
---|---|
[NestJS] Modules & Controllers & Providers (3) (0) | 2021.09.11 |
[NestJS] Modules & Controllers & Providers (2) (0) | 2021.09.11 |
[NestJS] Express vs. Fastify? (2) | 2021.09.10 |
NestJS 설치 (0) | 2021.04.23 |