[game] 판매 상품 관리 : "판매 중단" 상태 도입과 백엔드에서의 페이징 처리

myminimin·2023년 10월 18일
0

toyproject

목록 보기
15/17
post-custom-banner

문제 발생

상품 관리 시스템에서 판매 중지 또는 판매 불가능한 상품(테스트용 상품 등)을 데이터베이스 완전히 삭제하는 방식으로 사용하려고 했다. 상품 데이터를 삭제하게 되면 이전 판매 기록이나 상품 정보를 참조할 수 없는 문제가 발생할 수 있었다.


문제 인식

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())   
.
.
}


깨달은 점

  1. 데이터 삭제보다는 상태 관리를 통한 데이터 보존이 효과적이다. 특히, 필요한 데이터만 사용자에게 보여주는 방식을 취해야 한다.
  2. Enum 클래스를 사용하여 데이터의 상태를 명확하게 관리할 수 있다. 이는 코드의 가독성과 유지보수성을 높여준다.
  3. 프론트엔드에서의 데이터 처리는 종종 원하지 않는 부작용을 초래할 수 있다. 따라서 중요한 로직이나 데이터 필터링은 가능한 백엔드에서 처리하는 것이 바람직하다.
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 2월 26일

데이터의 완전한 삭제가 DB 성능 저하를 초래할 수 있는 이유가 무엇인지 여쭤봐도 될까요?

답글 달기