1. 비즈니스 요구사항과 설계
- 회원
- 회원은 가입하고 조회 가능
- 회원은 일반과 VIP 두 가지 등급 존재
- 회원 데이터는 자체 DB를 구축할 수도 있고, 외부 시스템과 연동할 수도 있음 (미확정) - 주문과 할인 정책
- 회원은 상품을 주문
- 회원 등급에 따라 할인 정책 적용
- 할인 정책은 모든 VIP는 1000원 할인해주는 고정 금액 할인 적용 (나중에 변경 가능)
- 할인 정책은 변경 가능성 높음, 기본 할인 정책을 아직 정하지 못했고 할인을 적용하지 않을 수도 있음 (미확정) - 회원 데이터, 할인 정책 변동성 높음 ⇒ 인터페이스 만들고 구현체로 바꿀 수 있게 설계
2. 회원 도메인 설계
- 회원 도메인 요구사항
- 회원은 가입하고 조회 가능
- 회원은 일반과 VIP 두 가지 등급 존재
- 회원 데이터는 자체 DB를 구축할 수도 있고, 외부 시스템과 연동할 수도 있음 (미확정)
→ 회원 데이터에 접근 할 수 있는 계층을 따로 만들기 위해 회원 저장소라는 인터페이스 설계
3. 회원 도메인 개발
※ 참고
: HashMap은 동시성 이슈 발생 가능성 있음 ⇒ ConcurrentHashMap 사용
: 아래는 간단한 예제임으로 임시적으로 HashMap 사용함
# 회원 서비스 구현체
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);
}
}
4. 회원 도메인 실행과 테스트
- 문제점
- 다른 저장소로 변경 시, OCP 원칙 위배
- DIP 위배 → 인터페이스와 구현체 모두 의존
# 회원가입 테스트
public class MemberServiceTest {
MemberService memberService = new MemberServiceImpl();
@Test
void join(){
//given
Member member = new Member(1L, "memberA", Grade.VIP);
//when
memberService.join(member);
Member findMember = memberService.findMember(1L);
//then
Assertions.assertThat(member).isEqualTo(findMember);
}
}
5. 주문과 할인 도메인 설계
- 주문과 할인 정책
- 회원은 상품을 주문
- 회원 등급에 따라 할인 정책 적용
- 할인 정책은 모든 VIP는 1000원 할인해주는 고정 금액 할인 적용 (나중에 변경 가능)
- 할인 정책은 변경 가능성 높음, 기본 할인 정책을 아직 정하지 못했고 할인을 적용하지 않을 수도 있음 (미확정) - 주문 도메인
1. 주문 생성 : 클라이언트는 주문 서비스에 주문 생성을 요청
2. 회원 조회 : 할인을 위해서는 회원 등급 필요, 주문 서비스는 회원 저장소에서 회원을 조회
3. 할인 적용 : 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임
4. 주문 결과 반환 : 주문 서비스는 할인 결과를 포함한 주문 결과를 반환 - 역할과 구현 분리
→ 유연하게 변경 가능, 협력 관계 재사용 가능
6. 주문과 할인 도메인 개발
# 주문 서비스 구현체
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) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
7. 주문과 할인 도메인 실행과 테스트
# 주문과 할인 정책 테스트
public class OrderServiceTest {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
@Test
void createOrder(){
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
}
}
[ 출처 ]
'Spring > 개념' 카테고리의 다른 글
[스프링기본] CH03. 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2021.08.31 |
---|---|
[스프링기본] CH01. 객체지향설계와 스프링 (0) | 2021.08.16 |
[스프링입문] CH07. AOP (0) | 2021.08.13 |
[스프링입문] CH06. 스프링 DB 접근 기술 (0) | 2021.08.13 |
[스프링입문] CH05. 회원 관리 예제 - 웹MVC 개발 (0) | 2021.08.10 |
댓글