1. OrderApp 실행 보면서 역할과 책임의 분리 확인하기
- MemberService에서는 Member관리
- OrderService에서는 Order관리를 해야지
- OrderService에서 할인 관련한건 createOrder할 때 할인정책을 정하는 객체한테 가서 해달라고 하면 됨
2. 만약 할인정책을 업데이트하게되면 ?
- DiscountPolicy Interface의 구현체를 바꾸면 되는군!
- DiscountPolicy의 구현체 생성
- 근데 할인정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야한다(OCP 위반)
- 클라이언트가 직접 구현체의 선택까지 해야하는가 ?
- 실제 클라이언트는 구현체 또한 의존을 하고있다!(DIP 위반)
- 이러면 안되는딩!
3. 해결 방안
- 인터페이스에만 의존하도록 변경하면 ?
- 실행 당연히 안되니 그럼 어떻게 해야할까
- 누군가가 클라이언트인 OrderServiceImpl 에 구현체를 대신 생성해서 주입해주어야 한다.
- 관심사의 분리 : 본인의 역할과 책임을 명확하게 집중해야 한다!
- OrderServiceImpl에서는 원래 MemberRepository와 DiscountPolicy interface의 구현체를 직접 생성했었다.
- 하지만 생성자를 통해서 AppConfig에서 구현체를 주입받아서 사용하면 되기때문에 구현체를 몰라도 된다.
- 즉, DIP를 지키게 된다!
- 전체 앱의 구성관리자인 AppConfig에서 주입한다.
- 여기에서 실제 동작에 필요한 구현 객체를 생성해서 주입하는 역할만 한다.
- 생성한 객체 인스턴스의 참조를 생성자를 통해서 주입(연결)한다.
- 이제 MemberServiceImpl과 OrderSericeImpl 은 의존관계는 AppConfig에 맡기고 실행에만 집중하면 된다.
- 즉, MemberServiceImpl 은 인터페이스 추상에만 의존하면 된다.
- AppConfig를 리팩터링할 수 있다.
- 설계가 어떻게 되어있는지 한 눈에 볼 수 있다.
'Backend - Java Spring > Spring Core 핵심원리(완)' 카테고리의 다른 글
[SpringCore 핵심원리] 빈 설정과 싱글톤 (0) | 2024.02.17 |
---|---|
[SpringCore 핵심원리] IoC, DI, Container (0) | 2024.02.17 |
[SpringCore 핵심원리] 설계 (0) | 2024.02.16 |
[SpringCore 핵심원리] 시작 (0) | 2024.02.14 |
[Spring 김영한] 스프링과 빈의 의존관계 (0) | 2024.02.12 |
댓글