이번 회차에서는 저번 회차에 설계한 대로 개발을 한다.
일단 할인 정책 관련 DiscountPolicy 인터페이스 클래스와 정액할인의 내용을 담은 구현체 클래스부터 만들고,
주문의 정보를 저장하는 객체의 설계도가 될 Order 클래스를 만들고,
그 다음 주문을 받아 할인 결과를 알아내는 역할의 서비스 OrderService 인터페이스와 그 구현체 클래스를 만든다.
그러므로 다음과 같이
회원 정보 관리와 관련된 코드들이 들어있는 member 패키지와 같은 레벨에
discount 패키지와 order 패키지를 새로 만들어두고 시작하자.
할인 정책 관련 요소 개발
매우! 간단하다.
일단 인터페이스부터 만든다.
이렇게 하면 끝이다.
회원 객체와 원래 가격을 받아와서 얼마나 할인하면 되는지를 반환하는 메소드 하나만 써주면 된다.
다음으로, 정액 할인을 적용하는 구현체를 만든다.
고정 금액을 정액 할인해주는 역할이므로 강사님과 동일하게 FixDiscountPolicy라고 이름을 지어주고, 일단 위와 같이 DiscountPoilcy를 implement해준다.
그리고 내용을 이렇게 채우면 끝이다.
회원의 등급이 VIP라면 1000을 리턴하고, 그렇지 않으면 0을 리턴한다.
이때 회원 등급 값을 비교하기 위해 ==을 사용해도 되는 이유는 Enum이기 때문이다.
주문 관련 1: Order 클래스 만들기
주문 정보를 저장하는 객체의 설계도가 될 Order 클래스부터 만든다.
필요한 필드는 위와 같다.
킹갓 단축키 Alt+Insert를 사용해서
생성자를 만들어주고
같은 단축키로 모든 필드에 대하여 getter와 setter도 만들어준다.
그 다음, 할인이 적용된 최종 가격이 얼마인지 리턴하는 calcuatePrice 함수를 하나 만들어준다.
마지막으로, Alt+Insert 누르면 있는 toString()을 만들어준다.
나중에 이 객체의 정보를 출력하고 싶을 때의 편의성을 위해서이다.
이 toString()이 있으면,
Order order = new Order(..., ..., ... ... );
...
System.out.println(order);
이렇게 Order 객체 자체를 출력문 안에 적기만 해도 저 toString()이 리턴하는 문자열이 자동으로 출력되게 된다.
주문 관련 2: OrderService 인터페이스와 구현체 만들기
order 패키지에 OrderService 인터페이스를 만들고 아래와 같이 메소드 하나를 넣어준다.
들어온 주문 정보를 바탕으로, 할인이 적용된 주문 정보를 담은 Order 객체를 만들어 반환하는 메소드다.
이제 구현체를 만든다.
같은 order 패키지에 OrderServiceImpl을 만들고 메소드도 implement해준다.
이 Service는 MemberRepository와 DiscountPolicy에 모두 접근해야 한다.
MemberRepository에서는 id를 기준으로 주문을 한 이 회원의 정보를 탐색해 얻어올 것이고
그렇게 얻어온 회원 정보 (Member 객체) 를 DiscountPolicy 구현체에 가져다주어 할인 적용을 맡길 것이다.
따라서 아래와 같이 MemberRepository와 DiscountPolicy 객체를 하나씩 만들어준다.
다음으로 메소드의 내용을 채운다.
memberRepository에게서 회원 정보를 찾아오고
discountPolicy에게서 할인 결과를 받아오고
이를 바탕으로 Order 객체를 만들어 리턴한다.
보면 각 요소마다 역할분배가 매우 잘 되어있음을 알 수 있다.
Service는 memberRepository와 discountPolicy에게 각각 할 일을 던져주는 일밖에 하지 않는다.
만약 회원 정보 관리와 관련된 변경사항이 발생하면 Service를 건드릴 필요 없이 MemberRepository만 수정하면 되고,
할인 정책 관련 변경사항이 발생했을 때도 마찬가지로 Service를 건드릴 필요 없이 DiscountPolicy만 수정하면 된다.
ISP를 잘 지켰다.
다음 회차에서는 오늘 만든 것을 실행해보고 테스트한다.
'스프링 공부 > 인프런 김영한 스프링 핵심 원리 - 기본편 노트정리' 카테고리의 다른 글
3-1. 새로운 할인 정책 개발 (2) | 2023.01.07 |
---|---|
2-8. 주문과 할인 도메인 실행과 테스트 (2) | 2022.09.04 |
2-6. 주문과 할인 도메인 설계 (0) | 2022.09.03 |
2-5. 회원 도메인 실행과 테스트 (0) | 2022.09.01 |
2-4. 회원 도메인 개발 (0) | 2022.08.22 |