인프런 커뮤니티 질문&답변

얼티밋님의 프로필 이미지

작성한 질문수

코드로 배우는 React with 스프링부트 API서버

Repository개발 및 테스트(2)

삭제 쿼리 질문드립니다.

23.12.26 22:00 작성

·

262

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

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

2023. 12. 26. 23:08

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);