2023. 4. 5. 16:38ㆍ개발 관련 책 읽기/NestJS로 배우는 백엔드 프로그래밍
✅ 아래 내용들에 대해서 알아보자
- 모듈
- 동적 모듈
- dotenv 직접 사용해 보자
- @nestjs/config 직접 사용해 보자
모듈
모듈은 여러 컴포넌트를 조합하여 좀 더 큰 작업을 수행할 수 있게 하는 단위를 말한다. 예를 들어 주문, 유저, 채팅 모듈 등..
Nest에서는 애플리케이션이 실행되기 위해 하나의 루트 모듈이 존재하고 이 루트 모듈은 다른 모듈들로 구성된다.
이렇게 모듈을 나누는 이유는 모듈 내의 응집도를 높이고 모듈 간의 결합도를 나눠 추후 MSA 아키텍처 분리할 수 있다는 장점이 있다.
@Module 데커레이터를 사용하여 Modulemetadata를 인수로 받는다. 모듈은 순환 종속성(참조)이 발생할 수 있기 프로바이더처럼 주입해서 사용할 수 없다.
@Module({
imports: [UserModule],
controllers: [AppController],
providers: [AppService, EmailService],
})
export class AppModule {}
- import : 이 모듈에서 사용하기 위한 프로바이더를 가지고 있는 다른 모듈을 가져온다. 예를 들면 UserModule, OrderModule을 가져와서 함께 빌드한다.
- controllers / providers : 모듈 전반에서 컨트롤러와 프로바이더(스프링에서 Service 클래스)를 사용할 수 있도록 Nest가 객체를 생성하고 주입할 수 있게 해 준다.
- export : 해당 모듈에서 사용하는 다른 모듈을 내보낼 때 사용. 아래 코드를 참고하자.
//A 모듈
@Module(
imports:[B],
exprots:[B] //C 모듈이 B 모듈 사용하고 싶을 때
....
)
//B 모듈
@Module{
...
}
//C
@Module(
imports:[A],
....
)
App, User, Email 모듈 간의 모듈 분리를 코드로 보자.
App이 UserModule을 import 하고 있으며, UserModule은 EmailModule을 import를 하고 있고 EmailModule은 Email 프로바이더를 exports 하여 제공하고 있다.
각 모듈 별 분리하여 필요한 컴포넌트를 상호작용하여 사용하고 있는 구조이다.
//email.module
@Module({
exports: [EmailService],
providers: [EmailService],
})
export class EmailModule {}
//user module
@Module({
imports: [EmailModule],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
//app.module
@Module({
imports: [UserModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
동적 모듈
위의 모듈 설정들은 정적 모듈을 사용하여 구성하였다. 반면 동적 모듈은 호스트 모듈(프로바이더, 컨트롤러 등의 컴포넌트)을 가져다 쓰는 소비 모듈에서 호스트 모듈을 생성할 때 동적으로 값을 설정하는 방식이다.
동적 모듈의 대표적인 예로 Config 모듈이 있으며, Config 모듈은 실행 환경에 따라 서버에 설정되는 환경 변수를 관리하는 모듈이다.
Node.js 에서는 dtoenv라는 라이브러리를 통해 로컬, 스테이징, 프로덕션 환경을 구성할 수 있다.
각 환경 변수를. env 확장자를 가진 파일에 저장해 두고 서버가 구동될 때 이 파일을 읽어 해당 값을 환경 변수로 설정해 주는 역할을 한다.
npm i --save dotenv
npm i --save-dev @types/dotenv
dotenv 직접 사용해 보기!
1. .development.env 파일을 아래처럼 만든다.(스테이징, 프로덕션들도 추가해서 만든다)
DATABASE_HOST=develop-reader.dextto.com
2. package.json 파일로 가서 아래 부분 추가
"prebuild": "rimrag dist",
"start_dev": "npm run prebuild && NODE_ENV=development nest start --watch",
3. main.ts 가서 해당 부분 추가 한다.
dotenv.config({
path: path.resolve(
process.env.NODE_ENV === 'production'
? '.production.env'
: process.env.NODE_ENV === 'stage'
? '.stage.env'
: '.development.env',
),
});
4. main.ts 가서 해당 부분 추가 후 테스트 진행
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return process.env.DATABASE_HOST;
}
}
설정한 값이 출력이 된다!
@nestjs/config 직접 사용해 보자
1. 먼저, nestjs/config를 설치하자.
npm i --save @nestjs/config
2. AppModule로 가서 설정을 한다.
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
UserModule,
ConfigModule.forRoot({
envFilePath: '.development.env',
}),
],
controllers: [AppController],
providers: [AppService, ConfigService],
})
export class AppModule {}
3. AppController에 가서 추가 후 테스트 해보자!
@Get('/db-host-from-config')
getDatabaseHostFromConfigService(): string {
return this.configService.get('DATABASE_HOST');
}
'개발 관련 책 읽기 > NestJS로 배우는 백엔드 프로그래밍' 카테고리의 다른 글
7장, 8장 - 파이프, 영속화 (0) | 2023.04.06 |
---|---|
4장 - 프로바이더 (0) | 2023.04.04 |
3장 - Hello NestJS (0) | 2023.04.04 |
1장 - Hello NestJS (0) | 2023.04.03 |