[JPA] 영속성 컨텍스트, Cascade 옵션

DevHwan·2022년 12월 1일
0

Cascade

Cascade 옵션은 엔티티의 상태 변화를 전파시키는 옵션이다. 따라서 OneToMany 관계나 ManyToOne 관계를 맺는 엔티티의 상태 변화를 전이시킬 때 사용이 가능하다.

이게 무슨말일까?? 영속성에 대한 개념과 DB 커넥션에 대해 알지 못하면 이해하기 어렵다.

엔티티의 상태

엔티티들은 크게 네 가지 상태를 갖는다. 아래 그림은 엔티티들이 갖는 상태 변화를 그림으로 나타낸 것이다.

  • Transient : 순수한 객체 상태를 갖고 있다. 영속성 컨텍스트에 포함되지 않았다.
  • Persistent : save()가 호출되면 이는 Persistent, 즉 영속 상태가 된다. 이제 영속성 컨텍스트가 해당 엔티티를 관리하게 된다. 1차 캐시, 이를 Spring에서는 영속성 컨텍스트에 있다라고 한다.
  • Detached : 이는 영속성 컨텍스트에서 관리되다 잠시 분리된 상태로 준영속 상태라고 한다. 영속성 컨텍스트에서 제외되며, 1차 캐시에서 더 이상 관리하지 않는다. 그러나 다시 영속 상태로 돌아올 수 있는 가능성이 있는 상태이다.
  • Removed : delete()가 호출되면 엔티티가 영속성 컨텍스트에서 제외되고, DB에서도 제거된다.

갑자기 Cascade 옵션에서 엔티티의 상태에 대한 얘기가 왜 나왔을까? → Cascade 옵션은 상태 전이를 위한 옵션이기 때문이다.

예시를 위해서 게시물과 댓글 엔티티가 각각 있다고 생각해보자.

게시물 하나에는 여러 댓글이 생성될 수 있다. 즉 OneToMany 관계를 갖고 있다. 대게는 Many 엔티티에서 FK를 가지고 있으므로 댓글 엔티티에서 게시물 엔티티의 PK를 FK로 갖고 있을 것이다. 그런데 만약에 게시물이 제거된다면? 더 이상 댓글들은 존재할 필요가 없다.

그러나 게시물을 delete하여 제거하더라도 댓글들이 상태 변화를 바로 알 수 없다. 그래서 Cascade 옵션을 사용하여 게시물이 제거되었다는 상태를 전이시키는 것이다.

@Entity
class Post (
    @OneToMany(mappedBy = "post", cascade = ALL)
    private HashSet<Comment> comments = HashSet()

    public void addComment(comment:Comment){
        this.comments.add(comment)
        comment.post = this
    }
}
profile
달리기 시작한 치타

0개의 댓글