You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
1. 문제 상황
게시글을 작성한 회원에 한해서 회원 탈퇴가 제대로 이루어지지 않았다. 에러의 내용을 살펴보니 Post 객체를 삭제할 때, PostContentImage 와의 FK 관련 에러이다.
2. 원인 찾기
원인을 찾기 위해 테스트 코드를 살펴봤는데, post가 삭제되는 테스트는 post를 삭제할 때 postContentImage가 잘 삭제되고, member가 삭제되는 테스트에선 post를 삭제할 때 postContentImage가 제대로 지워지지 않고 있었다.
post 삭제 로직과 member 로직의 차이점은 딱 하나였다. post 삭제 로직은 deleteAllById(postId)를 쓰고 member 삭제 로직은 deleteAllByIdInBatch(postId) 를 쓰고 있는 것이다.
원래의 JPA 동작 방식은, deleteAllById(postIds) 를 예로 들면, 해당 id를 가진 Post들과 관련된 엔티티까지 전부 활용해서 쿼리문들을 만들고, 그 쿼리문들을 트랜잭션 커밋 직전에 쏴서 DB에서 데이터를 지워준다.
하지만 deleteByIdInBatch 메서드는 내부적으로 직접 쿼리를 만들어서 바로 DB에 쏘는 형식이기 때문에, JPA처럼 연관관계를 고려해주지 않고 해당 Post들만 지우고 끝나버리게 된다.
즉, cascade와 orphanRemoval 속성들을 설정한 것들도 전혀 먹히지 않는다는 의미이다.
3. 문제 해결
member를 삭제하는 로직에서 post를 지우는 로직을 deleteAllByIdInBatch(postId); => deleteAllById(postId); 로 바꾸어주어 해결했다.
Beta Was this translation helpful? Give feedback.
All reactions