본문 바로가기
Backend - Java Spring/Spring Core

[SpringCore 핵심원리] Config

by VictorMeredith 2024. 2. 16.

1. OrderApp 실행 보면서 역할과 책임의 분리 확인하기

- MemberService에서는 Member관리

- OrderService에서는 Order관리를 해야지

- OrderService에서 할인 관련한건 createOrder할 때 할인정책을 정하는 객체한테 가서 해달라고 하면 됨

 

 

2. 만약 할인정책을 업데이트하게되면 ?

- DiscountPolicy Interface의 구현체를 바꾸면 되는군!

- DiscountPolicy의 구현체 생성

 

- 근데 할인정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야한다(OCP 위반)

new 구현 부분이 문제구만

- 클라이언트가 직접 구현체의 선택까지 해야하는가 ? 

- 실제 클라이언트는 구현체 또한 의존을 하고있다!(DIP 위반)

- 이러면 안되는딩!

 

3. 해결 방안

- 인터페이스에만 의존하도록 변경하면 ? 

이러면 당연히 실행이 안되는디

 

- 실행 당연히 안되니 그럼 어떻게 해야할까

- 누군가가 클라이언트인 OrderServiceImpl 에 구현체를 대신 생성해서 주입해주어야 한다.

- 관심사의 분리 : 본인의 역할과 책임을 명확하게 집중해야 한다!

 

- OrderServiceImpl에서는 원래 MemberRepository와 DiscountPolicy interface의 구현체를 직접 생성했었다.

- 하지만 생성자를 통해서 AppConfig에서 구현체를 주입받아서 사용하면 되기때문에 구현체를 몰라도 된다.

- 즉, DIP를 지키게 된다!

 

- 전체 앱의 구성관리자인 AppConfig에서 주입한다.

객체를 주입받는다. (DI)

- 여기에서 실제 동작에 필요한 구현 객체를 생성해서 주입하는 역할만 한다.

- 생성한 객체 인스턴스의 참조를 생성자를 통해서 주입(연결)한다.

- 이제 MemberServiceImpl과 OrderSericeImpl 은 의존관계는 AppConfig에 맡기고 실행에만 집중하면 된다.

- 즉, MemberServiceImpl 은 인터페이스 추상에만 의존하면 된다.

 

앱 실행할 때

 

- AppConfig를 리팩터링할 수 있다.

역할과 구현클래스가 어떻게 생겼는지 파악이 가능하다

- 설계가 어떻게 되어있는지 한 눈에 볼 수 있다.

 

댓글