DI (Dependency Injection) : 의존성 주입 

  • 객체 지향 프로그래밍에서 중요한 디자인 패턴 중 하나
  • 객체가 필요로 하는 의존 객체를 외부에서 주입하하여 객체 간의 결합도를 낮추는 방식

 

사용하는 이유

의존성 주입을 통해 객체는 자신이 사용할 의존 객체를 직접 생성하지 않고, 외부에서 생성된 객체를 주입받기 때문입니다.

이로 인해 객체는 자신의 구현에만 집중할 수 있으며, 변경에 유연하게 대응할 수 있습니다.

 

장점

코드의 재사용성 증가, 코드의 유지보수성 향상, 객체 간의 결합도 감소, 단위 테스트 용이성 증가

 

 

 

Nest.js 에서 DI 하는 방법

  • DI는 의존성을 “런타임”시점에 주입시켜주는 기술
  • TypeScript는 컴파일 시점에만 인터페이스가 존재하고 “런타임” 시점에는 인터페이스가 사라지게 된다

→ DI컨테이너가 런타임 시점에 의존성을 주입시켜주지 못 해서 에러발생

 

프로바이더를 모듈에 등록할때 사용자 지정 프로바이더 문자열 토큰 주입 방식으로 해결

 

export interface TestRepository {
   outputText(text: string): void;
}
@Injectable()
export class TestConsoleLog implements TestRpository {
  outputText(text: string): void {
    console.log(text);
  }
}
@Module({
  imports: [TypeOrmModule.forFeature([Test])],
  controllers: [WorkoutLogController],
  providers: [TestService, 
         // provide에 문자열 토큰 지정
         { provide: 'test', useClass: TestConsoleLog }
         ],
})

    

@Injectable()
export class TestService {
  constructor(
    @Inject('test') //// Inject 데코레이터 사용해서 porivde에 등록한 문자열 토큰 사용
    readonly testRepository: TestRepository,
  ) {}
  
  outputMessage(message: string): void{
    this.testRepository.printText(message);
  }
  
}

 

문자열 토큰방식으로 프로바이더를 등록 후 의존하고 있는 인터페이스에 @Inject('등록한 문자열 토큰') 데코레이터를 달아주면 useClass에 명시한 구현체가 주입된다.

 

 

참고 자료

f-lab -스프링 프레임워크와 의존성 주입(DI) 이해하기

median - NestJS 인터페이스로 DI하기

+ Recent posts