작성
·
267
0
삭제 테스트중 의문점이 하나 있어서 질문드립니다
삭제를 위한 검색쿼리
Hibernate:
select
c1_0.cno
from
tbl_cart c1_0
left join
tbl_cart_item c2_0
on c2_0.cart_cno=c1_0.cno
where
c2_0.cino=?
작성하지 않았는데 발생하는 쿼리
Hibernate:
select
c1_0.cino,
c2_0.cno,
o1_0.email,
o1_0.nickname,
o1_0.pw,
o1_0.social,
p1_0.pno,
p1_0.del_flag,
p1_0.pdesc,
p1_0.pname,
p1_0.price,
c1_0.qty
from
tbl_cart_item c1_0
left join
tbl_cart c2_0
on c2_0.cno=c1_0.cart_cno
left join
member o1_0
on o1_0.email=c2_0.member_owner
left join
tbl_product p1_0
on p1_0.pno=c1_0.product_pno
where
c1_0.cino=?
삭제쿼리
Hibernate:
delete
from
tbl_cart_item
where
cino=?
삭제후 아이템 재검색쿼리
Hibernate:
select
c1_0.cino,
c1_0.qty,
p1_0.pname,
p1_0.price,
i1_0.file_name
from
tbl_cart_item c1_0
join
tbl_cart c2_0
on c1_0.cart_cno=c2_0.cno
left join
tbl_product p1_0
on c1_0.product_pno=p1_0.pno
left join
product_image_list i1_0
on p1_0.pno=i1_0.product_pno
where
i1_0.ord=0
and c2_0.cno=?
삭제 쿼리시 위와같은 쿼리들이 실행되는데요 삭제를 위한 검색쿼리후 알수없는 쿼리하나가 더 실행되는데 이쿼리가 실행되는 이유를 알고 싶습니다.
답변 1
1
JPA는 항상 데이터베이스와 현재 메모리상의 객체를 동일하게 유지하고자 합니다(영속상태 유지라고들 하죠).
특정한 엔티티 객체를 삭제한다는 것은 메모리 상에서도 삭제하고 데이터베이스에서도 삭제하는 것을 의미합니다.
때문에 JPA의 DELETE나 UPDATE는 기본적으로 select를 통해서 엔티티 객체를 가져오는 쿼리가 실행됩니다. 예를 들어 deleteById( )등을 실행하면
Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.deleteById]
select....
와 같은 형태로 연관된 다른 엔티티들 역시 점검한 후에 delete가 실행됩니다.
테스트 코드에서 장바구니 아이템의 수량을 변경하는 코드 역시 동일하게 select가 일어나는 것을 볼 수 있습니다. 조회할 때 select가 일어나고, 수량을 변경한 후에 저장하면 다시 select가 일어난 후에 update가 실행됩니다.
장바구니 아이템의 경우 장바구니,상품과 연관관계가 있고 장바구니는 다시 회원과 연관 관계가 있기 때문에 이를 조회하기 위한 조인 처리된 select가 실행된 것입니다.
이런 과정이 성능에 영향을 줄 수 있기 때문에 @Query( )와 @Modifying으로 처리하기도 합니다.
@Modifying
@Query("delete from CartItem ci where ci.cino = :cino")
void deleteCino( @Param("cino") Long cino);