상품 관리 시스템에서 판매 중지 또는 판매 불가능한 상품(테스트용 상품 등)을 데이터베이스 완전히 삭제하는 방식으로 사용하려고 했다. 상품 데이터를 삭제하게 되면 이전 판매 기록이나 상품 정보를 참조할 수 없는 문제가 발생할 수 있었다.
1. 데이터를 완전히 삭제하는 방식은 다음과 같은 문제점을 포함하고 있다.
- 데이터 복구가 불가능하므로 실수로 삭제 시 문제 발생.
- 상품의 판매 기록이나 리뷰 등 참조 데이터가 손실될 가능성.
- 데이터의 완전한 삭제는 DB 성능 저하를 초래할 수 있다.
2. 프론트엔드에서 th:if 문을 사용하여 판매 중단인 상품을 필터링하였지만, 이로 인해 원하지 않는 정렬 및 페이징 문제가 발생하였다.
(첫번째 페이지에 6개의 아이템이 출력이 되어야 하는데 판매 중단인 아이템을 필터링하니 두번째 페이지로 넘어간 아이템들이 정렬이 되지 않았음)
1. Enum 클래스 도입
: ItemSellStatus라는 Enum 클래스를 도입하여 상품의 판매 상태를 관리한다. 이 Enum에는 ON_SALE, DISCONTINUED 등의 상태가 포함되어 있다.
2. 상품 상태 업데이트
: 판매를 중지하거나 할 경우, 상품 데이터를 삭제하는 대신 해당 상품의 상태를 DISCONTINUED로 업데이트한다.
3. 백엔드에서의 필터링 및 페이징 처리
: 프론트엔드에서의 필터링으로 인한 페이징 문제를 해결하기 위해, 백엔드에서 DISCONTINUED 상태의 상품을 제외하고 페이징 처리를 진행한다. 이렇게 하면 사용자에게 보여줄 상품 목록만 정확히 페이징될 수 있다. 이 변경으로 인해 프론트엔드에서 발생했던 정렬 및 페이징 문제가 해결되었다.
private BooleanExpression isItemAvailable(){
return QItem.item.itemSellStatus.eq(ItemSellStatus.SELL);
} // 현재 판매 중인 상태의 상품만 조회되도록 함
public Page<MainItemDto> getMainItemPage(ItemSearchDto itemSearchDto, Pageable pageable) {
.
.
// .where(itemImg.repimgYn.eq("Y"))
.where(itemImg.repimgYn.eq("Y"),
itemNmLike(itemSearchDto.getSearchQuery()),
isItemAvailable())
.
.
}
데이터의 완전한 삭제가 DB 성능 저하를 초래할 수 있는 이유가 무엇인지 여쭤봐도 될까요?