다음과 같이 Review 를 삭제하는 쿼리만 나가지 않았습니다.
/**
* 리뷰 삭제
* 이전에 회원이 작성한 리뷰가 없으면 예외 처리.
* 삭제되는 리뷰의 점수로, 식당의 평점 수정
*
* @param memberId 회원 Id
* @param restaurantId 식당 Id
*/
@Transactional
public void deleteReview(Long memberId, Long restaurantId) {
// id로 회원을 가져온다.
Member member = getMemberById(memberId);
// 회원이 식당에 관한 리뷰를 가져온다. 없으면 예외 처리.
Review review = member.findReviewMatchRestaurant(restaurantId);
// 평점 수정
getRestaurantById(restaurantId).updateRateByDelete(review.getScore());
// 리뷰 삭제
reviewRepository.delete(review); // <-- 쿼리 안나감
}
처음엔 롤백이 되는줄 알았지만, 롤백이 되는게 아니라 그냥 삭제하는 쿼리만 나가지 않았습니다. 이유가 뭐였을까요?
정답은 **CaseCade**에 있었습니다.
회원이나 식당이 삭제가 되면, 자동으로 리뷰도 삭제가 되어야 했기에, CaseCadeType.ALL로 리뷰를 설정해놨습니다.
따라서 회원을 가져올 때, 회원이 리뷰를 가진 채로 영속성화 되기 때문에, 삭제가 안됐던 것입니다. (회원엔 1L 이라는 리뷰가 있는데 1L리뷰가 삭제되면 동기화의 문제가 생김.)
CaseCade를 삭제하거나, CascadeType.ALL + orphanRemovel=true 로 완전히 부모에서 관리하여, 부모에서 고아객체로 만드는 로직을 하면 자동으로 삭제되는 모습을 볼 수 있습니다.