๐ NestJS Dynamic Modules – ์ ์ฐํ ๋ชจ๋ ์ค์ ์ ๋ํ์
๐ NestJS Dynamic Modules – ์ ์ฐํ ๋ชจ๋ ์ค์ ์ ๋ํ์
NestJS์์ **Dynamic Module(๋์ ๋ชจ๋)**์ ๋ฐํ์์ ๋ชจ๋์ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์
๋๋ค.
์ด๋ฒ ๊ธ์ NestJS ๊ณต์ ๋ฌธ์ Dynamic Modules๋ฅผ ๊ธฐ๋ฐ์ผ๋ก
ํ๊ธ ๋ฒ์ญ + ์ค๋ฌด ์ค์ฌ์ ํด์ค์ ์ ๊ณตํฉ๋๋ค.
๋ค์ํ ์ค์ ๊ฐ, ์ธ๋ถ API ํค, ์ปค์คํ ๊ธฐ๋ฅ์ ๋ชจ๋๋ก ์ฌ์ฌ์ฉํ๋ ค๋ฉด Dynamic Module์ ์ ๋๋ก ์ดํดํด์ผ ํฉ๋๋ค.
โ Dynamic Module์ด๋?
์ ์ ์ธ ๋ชจ๋์ @Module({ ... }) ์์ ๊ณ ์ ๋ Provider์ Controller๋ฅผ ๊ฐ์ง๋๋ค.
Dynamic Module์ ๋ฐํ์์ ์ต์
์ ๋ฐ์ ๋ชจ๋ ๋ด๋ถ ๊ตฌ์ฑ(Provider, Import ๋ฑ)์ ์ ์ฐํ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
1๏ธโฃ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์์
@Module({})
export class ConfigModule {
static register(options: ConfigModuleOptions): DynamicModule {
return {
module: ConfigModule,
providers: [
{
provide: 'CONFIG_OPTIONS',
useValue: options,
},
ConfigService,
],
exports: [ConfigService],
};
}
}
- register()๋ ์ธ๋ถ์์ ํธ์ถ ๊ฐ๋ฅํ ์ ์ ๋ฉ์๋(static)
- ๋ฐํ ํ์ ์ DynamicModule
- ์ธ๋ถ์์ ๋๊ธด options๋ฅผ ๋ด๋ถ Provider๋ก ์ฃผ์ ๊ฐ๋ฅ
2๏ธโฃ ์ฌ์ฉํ๋ ์ชฝ์์ register() ํธ์ถ
@Module({
imports: [
ConfigModule.register({
envFilePath: '.env.dev',
}),
],
})
export class AppModule {}
- ์ธ๋ถ์์ ์ ๋ฌ๋ ๊ฐ์ ๋ด๋ถ์์ Provider๋ก ์ฃผ์ ๋์ด ์ฌ์ฉ ๊ฐ๋ฅ
โ ์ฃผ์ ์์
@Injectable()
export class ConfigService {
constructor(@Inject('CONFIG_OPTIONS') private options: ConfigModuleOptions) {}
get(key: string) {
return process.env[key] ?? this.options.default[key];
}
}
๋์ ๋ชจ๋์ ํ์ฉํ๋ ์ด ์์ ์ ๋๊ท๋ชจ ์๋น์ค ์ค๊ณ์์ ์ค์ํ ์์์ ๋๋ค.
์ ๋์ผ์ค ๊ด๊ณ ์ฝ์ ์์น๋ก ์ต์ ์ ๋๋ค.
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-XXXXXX"
data-ad-slot="YYYYYY"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
3๏ธโฃ Dynamic Module ๊ตฌ์กฐ ํด๋ถ
export interface DynamicModule {
module: Type<any>;
providers?: Provider[];
imports?: any[];
exports?: Provider[];
global?: boolean;
}
- module: ๋ฐ๋์ ํฌํจํด์ผ ํ๋ ํ์ฌ ๋ชจ๋ ํด๋์ค
- providers: ์ค์ ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ Provider ๋ฐฐ์ด
- imports, exports: ๋ค๋ฅธ ๋ชจ๋ ์ฐ๊ฒฐ
- global: ์ ์ญ์ผ๋ก ์ฌ์ฉํ ์ง ์ฌ๋ถ
4๏ธโฃ registerAsync() ๋ฐฉ์ – ๋น๋๊ธฐ ๊ตฌ์ฑ
์ธ๋ถ API๋ ์ค์ ํ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํด์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉ
@Module({})
export class ConfigModule {
static registerAsync(): DynamicModule {
return {
module: ConfigModule,
imports: [ExternalApiModule],
providers: [
{
provide: 'CONFIG_OPTIONS',
useFactory: async (apiService: ApiService) => {
const config = await apiService.loadConfig();
return config;
},
inject: [ApiService],
},
],
exports: ['CONFIG_OPTIONS'],
};
}
}
5๏ธโฃ ์ค๋ฌด์์ ์์ฃผ ์ฐ๋ Dynamic Module
๋ชจ๋ ์ค๋ช
ConfigModule | ํ๊ฒฝ๋ณ์/์ค์ ๊ฐ ์ฃผ์ |
DatabaseModule | ์ฐ๊ฒฐ ๋ฌธ์์ด์ ๋ฐ๋ผ DB ์ค์ |
MailModule | SMTP ์ธ์ฆ ์ ๋ณด ๋ฑ |
CacheModule | Redis ์ต์ , TTL ์ค์ ๋ฑ |
LoggerModule | ๋ก๊น ์ต์ ์ปค์คํฐ๋ง์ด์ง |
๐ง ์ค๋ฌด ํ ์์ฝ
- register()๋ฅผ ํตํด ์ต์ ๊ธฐ๋ฐ ๋ชจ๋ ๊ตฌ์ฑ ๊ฐ๋ฅ
- registerAsync()๋ ๋น๋๊ธฐ ์ด๊ธฐํ์ฉ
- ์ค์ ์ useValue, useFactory ํํ๋ก Provider์ ์ฃผ์
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํธ์ฑ ๋ชจ๋(์: ๋ก๊ทธ, API, ์บ์)์ ๋ฐ๋์ Dynamic Module๋ก ์ ์
๐ ๋ง๋ฌด๋ฆฌ ์์ฝ
๊ฐ๋ ์ค๋ช
DynamicModule | ๋ฐํ์์ ๊ตฌ์ฑ๋๋ ๋ชจ๋ |
register() | ์ค์ ๊ฐ ๊ธฐ๋ฐ ์ ์ ๊ตฌ์ฑ |
registerAsync() | ๋น๋๊ธฐ ์ด๊ธฐํ์ฉ |
useFactory | ์ค์ ๊ฐ ๋์ ์ฃผ์ |
์ค์ ์ ์ฉ | Config, DB, Cache, Mail, Logger ๋ฑ ํ์ |
NestJS Dynamic Module,NestJS register,NestJS registerAsync,NestJS useFactory ๋ชจ๋,NestJS ์ค์ ๋ชจ๋,NestJS ๋น๋๊ธฐ ๋ชจ๋,NestJS ์ฌ์ฌ์ฉ ๋ชจ๋,NestJS ๊ณ ๊ธ DI,NestJS ์ค๋ฌด ์ค๊ณ,NestJS ์ปค์คํฐ๋ง์ด์ง ๋ชจ๋