JAVA/소박한그룹 프로젝트

[ERROR] SQL Error: 1451, SQLState: 23000 Cannot delete or update a parent row: a foreign key constraint fails

kth990303 2021. 10. 15. 22:23
반응형

정말 오랜만에 소박한그룹 java 프로젝트를 진행한다.

댓글 기능을 오늘 이어서 하려다가, 지난번에 회원이 작성한 게시글 목록 기능 구현을 우선적으로 하고 있었다는 사실을 깨닫고 회원작성 게시글 목록 view단을 만드는 작업을 진행했다.

 

그러던 와중, 아래 uri 주소에서 에러가 발생했다.

 

http://localhost:8090/delete/1

test code에서 롤백되지 않고 남은 test, test2, test3을 회원탈퇴 시키려할 때 아래 에러가 발생했다.

test code를 잘 작성해도 아직 이런 에러를 겪는 걸 보니 한참 멀었다.

연관관계가 많아질수록 버그도 많아지는...

크흐흐흑ㄱ...ㅜㅠㅠㅠ
ERROR 모습

에러는 위와 같이 떴는데, 아마 post-member table이 원래 단방향이었는데, 양방향으로 바꾸면서 에러가 발생한 것이 아닐까 추측하였다.


실험을 통해 더 정확한 상황을 파악해보자.

SQL Error 1541 에러에다가, 외래키 관련 문제라고 돼있으니, 아마 게시글이 남아있는 상태에서 회원을 강제로 삭제하려다보니 발생한 에러가 아닐까 싶어 아래 시도를 해보았다.

 

1. 게시글이 하나도 없는 회원을 삭제해보자.

제대로 지워지며, 에러도 없음을 확인할 수 있다.

게시글이 하나도 없는 회원은 성공적으로 삭제된다.

 

2. 게시글을 작성한 test2 회원을 test2가 스스로 회원탈퇴해보자.

위와 같이 에러가 발생함을 확인할 수 있다.

 

3. 게시글을 작성한 test3 회원을 관리자 kth990303이 강제로 회원탈퇴 시키자.

에러가 발생한다.

(볼빨간사춘기 신곡 기대중 ㅎㅎ)

 

4. 게시글을 작성한 회원인 test3의 게시글을 삭제 후 관리자인 kth990303이 강제로 회원탈퇴시키자.

게시글을 강제로 삭제한 후, 강제로 회원탈퇴시키니 정상적으로 작동한다.

 

즉, 외래키로 연관된 post가 남아있는 상태에서 회원을 삭제할 때 위와 같은 에러가 발생하는 것이다.


해결방안

 

그렇다면 선택을 해야 한다.

 

1. 회원을 삭제할 때, 자동으로 모든 게시글을 삭제시킬 것인지,

2. 회원을 삭제할 때, 게시글 작성자를 알수없음으로 바꾸는 작업을 할 것인지.

 

사실 첫번째는 어렵지 않다.

cascade 타입을 ALL로 바꿔주고 고아객체 설정을 해주면 된다.

    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Post> posts=new ArrayList<>();

위와 같이 cascade, orphanRemoval을 설정해주어

회원이 삭제될 경우, 그의 자식 클래스인 post들도 한꺼번에 삭제되도록 하였다.

이 내용이 궁금하다면 아래 포스팅을 참고하자.

https://kth990303.tistory.com/54

 

[JPA] 실전예제 5_ 영속성 전이(Cascade), 고아 객체(orphanRemoval=true) 적용

실전예제 5 는 연관관계를 관리하는 방법에 대해 배운 내용을 적용하는 예제이다. 그 방법에는 아래와 같은 내용이 있다. 프록시(Proxy)를 이용하는 지연로딩(fetch = FetchType.LAZY) 적용 영속성 전이(c

kth990303.tistory.com

 

사실 내가 하고싶었던 방향은 두번째 방법인데,

일단 임시방편으로 첫번째 방법으로 해놓고 코드를 멈췄기 때문에 두번째 방법은 나중에 따로 이어서 포스팅하겠다.

 

issue 및 전체코드는 아래 깃헙주소에서 볼 수 있다.

https://github.com/kth990303/BOJStudyList/issues/20

 

회원이 작성한 게시글 수를 볼 수 있게 해주세요 · Issue #20 · kth990303/BOJStudyList

양방향 매핑으로 수정하면 될 듯? 그 전에 연관관계도 다시 공부하면 좋을 것 같습니다.

github.com

 

반응형