[기본기] 5-3. 좋은 객체 지향 설계를 하기 위하여

khyojun·2022년 9월 13일
0

본 게시글은 김영한님의 스프링 핵심 원리 기본편을 정리한 글입니다.


📌 할인 정책을 바꿔보자

    // private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

할인에 대한 정책을 바꿨다. 기존에는 1000원 고정 할인이었지만 이제는 비율에 따라 할인을 하여주기로 하였다. 그치만... 이게 벌써 변경이 일어난걸 보니 좋은 객체 지향설계인건 벌써 떠나간거 같다. 그리고 코드를 보면 DiscountPolicy가 구현체인 FixDiscountPolicy의 인스턴스를 받아가고 있는데 이게 어찌보면 구현체에 대해 개발자가 신경을 쓴 상황이니 DIP 위반, 그리고 클라이언트 코드를 변경하였으니 OCP 위반 인 것을 알 수 있다. 지금의 상황을 그림으로 한 번 확인해보자.

이 문제를 해결하기 위하여서는 이 정책을 바꾸기 위하였던 OrderService의 위에 부분들을 고쳐줄 필요가 있다.
위의 예시에서는 할인정책만 바꾸었지만 실질적으로는 나중에는 저장소도 바꿔줄 필요가 있기에 우선은 구현체를 변경하지 않도록 변경만 해보자.

    //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
    private final DiscountPolicy discountPolicy;

	...
	discountPolicy.discount

위 코드에서의 문제는 인터페이스만 놔둬놓으면은 밑에 있는 discount에서 NPE가 일어날 거다. 인터페이스 자체만 있기 때문에 안에 어떤 구현체로 놔둬놓을지 정해지지 않았다. 그래서 아무것도 없는데 .discount를 하니 문제가 일어날거다.

📌 그러면 어떻게 하라고 ㅠㅠㅠ

진짜 어떻게 해야될까? 누군가가 저 DiscountPolicy에게 구현 객체를 대신 생성하고 주입시켜줘야한다.
그런 방법이 있다!

이는 다음 글에서 확인을 해보자.

출처

  1. 김영한님의 스프링 핵심 원리 기본편(https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8)
profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글