판매자가 게시한 상품삭제하기
'상품삭제' 를 구현하는 것은 여러가지 방법중에 선택할 수 있다
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) 에서 삭제된 상품은 안보이고, 품절처리한 상품은 '품절' 로 표기된다
'프로젝트' 카테고리의 다른 글
| [SpringBoot & JPA 프로젝트] 주문테이블 설계 (0) | 2022.09.05 |
|---|---|
| [SpringBoot & JPA 프로젝트] 장바구니에 상품 추가하기 / 삭제하기 (0) | 2022.08.25 |
| [Spring Boot & JPA 프로젝트] 상품등록 / 파일업로드(다중X) (0) | 2022.08.17 |
| [SpringBoot & JPA 프로젝트] enum (0) | 2022.08.17 |
| [SpringBoot & JPA 프로젝트] 뜨개장터 소개 (2) | 2022.08.17 |