ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿš€ NestJS Lazy Loading Modules – ๋ชจ๋“ˆ ์ง€์—ฐ ๋กœ๋”ฉ ์™„์ „ ๊ฐ€์ด๋“œ


NestJS์—์„œ Lazy Loading(์ง€์—ฐ ๋กœ๋”ฉ) ๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ ,
ํ•„์š”ํ•  ๋•Œ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๊ณผ ์ดˆ๊ธฐํ™” ์‹œ๊ฐ„์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์€ NestJS ๊ณต์‹ ๋ฌธ์„œ Lazy Loading Modules๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ,
์‹ค๋ฌด์—์„œ Lazy Loading์„ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก "๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์„ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์™€ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค."
Lazy Loading์„ ํ†ตํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์ดˆ๊ธฐํ™” ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… Lazy Loading์ด๋ž€?

NestJS์—์„œ๋Š” ๋ชจ๋“ˆ์„ ์ •์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ•„์š”ํ•  ๋•Œ ๋กœ๋”ฉํ•˜๋Š” **์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)**์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.


๐Ÿ’ก ์™œ Lazy Loading์ด ํ•„์š”ํ•œ๊ฐ€?

  • ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ: ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋กœ๋“œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ตœ์†Œํ™”
  • ์„ฑ๋Šฅ ํ–ฅ์ƒ: ์ดˆ๊ธฐํ™” ์‹œ๊ฐ„์„ ์ค„์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์†๋„ ๊ฐœ์„ 
  • ํšจ์œจ์ ์ธ ๋ชจ๋“ˆ ๊ด€๋ฆฌ: ํŠน์ • ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งŒ ๋ชจ๋“ˆ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ

๐Ÿ“ฆ ๊ธฐ๋ณธ ๊ตฌ์กฐ – Lazy Loading ์„ค์ •

โœ… ๋™์  ๋ชจ๋“ˆ ๋กœ๋”ฉ ํ•จ์ˆ˜

// lazy.module.ts
import { Module, DynamicModule } from '@nestjs/common';

@Module({})
export class LazyModule {
  static forRoot(): DynamicModule {
    return {
      module: LazyModule,
      providers: [
        {
          provide: 'LAZY_SERVICE',
          useValue: { message: 'Lazy loaded!' },
        },
      ],
      exports: ['LAZY_SERVICE'],
    };
  }
}

โœ… ๋ฉ”์ธ ๋ชจ๋“ˆ์—์„œ ๋™์  ๋กœ๋”ฉ

// app.module.ts
import { Module, DynamicModule } from '@nestjs/common';

@Module({
  imports: [
    LazyModule.forRoot(), // ์ง์ ‘ ํ˜ธ์ถœ
  ],
})
export class AppModule {}

โœ… Lazy Service ์‚ฌ์šฉ

@Injectable()
export class AppService {
  constructor(@Inject('LAZY_SERVICE') private lazyService: any) {}

  getLazyMessage() {
    return this.lazyService.message;
  }
}

๐Ÿ“บ ๊ด‘๊ณ 

์ด ๊ตฌ๊ฐ„์€ Lazy Loading์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ํ•ต์‹ฌ ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค.
์• ๋“œ์„ผ์Šค ๊ด‘๊ณ ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ CTR์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค.

<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>

๐Ÿ› ๏ธ ์‹ค์ „ ํ™œ์šฉ – ์š”์ฒญ ์‹œ ๋ชจ๋“ˆ ๋™์  ๋กœ๋”ฉ

โœ… AppService์—์„œ Lazy Module ๋™์  ๋กœ๋”ฉ

@Injectable()
export class AppService {
  constructor(private moduleRef: ModuleRef) {}

  async getLazyData() {
    const lazyModule = await this.moduleRef.create(LazyModule.forRoot());
    const lazyService = lazyModule.get('LAZY_SERVICE');
    return lazyService.message;
  }
}

โœ… ๋ผ์šฐํŠธ์—์„œ ํ˜ธ์ถœ

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get('lazy')
  async getLazy() {
    return this.appService.getLazyData();
  }
}

โš™๏ธ ์‹ค๋ฌด์—์„œ ์œ ์šฉํ•œ Lazy Loading ํŒจํ„ด

๋ฐ˜์‘ํ˜•

ํŒจํ„ด ์„ค๋ช…

๋Œ€๊ทœ๋ชจ ๋ชจ๋“ˆ ๋ถ„๋ฆฌ ๋Œ€ํ˜• ๋ชจ๋“ˆ์„ ์š”์ฒญ ์‹œ ๋กœ๋”ฉํ•˜์—ฌ ์ดˆ๊ธฐํ™” ์‹œ๊ฐ„ ์ ˆ๊ฐ
๋น„์ •๊ธฐ์  ์‚ฌ์šฉ ๋ชจ๋“ˆ ํŠน์ • ์ด๋ฒคํŠธ๋‚˜ ์ƒํ™ฉ์—์„œ๋งŒ ๋กœ๋”ฉ
์™ธ๋ถ€ API ์—ฐ๋™ ๋ชจ๋“ˆ API ์š”์ฒญ ์‹œ์—๋งŒ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ ๋กœ๋“œ
๋Œ€ํ˜• ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ชจ๋“ˆ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•  ๋•Œ ๋กœ๋“œ

๐Ÿ’ก ๊ณ ๊ธ‰ ๊ธฐ๋ฒ• – HTTP ์š”์ฒญ์— ๋”ฐ๋ผ ๋ชจ๋“ˆ ๋กœ๋“œ

โœ… ์กฐ๊ฑด๋ถ€ ๋กœ๋”ฉ ์„œ๋น„์Šค

@Injectable()
export class ConditionalService {
  constructor(private moduleRef: ModuleRef) {}

  async getDynamicService(type: string) {
    if (type === 'A') {
      const module = await this.moduleRef.create(LazyModule.forRoot());
      return module.get('LAZY_SERVICE');
    }
    return { message: 'Default service' };
  }
}

โœ… ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์กฐ๊ฑด๋ถ€ ํ˜ธ์ถœ

@Controller()
export class AppController {
  constructor(private readonly conditionalService: ConditionalService) {}

  @Get('dynamic/:type')
  async getDynamic(@Param('type') type: string) {
    const service = await this.conditionalService.getDynamicService(type);
    return service.message;
  }
}

๐Ÿง  Lazy Loading ์ ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. ๋ชจ๋“ˆ๊ฐ„ ์˜์กด์„ฑ ์ฃผ์˜:
    • Lazy ๋กœ๋”ฉ ๋ชจ๋“ˆ์ด ์ข…์†์„ฑ์„ ๊ฐ€์ง€๋ฉด ๋กœ๋”ฉ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ท ํ˜•:
    • ๋ชจ๋“  ๋ชจ๋“ˆ์„ Lazy๋กœ ํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์€ ์ •์  ๋กœ๋”ฉ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  3. ๋กœ๋“œ ์†๋„ ํ™•์ธ:
    • Lazy ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด ์š”์ฒญ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ‘ํ–‰ํ•˜์„ธ์š”.

โœ… Lazy Loading ๋ชจ๋“ˆ ํ™œ์šฉ ์ „๋žต

๋ชจ๋“ˆ ์œ ํ˜• ๊ถŒ์žฅ ๋กœ๋”ฉ ๋ฐฉ์‹

์ธ์ฆ ๋ชจ๋“ˆ ์ •์  ๋กœ๋”ฉ
์™ธ๋ถ€ API ๋ชจ๋“ˆ Lazy ๋กœ๋”ฉ
๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ชจ๋“ˆ Lazy ๋กœ๋”ฉ
๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ ๋ชจ๋“ˆ Lazy ๋กœ๋”ฉ
์ผ๋ฐ˜ ์„œ๋น„์Šค ๋ชจ๋“ˆ ์ •์  ๋กœ๋”ฉ

๐Ÿ”š ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

ํŠน์ง• ์„ค๋ช…

๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ์‚ฌ์šฉ ์‹œ์—๋งŒ ๋กœ๋”ฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฐฉ์ง€
๋™์  ๋กœ๋”ฉ ํŠน์ • ์ƒํ™ฉ์—์„œ๋งŒ ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”
์‹ค์‹œ๊ฐ„ ์š”์ฒญ ์ฒ˜๋ฆฌ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ๋ฐฉ์ง€
์œ ์—ฐํ•œ ๋ชจ๋“ˆ ๊ด€๋ฆฌ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ ์ฆ๋Œ€

 

NestJS Lazy Loading,NestJS ๋™์  ๋ชจ๋“ˆ ๋กœ๋”ฉ,NestJS ModuleRef,NestJS ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”,NestJS ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ์„ค๊ณ„,NestJS ๋ชจ๋“ˆ ๊ด€๋ฆฌ,NestJS Lazy Module ์‹ค์ „,NestJS ๊ณ ๊ธ‰ ๋ชจ๋“ˆ ์„ค์ •,NestJS ์„ฑ๋Šฅ ํ–ฅ์ƒ,NestJS ๋ชจ๋“ˆ ์ง€์—ฐ ๋กœ๋”ฉ


 

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•