## 문제
- 고객이 **취소된 주문 목록**을 조회하려고 할 때, **취소된 주문 목록**이 제대로 조회되지 않는 문제 발생.
- 주문 검색 (고객이 취소된 주문 목록을 조회) api
- GET /api/v1/orders/search?orderStatus=ORDER_CANCELED&page=0&size=10&sort=createdAt,asc
## 해결하려 접근한 방법
- 기존 주문 취소 로직에 **논리 오류**가 있는지 분석.
- **주문 취소**와 **주문 삭제**의 비즈니스 로직이 혼재되어 있는지 확인.
## 원인
- 기존 주문 취소 로직에서는 **"주문 삭제"** 와 **"주문 취소"** 를 동일한 기능으로 판단하여 **2가지 작업을 동시에 수행**.
1. **주문 상태 변경:** 주문의 상태 값을 `ORDER_CANCELED` 로 변경.
2. **논리적 삭제:** `addDeletedField()` 메서드를 통해 주문 목록을 DB에서 **논리적 삭제**.
- 이로 인해, 고객이 취소한 주문 목록(상태 값이 `ORDER_CANCELED`)을 조회할 때, DB에서는 논리적으로 삭제된 주문이므로 **조회되지 않는 문제** 발생.
## 해결 방법
- 기존 주문 취소 비즈니스 로직을 **"주문 삭제"** 와 **"주문 취소"** 로 **별도의 기능**으로 분리.
1. **주문 취소 로직:**
- **음식점 사장님** 입장에서 주문을 **접수할지, 취소할지** 결정할 때 사용.
2. **주문 삭제 로직:**
- **관리자** 입장에서 데이터를 DB에서 **논리적 삭제**.할때 사용
- 비즈니스 로직을 **명확하게 분리**함으로써 고객이 취소된 주문 목록도 올바르게 조회할 수 있도록 개선.
## 기존 로직
- **주문 삭제** cancel() 메서드에서 주문의 상태 값 변경 및 논리적 삭제가 작업이 동시에 적용됨.
/**
* 주문 삭제(취소)
*/
public void cancel() {
// 주문 취소 상태로 수정
this.orderStatus = OrderStatus.ORDER_CANCELED;
// 주문 논리적 삭제 처리
this.addDeletedField(user.getId());
// 주문 상품 논리적 삭제 처리
for (OrderProduct orderProduct : orderProductList) {
orderProduct.addDeletedField(user.getId());
}
}
## 수정된 로직
- **주문 취소**와 **주문 삭제**를 **별도의 메서드**로 분리하여 각각의 역할을 명확하게 정의.
- `cancel()` 메서드: **주문 상태**만 `ORDER_CANCELED`로 변경. (취소)
- `deleteOrder()` 메서드: **논리적 삭제**만 처리. (삭제)
// 주문 취소
public void cancel() {
// 주문 생성 후 5분 이내에만 취소 가능
if (!isCancelUpdate()) {
throw new CustomException(OrderErrorCode.CANCEL_UPDATE_TIME_EXCEEDED);
}
// 주문 취소 상태로 수정
this.orderStatus = OrderStatus.ORDER_CANCELED;
}
/**
* 주문 삭제
*/
public void deleteOrder(Long loginUserId) {
// 주문 논리적 삭제 처리
this.addDeletedField(loginUserId);
// 주문 상품 논리적 삭제 처리
for (OrderProduct orderProduct : orderProductList) {
orderProduct.addDeletedField(loginUserId);
}
}
댓글