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

jinhxxxxkim·2023년 3월 6일
0

Spring핵심

목록 보기
2/9
post-thumbnail

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

1. 회원 도메인

설계

  • 회원은 회원가입, 회원조회를 할 수 있다.
  • 회원 정보에 대한 저장은 아직 미정이다.

회원 도메인 협력관계

  • "회원서비스", "회원저장소"는 모두 역할이다.
  • 회원 도메인의 전체적인 그림

회원 클래스 다이어그램

  • 실제 구현레벨에서의 다이어그램
  • "역할"인 회원서비스와 회원 저장소는 MemberService, MemberRepository라는 인터페이스로 만들며, 이에대한 구현은 MemberServiceImpl, MemoryMemberReopsitory 또는 DbMemberRepository 클래스로 한다.

회원 객체 다이어그램

  • 객체 간의 참조관계를 나타내는 다이어그램

구현

유료 강의이므로 소스코드의 일부는 생략하였다.

Member 엔티티

  • 회원은 ID, 이름 그리고 등급을 속성으로 갖는다.
package hello.core.member;

public class Member {
    private Long id;
    private String name;
    private Grade grade;
	// Constructor
    ...
    
	// Getter and Setter
    ...
}

회원 저장소 인터페이스

  • 회원을 저장 및 조회하는 메소드가 있다.
public interface MemberRepository {
    void save(Member member);
    Member findById(Long memberId);
}

메모리 회원 저장소 구현체

  • 저장소가 아직 미정이므로 메모리 기반 저장소를 사용한다.
  • HashMap을 사용하여 정보를 저장한다.
  • HashMap은 동시성 이슈가 발생할 수 있다. 이런 경우 ConcurrentHashMap 을 사용한다.
import java.util.HashMap;
import java.util.Map;

public class MemoryMemberRepository implements MemberRepository{

    private static final Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {...}

    @Override
    public Member findById(Long memberId) {...}
}

회원 서비스 인터페이스

  • 회원가입, 회원조회 기능이 있다.
  • 회원 조회는 회원의 ID를 통해 조회한다.
import java.util.List;

public interface MemberService {
    void join(Member member);
    Member findMember(Long memberId);
}

회원 서비스 구현체

  • 회원 저장소를 MemoryMemberRepository로 선택하여 생성한다.
  • 회원 저장소에 저장 메소드 save(), 조회 메소드 findById()를 호출한다.
public class MemberServiceImpl implements MemberService{
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }
    
    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }

2. 주문과 할인 도메인

  • 회원은 주문을 할 수 있다.
  • 회원의 등급에 따라 할인 정책을 정할 수 있다.
  • 할인 정책의 경우, 고정 금액할인을 적용하되 추후 바뀔 수 있다.

설계

주문 도메인 협력관계

  • 클라이언트는 주문 서비스에 주문 생성을 요청한다.
  • 할인 여부를 확인하기 위해 회원 저장소에서 회원 정보를 조회한다.
  • 주문 서비스는 할인 여부를 할인정책에 위임한다.
  • 주문 서비스는 할인 결과를 포함한 주문 결과를 반환한다.

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

  • 실제 구현레벨에서의 다이어그램
  • "역할"인 주문서비스, 할인정책은 OrderServiceImpl, DiscountPolicy라는 인터페이스로 만들며, 이에대한 구현은 OrderServiceImpl, FixDiscountPolicy 또는 RateDiscountPolicy 클래스로 한다.
  • 전체적인 그림을 보게되면, 역할과 구현의 분리를 통해 회원 저장소, 할인정책을 유연하게 변경할 수 있다.

회원 객체 다이어그램

  • 객체 간의 참조관계를 나타내는 다이어그램
  • 회원정보를 조회하는 저장소 또는 할인정책이 변경되어도 주문 서비스를 변경하지않고, 협력관계를 그대로 유지할 수 있다.

구현

할인정책 인터페이스

  • 할인된 금액을 반환하는 discount() 메소드가 있다.
public interface DiscountPolicy {
    int discount(Member member, int price);
}

할인정책(정액) 구현체

  • 회원의 등금이 VIP라면 할인을 적용하고 아니라면 할인을 적용하지 않는다.
public class FixDiscountPolicy implements DiscountPolicy {
    
    private int discountFixAmount = 1000; //1000원 할인
    
    @Override
    public int discount(Member member, int price) {...}
}

주문 엔티티

  • 주문은 회원ID, 상품명, 상품가격, 할인가격을 속성으로 갖는다.
public class Order {
    private Long memberId;
    private String itemName;
    private int itemPrice;
    private int discountPrice;
	
    public int calculatePrice(){
        return itemPrice - discountPrice;
    }
    // Constructor
    ...
    
    /// Getter and Setter
    ..
}

주문 서비스 인터페이스

  • 주문 서비스는 회원이 요청한 정보를 바탕으로 주문 객체를 생성하는 createOrder() 메소드가 있다.
public interface OrderService {
    Order createOrder(Long memberId, String itemName, int itemPrice);
}

주문 서비스 구현체

  • 클라이언트가 주문 생성을 요청하면, 요청한 정보 중 ID를 바탕으로 회원 정보 회원 저장소 memberRepository에서 검색한다.
  • 검색한 회원을 가격과 함께 할인정책 discountPolicy에게 넘기며 위임한다.
  • 할인정책 discountPolicy가 반환한 할인금액을 바탕으로 주문 Order 객체를 반환한다.
public class OrderServiceImpl implements OrderService{
    private final MemberRepository memberRepository = new MemoryMemberRepository();
	private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    
    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {...}
}

출처: 인프런 스프링 핵심 원리 - 기본편 (김영한)
인프런 스프링 핵심 원리

0개의 댓글