본문 바로가기
SPRING

[Spring] JPA CASCADE

by 킹명주 2022. 8. 31.

게시글 관련 기능을 구현하다가 질문글을 삭제했을 때 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 사용하기  (12) 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