프로젝트의 개발 단계는 마무리 되고,
자잘한 오류들을 수정하는 디버깅 단계에서 문제가 발생했다.
회원을 탈퇴시킬 때, 참조 무결성 오류 가 발생했다.

참조 무결성 오류?

기본적으로 관계형 데이터베이스는 테이블 간에 관계가 존재한다.
해당 관계에서 키를 참조하는 테이블이 존재한다면 문제가 발생할 수 있다.

만약 집과 사람 엔티티가 있다고 가정해보자.
사람이 만약 그 집에 살고있다면, 사람과 집은 1대1 관계를 가질 수 있다.
그럼 집 엔티티는 거주인으로 외래키를 가질 수 있다는 말과 같다.

만약 갑자기 사람이 사라진다면?
실제로도 퇴거 신청을 하지 않고 나가면 문제가 될 수 있는 것처럼,
집은 사람을 외래키로 들고 있는데 사람만 삭제되면 당연히 문제가 발생한다.
이를 우리는 참조 무결성 위반 이라고 부른다.

프로젝트에서의 문제 발생

현재 회원들은 글과 댓글을 작성할 수 있도록 서비스가 제공된다.
그 말인 즉, 작성한 회원들은 글, 댓글 Entity와 관계를 맺게 된다는 말이다.
또한 글에 댓글이 작성되기 때문에, 글과 댓글 서로 간에도 관계를 맺고 있다.

더 나아가, 회원들은 각 글에 좋아요를 누를 수 있게 되어있으며,
회원들이 직접 참여를 할 수 있는 글의 유형 또한 존재한다.
위의 두 기능을 구현하기 위해서는 다대다 관계를 교차 엔티티를 통해 풀어야 했으며,
해당 부분에서도 서로 관계를 맺기에 참조 무결성 오류가 발생할 여지가 있다.
qwd drawio

위의 기능들로 인해, 아래와 같이 탈퇴 시 모든 관계를 제거하는 코드를 작성했다.
탈퇴 코드

하지만 그래도 아래와 같이 참조 무결성 오류가 발생함을 확인할 수 있었다.
댓글 참조 무결성

왜일까?

해결 방법

이전에 마이페이지를 구현할 때, 동일한 해결 방법을 사용했었던 것으로 기억한다.
그 때 기록을 해두었음에도 불구하고 잊고 무분별하게 CASACADE.ALL 을 사용하고 있었다.
CASCADE.ALL 을 사용하게 되면, CASCADE.PERSIST 또한 자동으로 실행되는데,
이 때 관계가 살아있으면, 삭제된 객체가 다시 생성이 되어버리는 경우가 발생한다.
따라서 CASCADE.REMOVE를 사용함이 옳다고 공식문서를 읽어가며 해결했던 기록이 있다.

이번에도 아래와 같이 CASCADE.REMOVE로 변경을 해주었고, 탈퇴 로직도 변경을 했다.
얘도 cascade
탈퇴코드2

곧바로 탈퇴가 정상적으로 진행됨을 확인할 수 있다!
성공

CASACDE 속성을 사용할 때는 조심 또 조심하자!