[Spring/Springboot] 제어의 역전 IoC(Inversion of Control)

2024. 12. 15. 23:06CS/Spring

 

제어의 역전 IoC(Inversion of Control)

public class AppConfig{
	public MemberService memberService(){
		return new MemberServiceImpl(memberRepository());
	}
	
	public OrderService orderService(){
		return new OrderServiceImpl(memberRepository(), discountPolicy());
	}
	
	public MemberRepository memberRepository(){
		return new MemoryMemberRepository();
	}
	
	public DiscountPolicy discountPolicy(){
		return new RateDiscountPolicy();
		//return new FixDiscountPolicy();
		//-> 할인 정책을 변경해도, 애플리케이션의 구성 역할을 담당하는 AppConfig만 변경하면 됨
	}
}
  • 기존 프로그램 : 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성, 연결, 실행 → 구현 객체가 프로그램의 제어 흐름을 스스로 조종
  • AppConfig 등장 : 구현 객체는 자신의 로직을 실행하는 역할만 담당 → 프로그램 제어 흐름은 AppConfig에게
    • OrderServiceImpl은 필요한 인터페이스들을 호출하지만, 어떤 구현 객체들이 실행될지 모름
    • 심지어 OrderServiceImple AppConfig가 생성 → 그리고 AppConfig는 OrderServiceImpl이 아닌 OrderService 인터페이스의 다른 구현 객체를 생성하고 실행할 수도 있지만, OrderServiceImpl은 그런 사실을 모른 채 자신의 로직을 실행할 뿐
  • 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것 : IoC

IoC 컨테이너(혹은 DI 컨테이너)

  • AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것