start.spring.io에 접속해 프로젝트를 생성한다.
- 회원
- 회원을 가입하고 조회할 수 있다.
- 회원은 일반과 VIP 두 가지 등급이 있다.
- 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)
회원 도메인 협력 관계
회원 클래스 다이어그램
회원 객체 다이어그램
회원 도메인 협력 관계는 기획자들도 볼 수 있는 그림이다. 개발자들은 이를 바탕으로 구체화하여 회원 클래스 다이어그램을 만들어낸다. 하지만 구현체(MemoryMemberRepository, DbMemberRepository 등)는 동적으로 결정되기 때문에 클래스 다이어그램만으로는 판단하기 어렵다. 따라서 회원 객체 다이어그램이 사용된다.
회원 클래스 다이어그램을 참고한다.
src.main.java.hello.core
아래 member
패키지를 생성한다.member
패키지 아래 Grade
enum과 Member
클래스를 생성한다.<코드>
enum??
<코드>
id
, name
, grade
세 변수가 있으며 생성자(Constructor)와 getter, setter 메서드로 구성되어 있다.member
패키지 아래 MemberRepository
interface를 생성한다.<코드>
member
패키지 아래 MemberRepository
interface의 구현체 MemoryMemberRepository
를 생성한다.<코드>
member
패키지 아래 MemberService
interface를 생성한다.<코드>
member
패키지 아래 MemberService
interface의 구현체 MemberServiceImpl
를 생성한다.<코드>
private final MemberRepository memberRepository = new MemoryMemberRepository();
: 다형성에 의해 interface MemberRepository
가 아닌 Override 한 MemoryMemberRepository
가 실행된다.업캐스팅??
회원 객체 다이어그램을 참고한다. 실제로 동적으로 동작하는 것을 테스트해야 하기 때문이다.
core
아래 MemberApp
클래스를 생성한다.public static void main
이 자동으로 생성된다.System.out.println("member.getName() = " + member.getName());
과 같은 코드를 쉽게 작성할 수 있다.<코드>
member
객체가 잘 저장되었는지 테스트한다.member
객체와 이를 findMember
메소드로 검색한 객체가 일치하는지 알아본다.member = memberA\n findMember = memberA
test.java.hello.core
아래 member
패키지를 생성한다.member
패키지 아래 MemberServiceTest
클래스를 생성한다.<코드>
hello.core.MemberApp
에서의 테스트와 원리는 같다.Assertions.assertThat(member).isEqualTo(findMember);
: member
객체와 findMember
객체가 일치하는지 알아본다.org.assertj.core.api
를 import 해야한다.이러한 방식은 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있다.
- 주문과 할인 정책
- 회원은 상품을 주문할 수 있다.
- 회원 등급에 따라 할인 정책을 적용할 수 있다.
- 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있다.)
- 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정)
주문 도메인 협력, 역할, 책임
주문 도메인 전체
주문 도메인 클래스 다이어그램
주문 도메인 객체 다이어그램
src.main.java.hello.core
아래 discount
패키지를 생성한다.discount
패키지 아래 DiscountPolicy
interface를 생성한다.<코드>
discount
메소드는 할인 금액을 return 한다.discount
패키지 아래 DiscountPolicy
interface의 구현체 FixDiscountPolicy
를 생성한다.<코드>
private int discountFixAmount = 1000;
: 할인 금액이 1000원이다.public int discount(Member member, int price)
: member
객체의 Grade
가 VIP라면 1000원을 할인하고, 그렇지 않으면 할인하지 않는다.src.main.java.hello.core
아래 order
패키지를 생성한다.order
패키지 아래 Order
클래스를 생성한다.<코드>
memberId
, itemName
, itemPrice
, discountPrice
네 변수가 있으며 생성자(Constructor)와 getter, setter 메소드로 구성되어 있다.public int calculatePrice()
: 상품 가격에서 할인 가격을 빼는 메소드이다.public String toString()
: IntelliJ의 단축키 Alt+Ins의 toString()을 이용하면 쉽게 작성할 수 있다.order
패키지 아래 OrderService
interface를 생성한다.<코드>
order
패키지 아래 OrderService
interface의 구현체 OrderServiceImpl
를 생성한다.<코드>
Member member = memberRepository.findById(memberId);
: 주문이 오면 회원 정보를 먼저 조회한다.int discountPrice = discountPolicy.discount(member, itemPrice);
: 할인 정책에 회원 정보를 넘긴다. (프로젝트에 따라 등급만 넘겨도 된다)return new Order(memberId, itemName, itemPrice, discountPrice)
: Order를 생성해 반환한다.<코드>
Member member = new Member(memberId, "memberA", Grade.VIP);
: 멤버를 생성한다.Order order = orderService.createOrder(memberId, "itemA", 10000);
: 주문을 생성한다. 생성한 맴버의 id가 파라미터로 전송된다.System.out.println("order = " + order);
: Order
클래스의 toString()
메소드가 실행된다.main 함수를 이용한 테스트는 권장되지 않는다. JUnit으로 테스트를 진행한다.
test.java.hello.core
아래 order
패키지를 생성한다.order
패키지 아래 OrderServiceTest
클래스를 생성한다.<코드>
org.assertj.core.api
를 import 해야한다.본 포스팅은 김영한 강사의 스프링 핵심 원리 강의를 수강하고 요약한 것으로, 해당 강의의 영상 및 강의자료를 참고하였습니다.