[SpringBoot&JPA] ⭐️ 주문 도메인 개발

윤경·2021년 10월 25일
0

Spring Boot

목록 보기
47/79
post-thumbnail

[1] 주문, 주문상품 엔티티 개발

주문 엔티티

✔️ 기능

  • 생성 메소드 - createOrder()
    : 주문 엔티티를 생성할 때 사용
    주문 회원, 배송 정보, 주문 상품의 정보를 받아 실제 주문 엔티티를 생성
  • 주문 취소 - cancel()
    : 주문 취소시 사용
    주문 상태를 취소로 변경. 주문 상품에 주문 취소를 알림.
    만약 이미 배송이 완료된 상품이면 주문을 취소하지 못하도록 예외 발생
  • 전체 주문 가격 조회
    : 주문시 사용한 전체 주문 가격을 조회
    전체 주문 가격을 알기 위해서는 각각의 주문 상품 가격을 알아야 한다.
    로직을 보면 연관된 주문 상품들의 가격을 조회해 더한 값을 반환한다. (실무에서는 주로 주문에 전체 주문 가격 필드를 두고 역정규화)

주문상품 엔티티

✔️ 기능

  • 생성 메소드 - createOrderItem()
    : 주문 상품, 가격, 수량 정보를 사용해 주문 상품 엔티티를 생성
    그리고 item.removeStock(count)를 호출해 주문한 수량만큼 상품의 재고를 줄임
  • 주문 취소 - cancel()
    : getItem().addStock(count)를 호출해 취소한 주문 수량만큼 상품의 재고를 증가(원상복구) 시킨다.
  • 주문 가격 조회 - getTotalPrice()
    : 주문 가격에 수량을 곱한 값을 반환

[2] 주문 리포지토리 개발

주문 리포지토리에 주문 엔티티를 저장, 검색하는 기능이 있다.
주석처리된 findAll(OrderSearch orderSearch)는 추후 개발할 것


[3] 주문 서비스 개발

(참고)orderitem은 order에서만 참조. 다른 곳에서는 참조하지 않음.

주문 서비스는 주문 엔티티주문 상품 엔티티의 비즈니스 로직을 활용해 주문, 주문취소, 주문내역 검색 기능을 제공

(예제를 단순화하기 위해 단 하나의 상품만을 주문할 수 있도록 하였음)

✔️ 기능

  • 주문 - order()
    : 주문하는 회원 식별자, 상품 식별자, 주문 수량 정보를 받아 실제 주문 엔티티를 생성한 후 저장
  • 주문 취소 - cancelOrder()
    : 주문 식별자를 받아 주문 엔티티를 조회한 후 주문 엔티티에 주문 취소를 요청
  • 주문 검색 - findOrders()
    : OrderSearch라는 검색 조건을 가진 객체로 주문 엔티티를 검색
    (추후 개발)

📌

주문 서비스의 주문과 주문 취소 메소드를 보면 비즈니스 로직 대부분이 엔티티에 있다.
서비스 계층은 단순히 엔티티에 필요한 요청을 위임하는 역할을 수행한다.
➡️ 엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 것 = 도메인 모델 패턴

반대로 엔티티에는 비즈니스 로직이 거의 없고
➡️ 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것 = 트랜잭션 스크립트 패턴

옳고 그름을 나누기 보다는 상황별로 사용해야 하는 패턴이 다름


[4] 주문 기능 테스트

목표

  • 상품 주문 성공
  • 상품 주문시 재고 수량 초과 불가
  • 주문 취소 성공

단축키

option + command + M: 예제의 경우 Member객체를 계속 생성하기 귀찮아서 아예 만들어둠
option + command + P: 파라미터로 꺼내기

각각의 테스트가 끝나면 롤백되기 때문에 동시에 세 테스트를 모두 돌려도 통과되어야 한다.(확인)

테스트 성공


[5] 주문 검색 기능 개발

JPA에서 동적 쿼리를 어떻게 해결하느냐.

JPQL (비추)

(코드는 깃허브-주문 도메인 개발를 참조)

JPA Criteria (비추)

(코드는 깃허브-주문 도메인 개발를 참조)


profile
개발 바보 이사 중

0개의 댓글