테이블 마다 외래키가 걸려 있으므로 cascade 설정 걸어줘서 User delete 요청시 연관 row들이 한번에 삭제되도록 한다.
User Entity
@OneToMany(mappedBy = "createUser", cascade = CascadeType.REMOVE)
private List<Paper> paperList = new ArrayList<>();
@OneToMany(mappedBy = "ownerUser", cascade = CascadeType.REMOVE)
private List<Paper> paperList2 = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
private List<Message> messageList = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
private List<Reaction> reactionList = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
private List<Sticker> stickerList = new ArrayList<>();
Paper Entity
@OneToMany(mappedBy = "paper", cascade = CascadeType.REMOVE)
private List<Message> messageList = new ArrayList<>();
@OneToMany(mappedBy = "message", cascade = CascadeType.REMOVE)
private List<Reaction> reactionList = new ArrayList<>();
@OneToMany(mappedBy = "paper", cascade = CascadeType.REMOVE)
private List<Sticker> stickerList = new ArrayList<>();
Message Entity
@OneToMany(mappedBy = "message", cascade = CascadeType.REMOVE)
private List<Reaction> reactionList = new ArrayList<>();
각각의 코드를 추가해줬다.
Cascade 옵션은 REMOVE를 사용했다. cascade에는 옵션이 몇 가지 있는데 각 옵션이 의미하는 것은 다음과 같다.
ALL : 모두 적용. REMOVE + PERSIST
PERSIST : 영속. 부모 엔티티를 저장할 때 연관된 자식 엔티티도 같이 저장
REMOVE : 삭제. 부모 엔티티를 삭제할때 연관되어 있는 자식 엔티티도 같이 삭제
MERGE : 병합
REFRESH : REFRESH
DETACH : DETACH
@OneToMany 설정으로 양방향 매핑이 추가되었고, 기존 Entity들에는 롬복에서 제공하는 annotation인 @Data가 있다.
이
@Dataannotation으로 인해 StackOverflow error가 발생할 수 있다.@Data는@Getter,@Setter뿐만 아니라toString()를 오버라이딩 해준다. 물론@RequiredArgsConstructor,@EqualsAndHashCode도 함께 해준다. 유용한 것은 맞지만 toStirng, equals, hashCode 메소드를 자동으로 생성해주는 과정에서 StackOverflow 문제가 발생할 수 있으니 잘 알아보고 사용하는 것이 좋다.
(https://projectlombok.org/features/ToString)
위의 문제가 발생하므로 간단하게 @Data annotation을 지우고 대신 @Getter, @Setter를 추가해줬다.
이렇게 해서 회원탈퇴 기능을 구현하면서 @Data annotation으로 인한 StackOverFlow error를 해결할 수 있었다.
2022.10.08 추가
양방향 매핑을 추가하면서 엔티티 조회할 때 쿼리가 하나씩 더 나갈 것으로 예상되는데, 이 부분은 아직 테스트 해보지 않아서 확신이 없다.
확인해보고 고쳐야할텐데 두뇌 리소스가 없다..