[Spring] Chapter 2. 스프링 핵심 원리 이해 1 - 주문과 할인 도메인 설계 및 개발

joyful·2021년 6월 25일
1

Java/Spring

목록 보기
3/28
post-thumbnail

들어가기 앞서

이 글은 김영한 님의 스프링 핵심 원리 - 기본편(https://www.inflearn.com/스프링-핵심-원리-기본편/dashboard)을 수강하며 학습한 내용을 정리한 글입니다. 모든 출처는 해당 강의에 있습니다.


📖 주문과 할인 도메인

✅ 설계

  • 주문과 할인 정책 요구사항

    • 회원 → 상품 주문
    • 회원 등급에 따라 할인 정책 적용 (미정)
      • VIP : 고정 금액 할인(1000원) 적용
      • 변경 가능성 ↑
      • 기본 할인 정책 미정
      • 오픈 직전까지 미정
      • 할인 적용 x 가능성 有
    • 회원 데이터(미정) : 자체 DB 구축 or 외부 시스템 연동
  • 주문 도메인 협력, 역할, 책임

    1. 주문 생성 : 클라이언트는 주문 서비스에 주문 생성을 요청
    2. 회원 조회 : 주문 서비스는 회원 저장소에서 회원 조회
      => why? 할인을 위해서는 회원 등급 필요
    3. 할인 적용 : 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임
    4. 주문 결과 반환 : 주문 서비스는 할인 결과를 포함한 주문 결과 반환

      💡 실제로는 주문 데이터를 DB에 저장해야 하나, 예제이므로 주문 결과만 반환한다.

  • 주문 도메인 전체

    • 역할구현분리하여 설계
      → 회원 저장소 및 할인 정책 유연하게 변경 가능
  • 주문 도메인 클래스 다이어그램

  • 주문 도메인 객체 다이어그램
    : 협력 관계를 그대로 재사용 가능하다.

    • 객체 다이어그램 1
      • 회원을 메모리에서 조회하고, 정액 할인 정책(고정 금액)을 지원해도 주문 서비스를 변경하지 않아도 됨
    • 객체 다이어그램 2
      • 회원을 실제 DB에서 조회하고, 정률 할인 정책(주문 금액에 따른 % 할인)을 지원해도 주문 서비스를 변경하지 않아도 됨

✅ 개발

  • 할인 정책

    • src/main/java/hello/corediscount 패키지 생성

    • 할인 정책 인터페이스

      • discount 패키지에 DiscountPolicy 인터페이스 생성
      • DiscountPolicy.java
    • 정액 할인 정책 구현체

      • discount 패키지에 FixDiscountPolicy 클래스 생성
      • DiscountPolicyimplements → 인터페이스 메소드 오버라이딩 및 할인 금액 필드 선언
      • 할인 금액 : VIP → 1000원, 일반 → x
      • FixDiscountPolicy.java

  • 주문 정책

    • src/main/java/hello/coreorder 패키지 생성

    • 주문 엔티티

      • order 패키지에 Order 클래스 생성
      • 필드 및 생성자, Getter/Setter 생성
      • 할인 적용 가격 계산 메소드(calculatePrice()) 생성
      • 필드 출력 위한 toString() 오버로딩
    • 주문 서비스 인터페이스

      • order 패키지에 OrderService 인터페이스 생성
      • OrderService.java
    • 주문 서비스 구현체

      • order 패키지에 OrderServiceImpl 클래스 생성
      • OrderServiceimplements → 인터페이스 메소드 구현
      • OrderServiceImpl.java
      • 주문 생성 요청 → 회원 정보 조회 → 할인 정책 적용 → 주문 객체 생성 및 반환
      • 메모리 회원 리포지토리고정 금액 할인 정책구현체로 생성

✅ 실행과 테스트

  • 실행

    • hello.core 패키지에 OrderApp 생성
    • OrderApp.java 코드 작성 후 실행
    • 결과

    💡 애플리케이션 로직으로 테스트 하는 것은 좋은 방법이 아니므로 JUnit 테스트를 사용하도록 한다.

  • 테스트

    • /src/test/java/hello/coreorder 패키지 생성 → order 패키지에 OrderServiceTest 생성
    • 테스트 코드 작성 후 실행
    • 결과



📖 통합 테스트

  • src/test/java 마우스 버튼 오른쪽 클릭 → Run 'All Tests' 클릭
  • 결과
profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글