이번에는 기존에 작성해둔 AppConfig 코드를 리팩토링하고
전체적인 흐름을 정리해보는 시간을 가졌다.
AppConfig 리팩토링
기존에 작성해둔 코드는 중복도 있고 역할에 따른 구현이 잘 보이지 않는다
위의 그림 처럼 각각의 역할과 구현이 잘 보이도록 수정할 필요가 있다.
AppConfig 수정
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 FixDiscountPolicy();
}
}
코드를 수정하면서 역할과 구현 클래스가 한눈에 보이게 되었다.
새로운 구조와 할인 정책 적용
기존 정액 할인 정책을 정률% 할인 정책으로 변경해보자
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();
}
}
위의 코드에서 FixDiscountPolicy 를 RateDiscountPolicy로 변경한다.
이렇게 되면 구성 영역만 영향을 받고, 사용 영역은 전혀 영향을 받지 않는다.
전체적인 흐름 정리
- 새로운 할인 정책 개발
- 새로운 할인 정책 적용과 문제점
- 관심사의 분리
- AppConfig 리팩토링
- 새로운 구조와 할인 정책 적용
새로운 할인 정책 개발
다형성 덕분에 새로운 정률 할인 정책 코드를 추가로 개발하는 것 자체는 아무 문제가 없었다!
새로운 할인 정책 적용과 문제점
문제점1 : 클라이언트 코드인 주문 서비스 구현체를 변경해야함 -> OCP 위반
문제점2 : 주문서비스 클라이언트가 인터페이스인 DiscountPolicy 뿐만 아니라, 구체 클래스인 FixDiscountPolicy도 함께 의존 -> DIP 위반
관심사의 분리
기존 - 클라이언트가 의존하는 서버 구현 객체를 직접 생성, 실행함
분리 - AppConfig 코드를 통해 구현 객체를 생성하고 연결함
-> 이제부터 클라이언트 객체는 자신의 역할을 실행하는 것만 집중, 권한이 줄어듬 (책임 명확 SRP)
AppConfig 리팩터링
구성 정보에서 역할과 구현을 명확하게 분리
역할이 잘 드러나게 됨
중복 코드를 제거
새로운 구조와 할인 정책 적용
기존 정액 할인 정책 -> 정률% 할인 정책으로 변경
AppConfig로 사용/ 구성 영역 분리
할인 정책을 변경해도 AppConfig가 있는 구성 영역만 변경하면 됨
사용 영역은 변경할 필요가 없음
🙏 이 포스트는 김영한 개발자님의 <스프링 핵심원리 - 기본편> 를 듣고 공부한 내용을 바탕으로 작성되었습니다.
'🍎 Spring > 김영한 스프링 핵심원리' 카테고리의 다른 글
[김영한 스프링 핵심원리 - 기본편] 5. 스프링 컨테이너와 스프링 빈 (1) | 2025.01.22 |
---|---|
[김영한 스프링 핵심원리 - 기본편] 4. 객체 지향 원리 적용(3) (1) | 2025.01.17 |
[김영한 스프링 핵심원리 - 기본편] 4. 객체 지향 원리 적용(1) (1) | 2025.01.17 |
[김영한 스프링 핵심원리 - 기본편] 3. 예제 만들기 (3) | 2025.01.15 |
[김영한 스프링 핵심원리 - 기본편] 2. 좋은 객체 지향 설계의 5가지 원칙 SOLID (0) | 2025.01.07 |