TIL( Nest.js - IoC, DI )

2024. 7. 4. 23:37ใ†TIL

๐Ÿ’ก IoC, DI ๋ž€?

 

- NestJS๋Š” ๋ชจ๋“ˆ๋Ÿฌ ์•„ํ‚คํ…์ฒ˜์™€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ฑ„ํƒํ•˜์—ฌ IoC(Inversion of Control)์™€ DI(Dependency Injection)๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. IoC์™€ DI๋Š” NestJS์˜ ํ•ต์‹ฌ ์›๋ฆฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 

IoC (Inversion of Control)

 

IoC๋Š” Inversion of Control์˜ ์ค€๋ง๋กœ์„œ ์ œ์–ด ์—ญ์ „์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

์ œ์–ด์˜ ์—ญ์ „์€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ ๋ฐ ๊ทธ๋“ค์˜ ์ข…์†์„ฑ์„ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. NestJS์—์„œ๋Š” IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ์ฒด์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์ข…์†์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

( ๊ฐ์ฒด์˜ ๊ด€๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ€์„œ ์ œ์–ด ์—ญ์ „์ด๋ผ ํ•œ๋‹ค.)

 

 DI (Dependency Injection)

DI, ๋˜๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์€ ๊ฐ์ฒด๊ฐ€ ๊ทธ๋“ค์˜ ์ข…์†์„ฑ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

constructor(private readonly appService: AppService) {}

- AppService๋ฅผ AppController์— ์ฃผ์ž…ํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

 

 

•  ํ”„๋กœ๋ฐ”์ด๋” (Providers)

- ํ”„๋กœ๋ฐ”์ด๋”๋Š” NestJS์—์„œ ๊ธฐ๋ณธ์ ์ธ DI ์‹œ์Šคํ…œ ๋‹จ์œ„๋กœ, ํด๋ž˜์Šค๋‚˜ ๊ฐ’, ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

import { Injectable } from '@nestjs/common';
@Injectable()
export class CatsService {
  getCats(): string {
    return 'All cats!';
  }
}

 

๋ชจ๋“ˆ (Modules)

- ๋ชจ๋“ˆ์€ ๊ด€๋ จ๋œ ํ”„๋กœ๋ฐ”์ด๋”, ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค ๋“ฑ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋‹จ์œ„๋กœ, ๋ชจ๋“ˆ์€ @Module ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•œ๋‹ค.

import { Module } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CatsController } from './cats.controller';

@Module({
  providers: [CatsService],
  controllers: [CatsController],
})
export class CatsModule {}

 

์ปจํŠธ๋กค๋Ÿฌ (Controllers)

- ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ํ•˜๋ฉฐ, ํ•„์š”ํ•œ ์„œ๋น„์Šค๋‚˜ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)์„ ํ†ตํ•ด ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.

import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Get()
  getCats(): string {
    return this.catsService.getCats();
  }
}

 

NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

- NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฃจํŠธ ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋Š” ์ตœ์ƒ์œ„ ๋ชจ๋“ˆ์ด๋‹ค.

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule {}

- NestJS๋Š” IoC์™€ DI๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋” ์œ ์—ฐํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

 

 

 

 

 

 

'TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TIL ( Injection )  (0) 2024.07.08
TIL( NestJS - Passport )  (0) 2024.07.05
TIL (DTO)  (0) 2024.07.03
TIL( TypeScript - Utility type )  (0) 2024.07.02
TIL ( ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ - ts )  (0) 2024.07.01