Java/Spring

[Spring] DI, IoC 컨테이너

SeungbeomKim 2023. 8. 3. 16:42

DI, IoC, 컨테이너와 같은 개념들은 Spring Framework의 가장 기본적인 특징입니다. 

 

1. IoC(Inversion of Control, 제어의 역전)

  • 프로그램의 제어 흐름을 프로그래머가 직접적으로 제어하는 것이 아니라, 외부에서 관리하는 것
  • 프로그래머가 객체를 생성할 때, 직접 생성하는 것이 아니라 스프링 컨테이너에서 생성하고 등록된 객체(Bean)를 가져오는 것입니다. 
  • 즉, 제어권을 본인이 아닌, 프레임워크(Spring 컨테이너)에게 넘겨줬기 때문에 IoC라는 개념이 도입됐습니다.

2. DI(Dependency Injection, 의존관계 주입)

  • 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고, 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것 
  • Spring 컨테이너가 DI 컨테이너에 등록된 Bean 정보를 바탕으로 의존관계를 주입합니다. 
  • 어떠한 클래스가 인터페이스에 의존하는 경우, 실제로 어떤 구현 객체가 사용될지 모릅니다.
  • 정적인 클래스 의존관계와, 애플리케이션 실행 시점에 결정되는 동적인 객체인 인스턴스의 의존 관계를 분리해야 합니다.   

다음과 같이, 클래스 의존관계는 다이어그램만 보고도 의존관계를 파악할 수 있습니다. 하지만, OrderService 인터페이스의 구현체인 OrderSerivceImpl 클래스는 MemberRepository, DiscountPolicy 인터페이스 중 어느 인터페이스에 의존하는지 직관적으로 파악하기 어렵습니다. 그래서 애플리케이션 실행 시점에 실제로 생성된 객체 인스턴스의 의존관계가 존재합니다.  

  • 다음과 같이 동적인 의존관계를 확인하는 경우, Spring 컨테이너는 의존관계 주입을 적용하게 됩니다. 의존관계 주입을 사용하면 클라이언트의 코드를 변경하지 않고, 클라이언트가 호출되는 대상의 타입 인스턴스를 변경할 수 있습니다.
  • 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스를 의존관계를 쉽게 변경할 수 있게 됩니다. 

 

의존관계 주입은 다양한 방법(생성자 주입, 필드 주입, 세터 주입 등)이 있는데, 다음 포스팅에서는 코드로 다음과 같은 방식들의 장단점에 대해서 설명하도록 하겠습니다.