Module 이란
Nest.js
에서는 Module
은 하나의 애플리케이션을 담당을 하고 있다고 볼 수 있습니다. MSA(Micro Service Architeture)
가 인기있는 요즘 이러한 Module
을 기준으로 구분하여 분리 할 수 있도록 의존성을 구분하면 좀 더 관리가 용이한 서비스가 나올 것입니다. 그렇다면 이러한 Module
의 구성은 어떻게 되는지 알아보도록 하겠습니다.
구성
Module
은 데코레이터를 통해 정의 할 수 있습니다. 그리고 설정 되는 값은 크게 아래 4개로 나뉘어 집니다.
Controllers
: 요청을 처리하고 응답을 반환하는 로직을 담당합니다.Providers
: 다양한 형태의 서비스, 리포지토리, 팩토리 등을 포함하며, 이들은 주입을 통해 컨트롤러나 다른 프로바이더에 사용됩니다.Imports
: 다른 모듈에서 제공하는 프로바이더나 컴포넌트를 현재 모듈에서 사용하기 위해 임포트합니다.Exports
: 모듈이 제공하는 프로바이더를 외부에 공개하여 다른 모듈에서 사용할 수 있도록 합니다.
@Module({
imports: [TypeOrmModule.forFeature([User])],
exports: [UserService],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
환경 변수 동적 할당
이러한 Module
에 의존성을 주입할 때는 리터럴(literal)
을 하드 코딩하는 것이 아닌 환경변수로 값들을 제공하고 사용해야 합니다. 환경변수 중에서는 인증관련된 내용, DB
관련된 내용, 서버에 관련된 내용 등 다양한 카테고리들이 존재하게 됩니다. 여러가지 종류의 변수를 하나의 환경변수 파일로 제공하게 되면 관리에 어려움이 존재 할 수 있습니다. 그렇기에 이러한 값들을 분리하고 동적으로 할당하는 방식을 nest.js
에서 제공하고 있습니다.
패키지 설치
npm i --save @nestjs/config
설정값 입력
app.module.ts
에 설정을 추가를 해주도록 하겠습니다.
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [postgresConfig, jwtConfig],
}),
...
],
})
export class AppModule {}
여기서 눈여겨 볼 것은 load
배열입니다. load
배열에 입력을 해둔 config
값들은 서버가 구동시 우선 가져오는 값들이 될 것 입니다.
다음은 /src/config/postres.config.ts
파일 입력 값입니다.
export default registerAs('postgres', () => ({
host: process.env.POSTGRES_HOST || 'localhost',
port: Number(process.env.POSTGRES_PORT) || 5434,
username: process.env.POSTGRES_USERNAME || 'postgres',
password: process.env.POSTGRES_PASSWORD || 'postgres',
database: process.env.POSTGRES_DATABASE || 'postgres',
}));
이렇게 입력된 값을 다시 app.module.ts
에서 사용을 해주면 동적 할당 작업은 마무리 되었습니다.
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: async (configService: ConfigService) => {
let obj: TypeOrmModuleOptions = {
type: 'postgres',
host: configService.get('postgres.host'),
port: configService.get('postgres.port'),
username: configService.get('postgres.username'),
password: configService.get('postgres.password'),
database: configService.get('postgres.database'),
autoLoadEntities: true,
};
if (configService.get('STAGE') === 'local') {
console.info('Sync postgres');
obj = Object.assign(obj, {
synchronize: true,
logging: true,
});
}
return obj;
},
}),
코드 | 설명 |
inject: [] |
설정에 필요한 의존성을 주입 받는 옵션 |
useFactory |
동적으로 Module을 지정하기 위한 옵션 |
async (configService) => {} |
입력 받은 configService의 값을 사용하여 Module 설정 |
if (configService.get('STAGE')) |
현재 어플리케이션이 DEV인지 PRODUCTION인지에 따라 투차적인 옵션 지정. |
'Backend > Nest.js' 카테고리의 다른 글
Nest.js Swagger 보안 설정 (0) | 2023.09.30 |
---|---|
Nest.js bcrypt (hashing) (0) | 2023.09.27 |
Nest.js Provider (0) | 2023.09.26 |
Nest.js Swagger Bearer 인증 적용 (1) | 2023.09.26 |
Nest.js Security Jwt strategy 적용 (0) | 2023.09.26 |