2024.03.07 TIL -IoC와 DI

김민석·2024년 3월 8일
0

TIL

목록 보기
47/78

IoC와 DI

IoC (제어 역전)

  • IoC는 Inversion of Control의 준말로서 제어 역전이라고도 한다.

  • IoC는 개발자가 사용하고 싶은 객체를 직접 생성하는 것이 아니라 객체의 생명주기 관리 자체를 외부(여기서는 Nest.js IoC 컨테이너)에 위임을 합니다!

  • 즉, 객체의 관리를 컨테이너에 맡겨서 제어권이 넘어갔기 때문에 IoC(제어 역전)라고 하는 것


this.appService = new AppService();

위와 같이 직접 객체를 생성하면, AppController는 AppService의 구체적인 구현에 강하게 결합된다 즉, 의존하는 서비스가 변경되면 개발자도 그에 맞추어서 코드를 수정해야 됨
(자주 변경되는 서비스가 있다면 개발자는 계속 코딩해야된다는 번거로움이 생김!)

IoC원칙을 사용한다면

IoC 원칙은 모듈 간 결합도를 낮추기 때문에 하나의 모듈이 변경되어도 다른 모듈들에는 영향을 최소화되어 웹 어플리케이션을 지속 가능하고 확장성 있게 해준다!

  • IoC 원칙을 사용하면, AppController는 AppService의 구체적인 구현보다는 인터페이스나 추상 클래스에 의존하게 됩니다! 즉, 서비스 자체가 변경되어도 관계 없이 사용할 수 있음
  • 이로 인해 코드의 결합도가 감소하고, 다른 구현체로 쉽게 교체 가능!
  • 그래서 IoC원칙은 없어서는 안될 원칙이고 이걸 지원하는게 Nest.js!!

DI (의존성 주입)

  constructor(private readonly appService: AppService) {}
  • 위의 코드는 Nest.js에서 제공하는 의존성 주입 (Dependency Injection, DI) 메커니즘을 사용하여 AppService를 AppController에 주입하는 예시입니다.
  • 이렇게 함으로써 Inversion of Control (IoC) 원칙이 적용되는 것이에요! Nest.js에서는 DI 컨테이너를 사용하여 이 원칙을 구현합니다!

위 코드에서 AppService의 인스턴스는 Nest.js의 DI 컨테이너에 의해 생성되고 관리됩니다.

따라서, 개발자는 직접 new AppService()와 같이 객체를 생성하거나 관리할 필요가 없음. 이것은 코드의 결합도를 낮추고, 유연성과 테스트 용이성을 향상시킵니다!

profile
화이팅 화이팅

0개의 댓글