IoC, DI 용어정리
Web/Spring

IoC, DI 용어정리

IoC, DI 도 스프링 개발자 오픈톡방이나 스프링 이야기가 나올 때마다 자주 보이던 용어들이었다.

 

당시에 궁금해서 구글에 검색했을땐

IoC : 제어의 역전

DI : 의존관계 주입

이라고 나오는 결과들만 보고서 이해가 안되어 그냥 넘어갔던 것들이다.

 

 

 

 

 

IoC (Inversion of Control) 제어의 역전


 

 

IoC (제어의 역전) 의 사전적 정의

  • 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 말한다.

말 그대로 기존에 프로그램의 제어흐름을 직접 제어하던 것을 외부에서 관리하도록 역전 시킨다는 것을 말한다.

하지만 이해하기 쉽게 코드를 이용해 설명해 볼 것이다.

 

 

IoC가 적용이 안된 코드

코드에 대한 배경지식을 먼저 설명하자면,

 

MemberRepository 인터페이스는 

  • MemoryMemberRepository 클래스
  • DBMemberRepository 클래스

가 구현하고있다. (DiscountPolicy인터페이스는 FixDiscountPolicy, RateDiscountPolicy로 구현되어있다.)

 

그래서 memberRepository 는 MemoryMemberRepository or DBMemberRepository 두 가지 중에 어떤것이 들어올지 선택이 되어야한다.

 

지금은 어떤것이 들어올지 선택을 구현체에서 직접 하고있다.

 

이 코드를 그래서 이렇게 바꿔주어야 한다.

 

그러면 이제 의문점이 생긴다. 

 

이제 구현체에서는 어떤 것을 할당받는지 모르는 상태로( DIP ) 어떻게 객체를 할당받지?

 

 

 

생성자 주입


생성자를 통해서 해당 구현체에 객체를 할당할 수 있다.

 

그럼 이제 OrderServiceImpl은 어떤 객체가 할당될 지 모르는 상태의 구현체가 된다.

 

어떤 객체가 할당될 지는 제3의 존재가 정해주어야 한다. 

 

이것이 바로

 

DI (Dependency Injection) 의존성 주입


MemberRepository와 DiscountPolicy가 어떤 객체에 의존하는지 RunTime(실행 시간)에 결정된다.

(같은 말로 Dynamic하게 결정된다고도 한다.)

 

이것을 DI( 의존성 주입 ) 이라고 한다.

 

 

 

 

 

 

 

 

 

 

 

 

김영한 님의 스프링 핵심원리 - 기본편을 보고 정리한 글입니다.