AppConfig 리팩토링
기대하는그림
수정전 AppConfig
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(), new RateDiscountPolicy());
}
}
구현이 잘 안보이고(메모리멤버리포지토리)
오더서비스 구현체 만들때, 멤버서비스 구현체 만들때 메모리멤버리포지토리 생성이 중복이 된다.
그리고 만약 멤버리포지토리 구현체가 바뀌게 된다면 멤버리포지토리 구현체를 적은곳 수만큼 코드수정이 생긴다.
Extract Method 단축키
메소드 추출
컨트롤 + 알트 + m
수정후 AppConfig
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(MemberRepository());
}
private MemberRepository MemberRepository() {
return new MemoryMemberRepository();
}
public OrderService orderService() {
return new OrderServiceImpl(MemberRepository(), DiscountPolicy());
}
private DiscountPolicy DiscountPolicy() {
return new RateDiscountPolicy();
}
}
이렇게 수정함으로써
메소드 명과 리턴타입으로 어떤 역할인지 보인다. (구현체가 어떤 역할을 할지) ,
메소드 내용에서 어떤 구현체를 리턴하는지 쉽게 확인할 수 있다.
+
구현체의 변경이 있을시 수정이 쉽게된다.
ex) 메모리 리포지토리 에서 DB리포지토리로 바꾼다고 했을때 return new DB리포지토리로 단 한줄만수정하면된다.
수정전 AppConfig에서는 메모리리포지토리가 사용된곳마다 수정이 있었어야했다.
새로운 할인정책 적용
AppConfig 덕분에 사용영역과 , 객체를 생성하고 구성(환경설정)하는 영역으로 분리됨!
할인정책 적용 후 그림
AppConfig를 사용함으로서 쉽게 변경이 가능하다.
AppConfig 내부코드 수정해서 할인정책(구현체 변경)
private DiscountPolicy DiscountPolicy() {
return new RateDiscountPolicy();
}
AppConfig 덕분에 간단하게 수정가능하다. (테스트도 잘 통과)
사용영역의 어떤 코드도 변경할 필요없이 구성영역의 코드만 수정 하면된다
DIP 준수, OCP 준수
DIP도 준수 (추상화에 의존하고, 구체화에 의존하지않는다 -> AppConfig에서 의존성 주입을 해줘서 추상화에만 의존하면된다. 구현체는 외부에서 의존관계를 주입해줌)
OCP도 준수 (확장에는 열려있고 변경에는 닫혀있다 -> 구현체변경을 할때 사용영역의 코드 수정은 없고 구성영역의 코드 수정만 필요하다 ( AppConfig를 사용함으로서) [클라이언트 코드 수정이 불필요]
배웠던거 전체 흐름 정리
새로운 할인 정책 개발
다형성 덕분에 새로운 정률 할인 정책 코드를 추가로 개발하는 것 자체는 아무 문제가 없음
(인터페이스를 이용해서 구현클래스를 만들면 되니까 == 다형성 )
새로운 할인 정책 적용과 문제점
새로 개발한 정률 할인 정책을 적용하려고 하니 클라이언트 코드인 주문 서비스 구현체도 함께 변경해야함
주문 서비스 클라이언트가 인터페이스인 DiscountPolicy 뿐만 아니라, 구체 클래스인
FixDiscountPolicy 도 함께 의존 DIP 위반
관심사의 분리
AppConfig 리팩토링
새로운 구조와 할인 정책 적용
'인프런 > 스프링핵심원리(기본)' 카테고리의 다른 글
★★10) 스프링으로 전환하기, ApplicationContext ,@Configuration,@Bean , 스프링 컨테이너, 스프링 빈 , 스프링컨테이너 생성과정 (0) | 2022.12.15 |
---|---|
9) 좋은 객체지향 설계의 5가지 원칙의 적용 , IoC(Inversion of Control == 제어의 역전), DI(의존관계주입,의존성주입) , 컨테이너(IoC 컨테이너, DI 컨테이너) (0) | 2022.12.09 |
7) ★ 관심사의 분리, AppConfig(리팩토링 전) , 생성자 주입,의존성 주입(의존관계 주입) (0) | 2022.12.09 |
6)새로운 할인 정책 개발 , 적용과 문제점 , 문제점 해결 (의존성 주입) (0) | 2022.12.09 |
5)주문과 할인 도메인 설계와 개발 (0) | 2022.12.07 |
댓글