티스토리 뷰
서론
- 이전 포스트에서 순수 Java만 사용하여 비즈니스 요구사항에 맞게 프로젝트를 설계하였다.
- 이제 새로운 할인 정책을 개발하여 프로젝트를 확장해보자.
- 이때, 객체 지향의 설계 원칙을 잘 준수했는지 확인해 보자.
1. 새로운 할인 정책 개발
- 상황 : 서비스 오픈 직전에 할인 정책에 대한 기획자의 요구사항이 변경되었다.
- 기획자 : 고정 할인 정책(1000원)이 아니라 정률 할인 정책(10%)으로 바꿉시다!
- 개발자 : ㅠㅠ
RateDiscountPolicy 추가
새로운 할인 정책을 설계했으면 이제 OrderService에서 기존에 사용하던 FixDiscountPolicy대신 RateDiscountPolicy로 대체한다.
이때, 문제점이 발견된다.
- 분명히 역할과 구현을 충실하게 분리했다.
- 다형성도 활용하고 인처페이스와 구현 객체를 분리했다.
- 하지만 위의 상황에서 OCP 와 DIP를 위반하게된다.
- OrderService의 코드를 변경하였으며(OCP 위반) 인터페이스가 아니라 구현체에도 의존하고있다. (DIP 위반)
- 고정 할인 정책을 적용했을때의 의존관계는 다음과 같다
- 정률 할인 정책을 적용했을때의 의존관계는 다음과 같다
- 이처럼 RateDiscountPolicy로 바꾼다고 해도 DIP위반이며 OrderServiceImpl을 변경하므로 OCP위반인 셈이다.
이제 이 문제를 해결해보자.
먼저, DIP원칙을 지키려면 인터페이스에만 의존하도록 코드를 변경해야한다.
- 구현체를 new 했던 코드를 지우자.
- 테스트를 돌리면 당연히 NullPointerException이 발생한다.
- 어떻게 해결해야할까?
해결방안
누군가 클라이언트인 OrderServiceImpl에 DiscountPolicy의 구현 객체를 대신 생성하고 주입해야 한다.
꿀팁
- Ctrl + Shift + T 를 눌러 쉽게 테스트 클래스를 생성할 수 있다!
- 한글이 깨질 경우, Edit Custom VM Options 에서 마지막줄 아래에 다음의 코드 추가 후 재시작
-Dfile.encoding=UTF-8
- Test 코드의 Assertions는 static import 하는것이 좋다. 편리해지고 코드도 간결해 진다.
'Web 개발' 카테고리의 다른 글
[Web] Spring 핵심 원리 6.5 - 중간 점검 (전체 흐름 정리) (0) | 2022.01.10 |
---|---|
[Web] Spring 핵심 원리 6 - 관심사의 분리(AppConfig) (0) | 2022.01.09 |
[Web] Spring 핵심 원리 4 - 순수 Java로 예제 프로젝트 설계하기 (1) (0) | 2021.12.19 |
[Web] Spring 핵심 원리 3 - 좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2021.12.18 |
[Web] Spring 핵심 원리 2 - 객체 지향 프로그램과 Spring (0) | 2021.12.18 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 다익스트라
- 알고리즘
- 백트래킹
- 자바
- 코딩새내기
- java
- 우선순위큐
- SWEA
- DFS
- 리액트 네이티브
- S2
- Spring
- 현꾸라지
- 구현
- react
- BFS
- 그리디
- 리액트
- 백준
- react native
- 문자열
- g4
- PriorityQueue
- map
- 객체지향
- G5
- S3
- 시뮬레이션
- laugh4mile
- Spring Boot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함