스프링 부트 핵심원리 이해(#섹션 4)
새로운 할인 정책 생성
Before ) 할인 정책 = VIP면 1000원을 모두 할인해라!!
After ) 할인 정책 = VIP면 결제한 금액의 10%를 할인해라 (만원이면 1000원,2만원이면 2000원)
객체 지향 설계 원칙을 활용하면 쉬움
##실습##
-> 이전 DiscountPolicy (할인 정책 코드)를 불러와 RateDiscountPolicy 생성
10프로 할인 설계
(if 문을 활용해 VIP일때 할인, 아니면 else문으로 빠져나가 할인 적용 X)
-> test 도메인 설계
@Test -> void vip_o( ) : 김철수가 VIP이며 10000원을 결제 했을때 1000원을 할인한다
@Test (실패 test 설계) -> void vip_x( ) : 김철수가 VIP가 아니면 할인을 한다. (오류 발생!!!)
새로 만든 할인 정책의 문제점
=> 클라이언트인 OrderServieImpl이 그냥 DiscountPolicy가 뿐만 아니라 FixDiscountPolicy인 구체 클래스도 함께 의존하고 있다. 즉 의존 관계가 중복되어 DIP를 위반한다!! -> 우린 interface( DiscountPolicy )에 의존하게 만들어야한다.
=> 또한 FixDiscountPolicy에서 RateDIscountPolicy로 교체 시 OrderServiceImpl의 소스 코드도 바꾸어줘여한다.
<해결방법>
인터페이스가 DiscountPolicy에만 의존하도록 바꾸면 된다.
Before code )
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
After code )
private DiscountPolicy discountPolicy;
이렇게 되면 오류가 발생함 => NullPointerException (DIP 위반)
오류 해결 방법
**관심사 분리**
=> 쉽게 설명하면 공연을 하나 한다고 해도 기획자, 배우 , 홍보팀, 마케팅 모두 분리해서 하듯이
각 도메인마다 다른 관심사를 주입해야함
<해결 방법>
1. Appconfig 도메인에서 해결
생성자를 통해서 객체가 들어감(생성자 주입)
1-1. OrderServiceImpl에서 오로지 DiscountPolicy 인터페이스에만 집중하도록 한다.
-code : private final MemberRepository memberRepository ;
private final DiscountPolicy discountPolicy;
(DIP를 철저히 지키고 있음 + 객체에는 관여하지 않음)
따라서 Appconfig에는 1. MemberServiceImpl 2.MemoryMemberRepository 3.OrderServiceImpl 4.FixDiscountPolicy를 실제 동작하게 만든다. (생성자를 주입) + 객체를 생성하고 연결하는 역할과 실행하는 역할이 확연히 분리됨
매우 중요!!!
정리를 해보자면
1. Appconfig는 앱을 기획하는 도메인이다.
2. 이 기획 도메인은 객체를 생성하고 연결하는 역할을 맡는다
3. 각 구체 클래스는 실행만 된다. 즉 다른 역할을 하지 않는다.
추가적으로 Appconfig 코드에 역할이 잘 보이고 중복 정리하기
(1) 중복 제거
- new MemoryMemberRepository( ) 부분이 중복임
- public MemberRepository memberRepository() {
return new MemoryMEmberRepository(); 추가로 중복 제거
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2025 1학기 스프링부트 스터디] 오세웅 #4주차 (1) | 2025.05.07 |
---|---|
[2025 1학기 스프링부트 스터디] 장민주 #4주차 (0) | 2025.05.06 |
[2025 1학기 스프링부트 스터디] 류현준 #3&4주차 (0) | 2025.05.06 |
[2025 1학기 스프링부트 스터디] 정다은 #4주차 (1) | 2025.05.04 |
[2025 1학기 스프링부트 스터디] 이상래 #4주차 (0) | 2025.05.04 |