framework/NextJS

๐Ÿ”„ NestJS Dynamic Modules – ์œ ์—ฐํ•œ ๋ชจ๋“ˆ ์„ค์ •์˜ ๋ํŒ์™•

octo54 2025. 4. 30. 11:03
๋ฐ˜์‘ํ˜•

๐Ÿ”„ 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 ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋ชจ๋“ˆ