본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2025 1학기 스프링부트 스터디] 여민호 #4주차

반응형

스프링 부트 핵심원리 이해(#섹션 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(); 추가로 중복 제거

 

반응형