프로젝트

[SpringBoot & JPA 프로젝트] 판매자 : 상품삭제하기 (delFlag)

sian han 2022. 8. 24. 06:27

판매자가 게시한 상품삭제하기

 

'상품삭제' 를 구현하는 것은 여러가지 방법중에 선택할 수 있다

 

1. 물리삭제 (Hard Delete)

  - JpaRepository delete 를 사용하여 db에서 해당 상품 관련 데이터를 싹 날린다

 

2. 논리삭제 (Soft Delete)

  - flag 를 통해 삭제 여부를 관리함

 

JPA delete 메서드 사용해보고싶긴한데 물리삭제는 상품삭제 구현에 적합하지 않은것같아서,

이건 장바구니 상품 삭제할때 사용해보기로하고, flag 변수를 추가했다

 

 

Item (Entity)

    private boolean isDeleted = Boolean.FALSE;
public void deleteItem(ItemResponseDto itemResponseDto){
        this.isDeleted = itemResponseDto.isDeleted();
    }

 

 

Controller

//상품삭제_get
    @GetMapping(value = "/delete/{itemId}")
    public String item_delete_get(@PathVariable("itemId") Long id,HttpSession httpSession){
        Long sellerId = (Long) httpSession.getAttribute("id");
        ItemResponseDto itemResponseDto = itemService.getItemDetail(id);

        if(sellerId == itemResponseDto.getSellerId()){ // 현재 로그인된 계정과 판매자 계정이 일치한다면
           itemResponseDto= itemService.deleteItem(id);
        }
        log.info("삭제여부={}",itemResponseDto.isDeleted());
        return "index";
    }

 

 

service

//상품삭제
    @Transactional
    public ItemResponseDto deleteItem(Long id){
        Item item = itemRepository.findItemById(id);
        ItemResponseDto itemResponseDto = getItemDetail(id);

        itemResponseDto.setDeleted(true);

        item.deleteItem(itemResponseDto);
        itemRepository.save(item);

        return itemResponseDto;
    }

id 로 item 객체와 itemDto를 받아온다

itemDto를 통해 isDeleted 컬럼의 값을 true 로 set 해줌 ( 엔티티 클래스에 직접적으로 set XX )

 

 

상품 삭제하는데에는 ItemResponseDto 를 사용했다.

다음엔티티는 DTO 요청 / 응답 나누지 말아야지 .. ^^ 


DB에서 isDeleted 컬럼의 값이 변경된 것을 확인할 수 있다.

 

 

그럼이제 삭제된 상품은 index(상품목록) 에서 보이지 않아야 한다

 

@Entity
@Where(clause = "is_deleted = false and sell_status = 'SELL'")
public class Item extends BaseEntity {

 

다른 로직 추가할 것 없이

where 어노테이션을 사용하면 된다

조건은 isDeleted 한개만 넣을건데, where 어노테이션으로 조건 두개도 가능한지 확인해보고싶어서 테스트한것이다

당연히 where 조건 두개도 가능하다

 

 

 

의도한대로 상품목록(index) 에서 삭제된 상품은 안보이고, 품절처리한 상품은 '품절' 로 표기된다