프로젝트 (Java)/예약마켓

[프로젝트] 48. 트러블 슈팅 - 예약 구매 상품의 시간 제한 처리

hihyuk 2024. 2. 13. 11:08

문제 상황

프로젝트 개발 과정에서 예약 구매 기능을 구현하던 중, 예약 구매 상품이 예약 가능 시간 외에도 구매될 수 있는 문제가 발생했습니다. 이는 사용자가 설정된 예약 시간을 무시하고 어떤 시간에든 예약 구매 상품을 구매할 수 있게 함으로써, 예약 시스템의 본래 목적을 훼손하는 심각한 오류였습니다.

 

문제 진단

시스템을 면밀히 검토한 결과, 예약 상품을 구매하는 과정에서 해당 상품의 예약 가능 시간을 검증하는 로직이 누락되었음을 확인했습니다. 따라서, 사용자가 예약 상품을 예약 가능 시간 외에도 주문할 수 있게 되어, 예약 시스템의 기능성이 크게 저하되었습니다.

 

해결 과정

이 문제를 해결하기 위해, OrderServiceaddOrderItemsToOrder 메소드 내에 예약 상품의 예약 가능 시간을 검증하는 로직을 추가했습니다. 주문 항목을 주문에 추가하기 전에, 주문하려는 상품이 예약 상품(ReservedItem)인지 확인하고, 해당 상품이 예약 가능 시간 내에 있는지 검증하는 과정을 포함시켰습니다.

private void addOrderItemsToOrder(Order order, List<CreateOrderItemDto> orderItemDtos) {
    for (CreateOrderItemDto dto : orderItemDtos) {
        Item item = findByItemId(dto.getItemId());
        if (item instanceof ReservedItem) {
            ReservedItem reservedItem = (ReservedItem) item;
            validateReservedItem(reservedItem);
        }
        OrderItem orderItem = dto.toEntity(item);
        order.addOrderItem(orderItem);
    }
}

private void validateReservedItem(ReservedItem reservedItem) {
    LocalDateTime now = LocalDateTime.now();
    if (now.isBefore(reservedItem.getReservationStart()) || now.isAfter(reservedItem.getReservationEnd())) {
        throw new IllegalStateException("예약 가능한 시간이 아닙니다.");
    }
}

validateReservedItem 메소드를 통해 현재 시간이 예약 상품의 예약 가능 시간 내에 있는지 확인하고, 그렇지 않은 경우 IllegalStateException을 발생시켜 구매 요청을 거부합니다.

 

결론 및 고찰

이번 트러블슈팅을 통해, 예약 구매 상품이 예약 가능 시간 외에 구매될 수 없도록 예외 처리를 추가함으로써 문제를 성공적으로 해결했습니다. 이러한 예외 처리 로직의 도입은 예약 시스템의 신뢰성을 보장하고, 사용자가 예약 규칙을 준수하도록 유도하는 데 중요한 역할을 합니다.

이 경험은 개발 과정에서 예외 사항을 충분히 고려하고, 시스템의 핵심 기능을 보호하기 위한 로직을 철저히 구현하는 것의 중요성을 다시 한번 상기시켜 줍니다. 또한, 예외 처리를 통해 시스템의 안정성과 사용자의 만족도를 동시에 높일 수 있음을 보여줍니다.