이번 시간에는 회원 도메인과 주문/할인 도메인을 설계하고 순수한 자바로 개발을 하는 시간을 가졌다. 다형성 갖는 자바의 특성을 살리기 위한 개발을 연습하기 위해 선생님이 설정하신 상황은 다음과 같았다.
1) 회원 도메인 협력 관계
기획자와 함께 보는 표
2) 회원 클래스 다이어그램
MemoryMemberRepository가 구현될지, DBMemberRepository가 구현될지는 동적으로 결정된다.
3)회원 객체 다이어그램
클래스 다이어그램과 달리, 서버가 떠서 클라이언트가 실제 사용하는 객체를 나타낸 다이어그램이다.
private Long id;
private String name;
private Grade grade;
//생성자
//getter & setter
void save(Member member);
Member findById(Long memberId);
void join(Member member);
Member findMember(Long memberId);
//MemoryMemberRepository를 생성함.
private final MemberRepository memberRepository = new MemoryMemberRepository();
다음과 같이 회원 도메인을 개발하면, MemoryMemberRepository에서 다른 저장소로 변경할 때, OCP 원칙/ DIP가 잘 지켜지지 않는다. 즉, 의존 관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 발생한다.
1) 주문 도메인 협력, 역할, 책임
할인을 위해서는 회원의 등급을 확인해야 하기 때문에, 회원 저장소에서 회원을 조회하고, 회원에 따른 할인 여부를 할인 정책에게 위임한다. 마지막으로 주문 서비스는 클라이언트에게 할인을 포함한 주문 결과를 반환한다.
2) 주문 도메인 클래스 다이어그램
3) 주문 도메인 객체 다이어그램
메모리 회원 저장소가 DB 회원 저장소를 변경 될 수 있고, 정액 할인 정책이 비율 할인 정책으로 변경 될 수 있다.
int discount(Member member, int price);
private int discountFixAmount = 1000;
@Override
public int discount(Member member, int price){
if(member.getGrade() == Grade.VIP){
return discountFixAmount;
}else{
return 0;
}
}
private Long memberId;
private String itemName;
private int itemPrice;
private int discountPrice;
//constructor, getter & setter
public int calculatePrice(){
return itemPrice - discountPrice;
}
Order createOrder(Long memberId, String itemName, int itemPrice)
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDscountPolicy();
@Override
public Order createOrder(Lont memberId, String itemName, int itemPrice){
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, discountPrice);
아직, Spring 기술을 사용하지 않고, 순수 자바로 개발하였기 때문에 어떻게 OCP/DIP, 다형성을 만족시킬 수 있도록 객체 지향의 묘미를 살리는지 궁금해지는 강의이다.
다음 글은 인프런 김영한 강사님의 스프링 강의 복습용입니다 :)