인프런 김영한 선생님의 스프링 핵심 원리 강의를 보고 정리한 내용입니다.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
private static MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
private DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
현재 할인 정책이 FixDiscountPolicy로 들어가고 있다. 이때 RateDiscountPolicy로 변경하고 싶으면 어떻게 해야 될까?
private DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
해당 메서드의 리턴 값만 RateDiscountPolicy 객체로 변경해주면 된다.
- Appconfig에서 할인 정책 역할을 담당하는 구현을 FixDiscountPolicy → RateDiscountPolicy 객체로 변경했다.
- 이제 할인 정책을 변경해도, 애플리케이션의 구성 역할을 담당하는 AppConfig만 변경하면 된다.
- 클라이언트 코드인 OrderServiceImpl를 포함해서 "사용 영역"의 어떤 코드도 변경할 필요가 없다.
- "구성 영역"은 당연히 변경된다. 구성 역할을 담당하는 AppConfig를 애플리케이션이라는 공연의 기획자로 생각하면 된다.
AppConfig에서 FixDiscountPolicy를 생성해주고 있었는데,
단순히 구현 객체만 바꾸어 구성 영역에만 영향을 주고, 사용 영역에는 영향을 주지 않는다.
클라이언트 코드에 전혀 손을 대지 않고 구현 클래스를 변경하였다.
AppConfig와 IoC(제어의 역전)의 관계
기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다.
구현 객체가 프로그램의 제어 흐름을 스스로 조종했다.
하지만 AppConfig가 등장한 이후에 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. 프로그램의 제어 흐름을 AppConfig가 가져가게 되었다.
예를 들면, OrderServiceImpl은 필요한 인터페이스들을 호출하지만, 어떤 구현 객체들이 실행될지 모른다. 그러므로 프로그램의 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다.
이렇게 프로그램의 제어 흐름을 구현 객체가 직접 제어하는 것이 아니라 외부에서 관리하는 것을 IoC(제어의 역전)이라고 한다.
'Dev > Spring' 카테고리의 다른 글
[Spring] 스프링 컨테이너 생성 및 조회 (0) | 2023.09.12 |
---|---|
[Spring] 정적인 클래스 의존관계 vs. 동적인 객체 인스턴스 의존 관계 (0) | 2023.09.11 |
[Spring] OCP, DIP를 위반하는 클라이언트 코드 고치기 (feat. DI) (0) | 2023.09.10 |
[Spring] 스프링이란? (0) | 2023.09.03 |
[Spring] DI를 사용하여 구현 클래스 변경하기 (0) | 2023.09.01 |