SpringBoot 클론코딩 - 1일차

김재현·2022년 8월 30일

Programmers 프로젝트

목록 보기
1/9

서비스 구성

커피 판매 애플리케이션 설계하기

  • 전날 오후 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를 생성하는데 필수적인 정보만 갖는 생성자를 추가적으로 만들어준다.

  • getter 를 모두 추가해주고

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

  • 상품에 대한 엔터티를 설정했다.

주문(Order)에 대한 엔터티 구성

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

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

  • OrderStatus를 구성해준다.

  • Email에 대한 밸류 오브젝트를 직접 생성해보자.
    Email은 Email 포맷이 있기 때문. 단순 String과 다른 특별한 포맷이 있기 때문에 Email을 따로 작성해주는것이 안전하다.

  • 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의 테스트를 생성해준다.

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

  • 오류를 발생시키는 Email 형식

  • 올바른 Email 형식

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

0개의 댓글