주문 서비스 개발

1.OrderService 클래스 생성

 

2.주문서비스에서 주문 작성

-주문서비스를 받을 때 이루어지는 정보들 작성

 

-엔티티조회

-배송정보 생성

-주문상품 생성

-주문생성

 

-주문저장

*주문저장에 대한 설명

Cascade

-이전에 order클래스에서 설정해준 Casacade.All 설정 때문에 강제로 Persist를 해준다.

-다른 곳에서도 delivery와 같은 정보를 다른 엔티티에서 참조하거나할때에 cascade를 사용해서는 안된다.

-한 사이클 내에서만 private owner개념으로 사용한다면 casacade를 사용해도 된다.

 

사진

 

정리

엔티티조회

-findOne으로 member,item 엔티티조회를 한다. 이것 때문에 의존관계를 넣었다.

 

배송정보생성

-static 생성메서드를 통해 주문상품 생성

-static 생성메서드를 통해 주문 생성

 

주문저장

-주문 저장시 cascade옵션으로 인해 delivery, orderitem과 자동으로 db persist가 된다.

정확히는, 트랜잭션이 커밋 되는 시점에 flush 가일어나면 insertdb에 들어가게 된다.

 

참고

생성로직을 다르게 작성하면(생성필드를 추가작성한다던가) 다른 스타일로 작성할 때에는 유지보수하기가 어려워진다.

그래서 다른 로직이나, 스타일로 작성하지 못하도록 OrderItem클래스에서 Constructor를 만들때에 protected를 만들어준다. jpaprotected까지 기본생성할 수 있도록 스펙상 허용한다.

 

Protected OrderItem() {

}

 

이럴 경우 OrderService클래스에서 다른 스타일로 쓸 경우 작성된 코드에 빨간밑줄이 생긴다.

 

참고2

생성메서드에서 주문생성에 대해 수정을 하도록 묵시적으로 요구할 때에 작성하는 코드

Order클래스에서 하기와 같이 작성

 

@NoArgsConstructor(access = AccessLevel.PROTECTED)

public class Order{

 

OrderService클래스에서 직접 생성할 경우에 new Order() 로 작성할 경우 빨간밑줄이 생긴다.

이와 같이 코드를 제약을 걸어주는 것이 좋은 설계와 유지보수로 끌어갈 수 있다.

 

3 .주문서비스취소 구문 작성

-취소구문작성

-취소구문에서 cancel에서 흐름은 다음으로 넘어간다.

 

1차 흐름-Order클래스

this.setStatus(OrderStatus.CANCEL);

for (OrderItem orderItem : orderItems) {

orderItem.cancel();

}

 

2차흐름-OrderItem클래스

public void cancel() {

getItem().upStock(count);

}

 

3.2.sqljpa일 때에 차이점

-jpa 장점을 설명

sql은 일일이 수작업을 해주어야 한다.

 

 

참고

jpa orm 사용시 자주 사용하는 패턴

-엔티티의 핵심 비즈니스 로직이 있고 서비스 계층은 단순히 호출(save로 위임하는 형태로 흘러간다.

 엔티티가 비즈니스로직을 가지고 객체지향의 특성을 활용하는 것을 도메인 모델 패턴이라고 한다.

 

sql 사용시 자주 사용하는 패턴

-엔티티에는 비즈니스 로직이 거의 없다거나 서비스 계층에서 대부분의 비즈니스 로직을 처리하는것을

 트랜잭션 스크립트 패턴이라고 한다.

 

무엇이 유지보수 하기 좋은지를 고민 하여 두 개의 패턴을 사용할 것!

 

사진

 

주문 리포지토리 개발

 

1. Repository 패키지에 OrderRepository 클래스를 생성한다.

 

사진

주문도메인개발

 

주문도메인이 제일 중요!

-비즈니스로직들이 얽혀서 돌아가는 것을 jpa나 엔티티를 가지고 어떻게 풀어내는지 알 수 있다.

-트랜잭션 스크립트 패턴과 도메인모델패턴을 코드를 통해 이해 할 수 있다.

 

1.주문 도메인 개발

구현 기능

-상품 주문

-주문 내역 조회

-주문 취소

 

순서

-주문 엔티티, 주문상품 엔티티 개발 (핵심비즈니스로직)

-주문 리포지토리 개발

-주문 서비스 개발

-주문 검색 기능 개발

-주문 기능 테스트

 

주문,주문상품 엔티티 개발

1. 주문클래스에서 생성메서드 생성

 

설명

-Order가 연관관계를 걸면서 세팅이 되고, 상태랑 주문시간 정보까지 정리가 되어서 세팅이 된다.

 

중요!

앞으로 무언가 생성하는 시점을 변경해야 하면 다른데서가 아닌 이곳에서만 바꾸면 되기 때문에 이렇게 작성하는 것이 중요하다.

 

실습사진

 

2.주문클래스에서 비즈니스로직 주문취소 작성

설명

a.완료된 배송은 취소 불가

 

b.주문하고 난 뒤에 취소

-주문한 상품이 2개이면 취소시 2개 각각 취소를 시켜주어야 한다.

 OrderItem에 취소구문작성해주어야 함.

 

c. OrderItem클래스에서 취소구문작성

-주문취소로 인해 orderItem에도 비즈니스 로직이 생겼다.

-취소하게 됨으로써 주문하기전에 기존 수량으로 다시 올라간다.

 

d. 조회로직(주문상품 전체 가격조회)

-주문총가격은 주문가격 및 수량으로 계산이 되어야 한다.

 

조회로직 간소화하는 방법

1. for지점에서 alt + enter -> sum,

2. inttotalprice에서 ctrl + alt +n 사용 stream로 변경)

3. 최종정리

 

실습사진

 

e.조회로직의 OrderItemgetTotalPricealt + enter이용하여 OrderItem getTotalPrice메서드 생성

-주문총가격은 주문가격 및 수량으로 계산되어야함을 염두에 두고 작성한다.

 

사진

 

f. 주문이 생성될때에 생성되는 OrderItem에 대한 생성메서드를 OrderItem클래스에서 작성

-Order클래스에서 작성된 생성메서드 createOrder에서 받아오는 orderItem 정보를 위해 생성메서드를 작성함

-주문이 생성되기 전에 기존에 남아있는 수량에서 OrderItem에서 주문한 수량만큼 수량이

 내려가고 order클래스에서 createOrder(신규주문생성)으로 정보가 넘어가게 된다.

*단순히 비즈니스적인 면에서 코드를 작성을 할 때에 위에처럼 그렇게 되어야 논리상 말이 맞.

 실제로는 OrderItem이 넘어 올 때 파라미터나 DTO를 이용하여 복잡하게 구성될 것 같다.

 

사진

기능 설명정리

생성메서드

밖에서 새로운 Order를 받아와서 set하는 방식이 아닌

주문이 들어오는 시작점부터 createOrder를 호출해서

Order클래스 안에서 Order에 대한 비즈니스로직을 완료한다.

주문생성과 관련된 문제가 있을 때 이곳을 확인하면 된다.

 

주문취소

취소불가

-이미 배송완료된 상품 취소는 불가하다는 비즈니스로직에 대한 체크로직이 엔티티 안에 있다.

 

취소

-취소 될시에 해당 아이템취소 수량만큼 수량이 다시 늘어나게 된다.

 

조회로직

전체주문가격조회

-주문가격과 주문수량을 곱하기 해서 최종 주문가격이 조회가 된다.

 

 

+ Recent posts