본문 바로가기

Backend/Spring

[Spring] 순수 자바의 문제와 해결 3) 요구사항 변경 반영(OCP)

728x90

 

 

So far...

우리는 지금까지 

순수 자바코드를 이용하여 시스템을 개발하였다 (순수 자바예제1~3)

기획자로 부터 변경사항을 전달받아, 구현체의 변경을 시도하던 중 코드상에서 DIP/OCP문제점을 발견하였다.(순수 자바의 문제와 해결 1)

그리고 이 문제를 관심사 분리(appConfig)로 해결하였다 ( 순수 자바의 문제와 해결 2)

이제 기획자로 부터 받은 변경사항을 수정해줄 차례이다.

 

 

요구사항이 무엇이었는지 다시 한번 확인해보자

 

 

요구사항 변경

 

기획자가 오픈을 앞두고 프로그램의 변경을 요구한 상황이다.

서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률% 할인으로 변경하고 싶어요. 예를 들어서 기존 정책은 VIP가 10000원을 주문하든
20000원을 주문하든 항상 1000원을 할인했는데, 이번에 새로 나온 정책은 10%로 지정해두면 고객이 10000원 주문시 1000원을 할인해주고, 20000원 주문시에 2000원을 할인해주는 거에요!

 

고정 금액 할인정책을 정률 할인 정책으로 변경하고 싶다고 한다.

 

 

애플리케이션의 구성 

 

 

AppConfig의 등장으로 애플리케이션이 크게

  • 사용영역
  • 구성 영역 : 객체를 생성하고 구성 

으로 나누어졌다.

 

(이미 RateDiscountPolicy는 이전 게시글에서 구현해둔 상태)

지금 요구사항은 DiscountPolicy라는 역할의 구현을 고정금액에서 정률 할인으로 변경하고 싶은 것 이므로,

구성 영역인 AppConfig에서 Fix → Rate로 변경해주면된다.

 

AppConfig

public class AppConfig {

    public DisountPolicy disountPolicy(){
        return new RateDiscountPolicy();
//        return new FixDiscountPolicy();
    }



}

 

끝~

 

여기서 중요한 것은 RateDiscountPolicy로 변경되었다고 해서, 이를 의존하는 다른 클래스들의 코드가 변경되지 않았다는 사실이다.

클라이언트 코드인 OrderServiceImpl 를 포함해서 사용 영역의 어떤 코드도 변경할 필요가 없다.

 

구성 영역은 당연히 변경된다. 구성 역할을 담당하는 AppConfig를 애플리케이션이라는 공연의 기획자로 생각하자. 공연 기획자는 공연 참여자인 구현 객체들을 모두 알아야 한다.

 

 

 

마지막 정리는 김영한님이 너무 잘해두셔서 내가 따로 정리하는 것 보다 그 부분 읽기로 하자

정리 : 스프링 핵심원리 기본편 - 40~41page

SOLID 적용 정리(SRP/DIP/OCP) : 41 - 42page

728x90