우리 프로젝트에는 모임 : 게시글 : 댓글 : 대댓글이라는 연관관계가 있다. 모두 1:N 양방향 관계이며 게시글 삭제 시 연관 댓글, 대댓글 삭제가 이루어져야 하는 구조이다.
삭제가 조금 번거롭다. 그래서 영속성 전이를 사용하면 쉽게 제거할 수 있지 않을까? 하고 테스트를 진행해 보았다. 아래는 테스트 로그이다. parent의 존재 여부를 확인하고 children의 존재 여부를 확인한 후에 child 삭제 후 parent 삭제를 진행한다.
Hibernate:
select
parent0_.id as id1_5_0_,
parent0_.name as name2_5_0_
from
parent parent0_
where
parent0_.id=?
Hibernate:
select
children0_.parent_id as parent_i3_0_1_,
children0_.id as id1_0_1_,
children0_.id as id1_0_0_,
children0_.name as name2_0_0_,
children0_.parent_id as parent_i3_0_0_
from
child children0_
where
children0_.parent_id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
child
where
id=?
Hibernate:
delete
from
parent
where
id=?
그런데 delete 쿼리가 과도하게 많이 발생하는 것을 볼 수 있다. 사실상 두 번의 쿼리로도 끝낼 수 있는 작업인데 말이다. (IN 절 사용)
따라서 CascadeType.REMOVE를 쓸 땐 성능 이슈를 조심해야 하고 되도록 OneToOne 관계와 같은 곳에만 사용하는 것이 좋을 것으로 보인다.