게시글 관련 기능을 구현하다가 질문글을 삭제했을 때 Delete, Update ~~~ Foreign error 라는 문구가 출력되었다.
왜 이런 오류가 출력되었을까?!!!! 게시글 관련 DB는 다음과 같다.
질문과 답변 테이블이 1대다 관계인 것을 확인할 수 있다. 만약, 질문 하나를 삭제할 때 답변이 달려 있는 경우 어떻게 될까??
내가 발생했던 오류와 같이 외래키 제약조건 에러가 출력될 것이다. 해당 방법을 해결하는 방법은 크게 두 가지가 있을 것이다.
테이블 생성 시 제약조건 지정, Spring 코드 내에서 해결
첫 번째 상황을 예로 들면
# MySQL
ADD CONSTRAINT [제약조건 이름] FOREIGN KEY(컬럼 명)
REFERENCES [부모테이블 명](PK 컬럼 명) [ON DELETE CASCADE / ON UPDATE CASCADE];
이런식으로 대처할 수 있을 것이다. 그러나 우리는 JPA를 사용할 것이기 때문에 해당 방법은 디테일하게 소개하지 않겠다.
본격적으로 JPA에서 해결할 수 있는 방법을 소개하고자 한다.
JPA - CASCADE
👉 CASCADE란?
영속성전이로 부모 엔티티가 영속화될 때 자식도 같이 영속화되고, 부모 엔티티가 삭제될 때 자식도 같이 삭제되는 것이다.
즉, 연관 엔티티도 함께 영속 상태로 전이되는 것을 의미한다.
👉 OPTION
JPA에서 사용할 때에는 cascade= CascadeType.[Option] 이런식으로 사용하게 되는데, 이 때 Option에 대해
소개하고자 한다.
- ALL : 말그대로 ALL, 모든 Cascade를 적용한다.
- PERSIST : 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지된다.
- MERGE : 엔티티 상태를 병합할 때, 연관된 엔티티도 모두 병합한다.
- REMOVE : 엔티티를 제거할 때, 연관된 엔티티도 모두 제거한다.
- REFRESH : 상위 엔티티를 새로고침 할 때, 연관된 엔티티도 모두 새로고침한다.
- DETACH : 상위 엔티티를 영속성 컨텍스트에서 제거할 때, 연관된 엔티티도 모두 제거된다.
👉 실습
위의 데이터베이스를 참고하여 JPA 실습을 진행해보자!
킹명주의 블로그를 참고했다면 테이블 생성 정도는 껌이기 때문에 쉬운 부분은 넘어가고
엔티티 관련 코드만 소개하고자 한다.
Question (1 : 다)
package com.example.jpa_practice.domain;
import javax.persistence.*;
import java.util.List;
@Entity
public class Question {
@Id @GeneratedValue
private Long questionID;
private String comments;
@OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
List<Answer> answers;
}
Answer (1 : 다)
package com.example.jpa_practice.domain;
import javax.persistence.*;
@Entity
public class Answer {
@Id @GeneratedValue
private Long answerID;
@ManyToOne
@JoinColumn(name="questionID")
private Question question;
private String comments;
}
이렇게 코드를 구성하면 처음에 소개했던 에러는 출력되지 않는다!
대부분 옵션은 ALL, PERSIST를 많이 쓰긴 하지만, 이렇게 각자 옵션을 알고 써야 의미가 있다고 생각한다.
꼭!! 실습을 진행하여 cascade가 없을 때 결과와 cascade가 있을 때 결과를 비교해본다면 확실하게 이해할 수 있을 것이다!
'SPRING' 카테고리의 다른 글
[Spring] Exception Custom (0) | 2023.02.13 |
---|---|
[Spring] Google Login API 사용하기 (14) | 2022.10.10 |
[Spring] JWT 실습 - 1 (2) | 2022.07.27 |
[JAVA] JPA 연관관계 매핑 (0) | 2022.07.25 |
[JAVA] JPA 실습(Create table and PK/FK 설정) (0) | 2022.07.19 |