서비스 구성
커피 판매 애플리케이션 설계하기
- 전날 오후 2시 ~ 오후 2시까지의 주문을 모아서 처리하기.
- 별도 회원관리 X.
e-mail로 고객을 구분하며, 하나의 e-mail로 하루 여러번 주문을 받아도 하나로 합쳐 다음날 배송을 보낸다.
- 고객에게 "당일 오후 2시 이후의 주문은 다음날 배송을 시작합니다." 라고 알려준다.

- 스프링 기반으로 설계
- GC Coffee : 상호명
- Spring API Server를 만들고, 이 서버가 관리자페이지를 제공.
- 이 서버는 REST API를 제공하고 고객은 관리자페이지에 접근하는 것이 아닌,
React.js APP에서 주문을 하게된다.
React.js APP는 REST API를 통해 서버에 요청하고, 응답을 전달받을 수 있다.
- 서버는 배후의 DB와 연결되어있고, 실제로 데이터는 DB에서 관리하고 있다.

- 새로운 프로젝트를 만들어주자.
미리 만들어둔 경로에 프로젝트를 생성한다.

- 다음은 스타터 패키지를 골라준다.
- Web → Spring Web
Template Engines → Thymeleaf
SQL → JDBC API, MySQL Driver
을 골라준다.


- 실행되는 클래스가 제공되지만, 실행되지는 않는다.
별도 설정이 없다면 h2데이터베이스를 사용하는데, 프로젝트를 만들면서 h2데이터베이스를 추가하지 않았기 때문이다.
pom.xml에 가서 추가해주도록 하자.


상품과 주문에 대한 도메인 엔터티 생성하기
model package 구성
- model 패키지를 만들어주고 Product와 Order을 구성해주자.
상품(product)에 대한 엔티티 생성
- ID : 변경되어선 안되기 때문에 final로 생성
- Name : 변경될수도 있다.
- Category : 지금은 제품에 커피콩뿐이지만, 추후 빵이나 음료가 추가될수도 있기 때문에 카테고리를 추가해둔다.
동적으로 추가할수도 있지만, enum과 같이 정적으로 추가하는 것도 가능하다.
- price : 우리나라의 경우는 돈이 정수로 떨어지지만, 외국의 경우 소수점 이하의 돈이 생길수도 있기 때문에 주의해야한다.
- description : 상품 설명 등
- createdAt : 상품 생성 시간
- updatedAt : 상품 업로드 및 변경 시간


- 지금은 Category 안에 커피콩만 존재한다.
- 생성자를 만들고
처음 product를 생성하는데 필수적인 정보만 갖는 생성자를 추가적으로 만들어준다.


- setter 는 변경이 가능한 항목에 대해서만 추가해준다.
updatedAt은 값이 변경될 때마다 수정되도록 설정해준다.

주문(Order)에 대한 엔터티 구성
- ID : 주문에도 ID가 필요하다.
- Email : 회원관리를 email로 하기 때문에, Email은 필수.
- address, postcode : 주소애 대해 따로 정의하는 것도 가능하지만, 지금은 일단 String으로 전달받는다. 주문을 바로 전달받을 수 있도록 필드로 추가한다.
- OrderItem : 상세 주문 아이템들을 List로 전달받는다.
- OrderStatus : 주문의 상태
- createdAt : 주문이 만들어진 시간
- updatedAt : 주문이 변경된 시간.


- 생성자 추가
- getter와 setter도 추가해준다.


- String을 검증하기 위해서
Assert 사용.
Assert.notNull(address, ~ )
- address는 notNull을 검증하는 코드
Assert.isTrue(address.length() > 4 && address.length() < 50, ~ )
- 괄호 안에 표현식 삽입 가능.
- 주소에 대해서 RegExr, 정규표현식을 이용하여 메시지 포맷이 맞는지 확인할수도 있다.
Assert.isTrue(checkAddress(address, ~ );
- 새로운 boolean 메서드
checkAddress를 정의하고
레겍스Pattern.matches(" ", address)를 이용해서 매치가 되면 address가 반환된다.
- 밸류 오브젝트를 다룰 때는
equals & hashCode를 구현해주는 것이 좋고, toString도 해주면 좋다.
- 레겍스, 정규표현식
Community Patterns에서 원하는 형식을 찾을 수 있다.

- Order 엔터티를 생성하고, Email을 밸류 오브젝트로 정의했다.
Email 테스트해보기

- 형식에 맞지 않게 넣었더니 오류가 발생한다.
형식에 맞지 않은 이메일은 오류를 발생시키는 것을 확인할 수 있다.



- 두 개의 Email을 작성했을 때 Equality가 작동하는지 테스트