[Spring 기본] 2. 스프링 핵심 원리 이해1 - 예제 만들기

강은서·2022년 7월 14일
0

Spring

목록 보기
9/11
post-thumbnail

이번 시간에는 회원 도메인과 주문/할인 도메인을 설계하고 순수한 자바로 개발을 하는 시간을 가졌다. 다형성 갖는 자바의 특성을 살리기 위한 개발을 연습하기 위해 선생님이 설정하신 상황은 다음과 같았다.

비즈니스 요구사항

회원

  • 회원을 가입하고, 조회할 수 있다.
  • 회원은 일반과 VIP 두가지 등급이 있다.
  • 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미지정)

주문과 할인

  • 회원은 상품을 주문할 수 있으며, 등급에 따라 할인 정책을 적용할 수 있다.
  • 모든 VIP는 1000원을 할인해주는 고정 금액 할인이 들어갈 수 있고, 비율로 할인이 들어 갈 수 있다. (미지정)

회원 도메인

회원 도메인 설계

1) 회원 도메인 협력 관계
기획자와 함께 보는 표

2) 회원 클래스 다이어그램
MemoryMemberRepository가 구현될지, DBMemberRepository가 구현될지는 동적으로 결정된다.

3)회원 객체 다이어그램
클래스 다이어그램과 달리, 서버가 떠서 클라이언트가 실제 사용하는 객체를 나타낸 다이어그램이다.

회원 엔티티

  • Member 클래스 생성
    private Long id;
    private String name;
    private Grade grade;
    
    //생성자
    //getter & setter

회원 저장소

  • MemberRepository 인터페이스를 생성
	void save(Member member);
    Member findById(Long memberId);
  • MemoryMemberRepository 구현체 생성를 생성하여 인터페이스를 구현한다.

회원 서비스

  • MemberService 인터페이스를 생성
	void join(Member member);
    Member findMember(Long memberId);
  • MemberServiceIimpl 구현체를 생성하여 인터페이스를 구현한다.
	//MemoryMemberRepository를 생성함.
	private final MemberRepository memberRepository = new MemoryMemberRepository();

다음과 같이 회원 도메인을 개발하면, MemoryMemberRepository에서 다른 저장소로 변경할 때, OCP 원칙/ DIP가 잘 지켜지지 않는다. 즉, 의존 관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 발생한다.

주문과 할인

주문과 할인 설계

1) 주문 도메인 협력, 역할, 책임
할인을 위해서는 회원의 등급을 확인해야 하기 때문에, 회원 저장소에서 회원을 조회하고, 회원에 따른 할인 여부를 할인 정책에게 위임한다. 마지막으로 주문 서비스는 클라이언트에게 할인을 포함한 주문 결과를 반환한다.

2) 주문 도메인 클래스 다이어그램

3) 주문 도메인 객체 다이어그램
메모리 회원 저장소가 DB 회원 저장소를 변경 될 수 있고, 정액 할인 정책이 비율 할인 정책으로 변경 될 수 있다.

할인 정책

  • 할인 정책 인터페이스 생성
int discount(Member member, int price);
  • FixDiscountPolicy 정액 할인 구현체
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;
}

주문 서비스

  • OrderService 인터페이스 생성
Order createOrder(Long memberId, String itemName, int itemPrice)
  • OrderServiceImpl 구현체 생성

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, 다형성을 만족시킬 수 있도록 객체 지향의 묘미를 살리는지 궁금해지는 강의이다.


다음 글은 인프런 김영한 강사님의 스프링 강의 복습용입니다 :)

0개의 댓글