본문 바로가기
코딩log/Spring Framework

[Spring Framework]IoC와 DI 컨테이너 개념정리

by 벨크 2023. 2. 5.
반응형

  스프링을 공부하다 보면, IoC 컨테이너와 DI 컨테이너라는 단어에 대해서 자주 듣게 됩니다. IoC 컨테이너와 DI 컨테이너가 의미하는 바가 상당히 유사합니다. 그만큼 혼용해서 쓰는 사람들도 많습니다. 그래서 이 개념들이 나태는 것이 정확히 무엇인지 한 번 짚고 넘어가고자 합니다. 추상적인 개념이 구체적으로 바뀌어 정리되는 게 바로 공부의 묘미죠. 그럼 한 번 정리해 보겠습니다.


[Spring Framework]IoC와 DI 컨테이너
[Spring Framework]IoC와 DI 컨테이너

IoC와 DI 컨테이너 개념정리

 

제어의 역전(IoC : Inversion of Control)

 

  IoC(Inversion of Control)은 문자 그대로 제어의 역전이란 뜻입니다. 앞서 스프링 없이 좋은 객체지향 프로그래밍을 할 때, AppConfig라는 클래스가 등장했습니다. 이 AppConfig라는 클래스가 바로 제어가 역전된 예입니다.

 

  앞서 구현한 AppConfig를 비롯한 시스템 전체를 보면, AppConfig를 제외한 객체들은 자신의 구현 객체를 실행만 합니다. 어떤 구현 객체를 선택할지, 어떤 객체에 어떤 구현객체를 연결시킬지 등 프로그램의 흐름 혹은 제어는 바로  AppConfig라는 객체가 하게 됩니다. AppConfig는 우리가 구현하고자 하는 시스템을 놓고 보았을 때, 시스템 구현에 필수인 내부 클래스가 아닙니다. 따라서 AppConfig처럼 구현체 내부가 아닌, 외부에서 프로그램 제어를 하는 것이 제어의 역전(IoC)입니다.

 

  IoC의 대표적인 사례가 바로 프레임워크입니다. 우리가 프레임웍을 이용해 프로그램을 구현하면, 프레임워크 위에서 프로그램이 실행됩니다. 이 말이 구현한 프레그램의 설정과 실행 등의 제어를 프레임워크가 해준다는 의미입니다. 제어권을 프로그램이 가지고 있는 게 아니고, 프레임워크 가지고 있습니다. 제어가 역전된 상태인 것입니다. 그래서 IoC의 대표적인 예가 프레임워크가 되는 것입니다.

 

의존관계 주입(Dependency Injection)

 

  의존관계 주입(DI: Dependency Injection)은 의존관계를 외부에서 주입하는 모양으로 프로그램이 설계되어, 의존관계주입이라고 합니다. 의존관계 주입에 대해서 이야기하기 전에 의존관계에 대해서 먼저 생각해 봅시다. 의존관계는 크게 두 가지로 분리해서 생각해야 합니다.

  • 정적인 클래스 의존관계
  • 실행 시 결정되는 동적인 객체(인스턴스)

  클래스 다이어그램에서 표시되는 정적인 클래스 의존관계는 처음부터 끝까지 절대 변경되지 않는 의존 관계입니다. 반면 객체 다이어그램으로 표시되는 동적인 객체 인스턴스들은 실행 시 어떤 구현객체가 선택될지 결정되는 의존관계입니다. 의존관계 주입은 바로 이 동적인 의존관계를 외부에서 주입해 주는 것입니다.

 

  의존관계 주입(DI)을 사용하여 동적인 인스턴스를 주입하면, 클라이언트의 변경 없이 호출 인스턴스를 변경할 수 있다는 장점이 있습니다. 즉, 정적인 클래스 다이어그램, 클래스 의존관계의 변경 없이 동적 인스턴스를 변경할 수 있습니다.

 

IoC 컨테이너, DI 컨테이너

 

  컨테이너라는 말은 주로 혼자 쓰이지 않고, IoC 컨테이너, DI 컨테이너라고 사용됩니다. Spring에서 위와 같이 제어의 역전이나 의존관계 주입을 해주는 클래스를 지칭합니다. 결국 같은 클래스를 지칭하는 말입니다. 

 

  IoC는 조금 더 포괄적이고, 느슨하게 사용되는 개념입니다. Spring Framework의 IoC 기능의 대표 동작원리가 바로 DI라고 할 수 있습니다. 그래서 우리가 앞으로 사용할 Spring 컨테이너는 DI 컨테이너라고 부르는 것이 맞습니다. DI 컨테이너는 일반적으로 객체가 능동적으로 사용할 클래스를 결정하고, 언제 인스턴스 생성할지 결정합니다.


  핵심은 IoC와 DI의 개념적인 차이점입니다. 제어의 역전의 한 방법 중에 DI가 있다는 것이죠. 그렇다면 Spring Framework의 대표적 IoC기술인 DI는 어떻게 동작하는지 앞으로 알아가 보겠습니다.

 

이전 글: 관심사의 분리 - ① Spring 없이 개발하기 

 

[Spring Framework]관심사의 분리 -① Spring없이 개발하기

4차 산업혁명, 디지털 트랜스포메이션 등 이제는 인프라가 IT가 아닌 기업들도 IT기업으로 전환을 하기 시작했습니다. 그만큼 더욱 소프트웨어 개발 및 설계가 중요해지고 있습니다. 소프트웨어

belklog.tistory.com

 

반응형

댓글