250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 서블릿
- 인터페이스
- 오블완
- 테스트코드
- @configuration
- 의존관계
- JSON
- equals()
- java
- 추상클래스
- 코드트리
- 스프링
- objecterror
- DI
- fielderror
- 프록시
- HttpServletResponse
- 코드트리조별과제
- 티스토리챌린지
- ocp
- 다형성
- 백준
- html form
- 오버라이딩
- 코딩테스트
- 김영한
- 싱글톤
- http 메시지 컨버터
- 스프링컨테이너
- 참조변수
Archives
- Today
- Total
minOS
스프링 핵심 원리 이해2 - 객체 지향 원리 적용(1) 본문
728x90
새로운 할인 정책 개발
public class FixDiscountPolicy implements DiscountPolicy { private int discountFixAmount = 1000; @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return discountFixAmount; } else return 0; } }
원래 할인 정책에서 새로운 할인 정책 하나를 추가했습니다.public class RateDiscountPolicy implements DiscountPolicy{ private int discountPercent =10; @Override public int discount(Member member, int price) { if(member.getGrade()== Grade.VIP) return price * discountPercent/100; else return 0; } }
새로운 할인 정책 테스트 코드class RateDiscountPolicyTest { RateDiscountPolicy discountPolicy = new RateDiscountPolicy(); @Test @DisplayName("vip는 10% 할인이 적용되어야 합니다") void vip_o(){ //given Member member = new Member(1L, "memberVIP", Grade.VIP); //when int discount =discountPolicy.discount(member,10000); //then assertThat(discount).isEqualTo(1000); } @Test @DisplayName("vip가 아니면 할인이 적용되지 않아야 합니다") void vip_x(){ //given Member member = new Member(2L, "memberBASIC", Grade.BASIC); //when int discount =discountPolicy.discount(member,10000); //then assertThat(discount).isEqualTo(0); }
새로운 할인 정책 적용과 문제점
할인 정책을 변경하려면 클라이언트 'OrderServiceIml'을 고쳐야한다.
public class OrderServiceImpl implements OrderService{ // private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); }
문제점
1) 우리는 역할과 구현을 충실하게 분리했다. o
2) 다형성도 활용하고, 인터페이스와 구현 객체를 분리했다. o
3) OCP,DIP같은 객체지향 설게 원칙을 충실히 준수하지 못했다.
- DIP : 주문 서비스 클라이언트('OrderServiceIml') 은 'DiscountPolicy'인터페이스에 의존하면서 DIP를 지킨 것 같지만,
-> 클래스 의존 관계를 분석해보면 추상(인터페이스)뿐만 아니라, 구체(구현)클래스에도 의존하고 있다.
추상 인터페이스 의존 : DiscountPolicy
구체,구현 클래스에 의존 : FixDiscountPolicy,RateDiscountPolicy
- OCP : 변경하지 않고 확장할 수 있어야 하지만 지금 코드는 기능을 확장하면 클라이언트 코드에 영 향을 준다 따라서 OCP를 위반한다.
기대한 의존 관계 설계도클라이언트인 "OrderServiceIml" 이 "DiscountPolicy" 인터페이스 뿐만 아니라 "FixDiscountPolicy"인 구체 클래스도 함께 의존하고 있으므로 DIP 위반한 것이다.
실제 의존 관계 설계도
"FixDiscountPolicy"를 "RateDiscountPolicy"로 변경하는 순간 "OrderServiceIml"의 소스도 함께 변경해야한다.
OCP 위반한 것이다.
인터페이스에만 의존하도록 코드 변경
public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository = new MemoryMemberRepository(); private DiscountPolicy discountPolicy; }
구현체가 없어서 NullPointerException 오류 발생
해결방안( DIP , OCP 원칙 모두 지키는 )
문제를 해결하려면 누군가는 클라이언트의 "OrderServiceIml"에 "DiscountPolicy"의 구현 객체를 대신 생성하고 주입해주어야 한다.
728x90
'TIL > 김영한의 스프링 핵심 원리' 카테고리의 다른 글
스프링 핵심 원리 이해2 - 객체 지향 원리 적용(3) (0) | 2024.01.30 |
---|---|
스프링 핵심 원리 이해2 - 객체 지향 원리 적용(2) (2) | 2024.01.24 |
스프링 핵심 원리 이해1 - 예제 만들기 (0) | 2024.01.17 |
객체 지향 설계와 스프링 - 좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2024.01.17 |
객체 지향 설계와 스프링 - 좋은 객체 지향 프로그래밍이란? (0) | 2024.01.16 |