shipmentId 컬럼을 추가하였다.shipmentId는 같은 날, 같은 유저의 READY 상태 주문을 기준으로 동일하게 부여된다.Order.java)@Column(nullable = false)
private Long shipmentId;
shipmentId 결정 로직 (OrderService.java)
// 오늘 READY 주문 기준 shipmentId 결정
LocalDateTime startOfToday = LocalDate.now().atStartOfDay();
LocalDateTime endOfToday = LocalDate.now().atTime(23, 59, 59);
Long shipmentId = orderRepository
.findFirstByUserAndStatusAndOrderDateBetween(
user,
OrderStatus.READY,
startOfToday,
endOfToday
)
.map(Order::getShipmentId)
.orElseGet(() -> System.currentTimeMillis());
READY 상태 주문이 있다면shipmentId를 그대로 사용한다.READY 상태 주문이 없다면System.currentTimeMillis() 값을 사용해shipmentId를 생성한다.COMPLETED로 변경OrderScheduler를 작성하였다.READYDELIVERINGDELIVERING 상태에서 하루 경과 → COMPLETEDOrderScheduler.java@Component
@RequiredArgsConstructor
public class OrderScheduler {
private final OrderRepository orderRepository;
@Scheduled(cron = "0 0 14 * * *")
@Transactional
public void startDelivery() {
List<Order> readyOrders =
orderRepository.findAllByStatus(OrderStatus.READY);
readyOrders.forEach(order ->
order.changeStatus(OrderStatus.DELIVERING)
);
}
@Scheduled(cron = "0 0 2 * * *")
@Transactional
public void completeDelivery() {
List<Order> deliveringOrders =
orderRepository.findAllByStatus(OrderStatus.DELIVERING);
deliveringOrders.forEach(order ->
order.changeStatus(OrderStatus.COMPLETED)
);
}
}
status = COMPLETED 이고 주문일자가 2일 지난 경우 스케줄러로 삭제OrderCleanupScheduler를 통해 오래된 주문 데이터를 정리한다.COMPLETED 상태이면서 주문일자가 2일이 지난 주문만 삭제되도록 조건을 추가하였다.OrderCleanupScheduler.java@Transactional
@Scheduled(cron = "0 0 3 * * *")
public void deleteOldOrders() {
LocalDateTime twoDaysAgo = LocalDateTime.now().minusDays(2);
List<Order> oldOrders =
orderRepository.findAllByStatusAndOrderDateBefore(
OrderStatus.COMPLETED,
twoDaysAgo
);
for (Order order : oldOrders) {
User user = order.getUser();
orderRepository.delete(order);
if (!orderRepository.existsByUser(user)) {
userRepository.delete(user);
}
}
}

shipmentId 추가 후 응답 구조 변경shipmentId 필드를 추가하였다.