그동안 프로젝트를 하거나 스프링 공부를 하면서 엔티티 간의 관계를 설정할 때 cascade 등과 같은 옵션을 설정할 수 있다는 걸 알고 있었지만 자세히 이해하지 못했었다. 이번에 투스데이 프로젝트를 진행하면서 여러 테이블을 구현하고 연관관계를 맺다 보니 이런 관계 설정에 있어 자세히 공부하고 필요한 옵션만 설정해 주어야겠다는 생각이 들어서 급한 api 개발을 마치고 바로 cascade에 대해 공부해 보았다. 

Cascade

  • JPA에서 엔티티 간의 관계를 설정할 때 사용하는 중요한 개념 중 하나이다.
  • cascade 옵션을 사용하여 부모 엔티티에 대한 작업이 자식 엔티티에도 자동으로 전파된다. 

장점

  • 코드의 간결성 유지 가능
  • 데이터의 일관성 보장

 

유형

  • CascadeType.PERSIST

부모 엔티티가 저장될 때, 자식 엔티티도 함께 저장

 

  • CascadeType.MERGE

부모 엔티티가 병합될 때, 자식 엔티티도 함께 병합

 

  • CascadeType.REMOVE

부모 엔티티가 삭제될 때, 자식 엔티티도 함께 삭제

 

  • CascadeType.REFRESH

부모 엔티티를 새로 고칠 때 자식 엔티티도 함께 새로 고침

 

  • CascadeType.DETACH

부모 엔티티가 영속성 컨텍스트에서 분리될 때, 자식 엔티티도 함께 분리된다

 

  • CascadeType.ALL

위의 모든 CascadeType 옵션을 적용한다

부모 엔티티의 모든 생명주기 변경에 대해 자식 엔티티에 동일하게 적용된다

 

주의사항

  • CascadeType.ALL 을 무분별하게 사용하는 것은 좋지 않다. 실제로 필요한 옵션을 선택해서 사용하는 것이 좋다
  • cascade 설정은 부모 엔티티의 관계 매핑 코드 내에서 작성해야 한다.
    • ex)  
    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Image> imageList= new ArrayList<>();
    
    ※ @OneToMany로 설정한 내용은 부모 엔티티의 db 테이블에 값이 생기지는 않는다. 부모 엔티티와 자식 엔티티 사이의 관계만 연결해준다. 나는 개인적으로 이 부분이 헷갈렸었는데 cascade를 공부하면서 이 내용도 확실히 짚고 넘어갈 수 있었다.
  • orphanRemoval = true : 부모 엔티티에서 자식 엔티티를 리스트에서 제거할 때, db에서 해당 자식 엔티티가 삭제되도록 설정하여 고아 객체 제거

이렇게 엔티티 간의 연관관계를 설정할 때 CascadeType 옵션에 대해 공부해보았다. 그동안 엔티티에 CascadeType 설정을 해주는 경우에는 거의 대부분 ALL을 사용했던 것 같다. 하지만 무분별하게 ALL을 사용하는 것도 좋지 않으니 추후 이 부분을 수정하여야겠다.

+ Recent posts