CascadeType

Panda·2022년 5월 17일
0

Spring

목록 보기
22/45

최근에 학교 시험공부랑 정처기 실기 공부하느라 블로그 글을 못쓰고있었네요 ㅠㅠㅠ

다 끝났으니까 다시 열심히 공부하려고 합니다!!

Cascade 문제 발견

이번에도 역시나 프로젝트를 진행하다가 JpaRepository 로 Delete를 하는 상황이 생겼는데
해당 Entity(테이블) 과 관련된 모든 Entity들을 삭제하는 쿼리를 실행시키는 문제가 발생하여
detached entity passed to persist 에러 문구를 발생시켰습니다.

예) User, Post Entity가 존재하는데 Post만 삭제시켰는데 User까지 삭제되는 현상

이러한 문제를 해결하려고 생각을 하다가 아 이거 빼박 Cascade 문제인 것 같다 라고 생각을 하여 알아보았습니다.

CascadeType

JPA에는 총 6가지의 CascadeType이 존재합니다.

  • CascadeType.PERSIST
    엔티티를 생성하고, 연관 엔티티를 추가하였을 때 persist() 를 수행하면 연관 엔티티도 함께 persist()가 수행된다. 만약 연관 엔티티가 DB에 등록된 키값을 가지고 있다면 detached entity passed to persist Exception이 발생한다.

  • CascadeType.MERGE
    트랜잭션이 종료되고 detach 상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge()를 수행하게 되면 변경사항이 적용된다.(연관 엔티티의 추가 및 수정 모두 반영됨)

  • CascadeType.REFRESH
    엔티티를 새로 고칠 때, 이 필드에 보유 된 엔티티도 새로 고칩니다.

  • CascadeType.REMOVE
    삭제 시 연관된 엔티티도 같이 삭제됨

  • CascadeType.DETACH
    부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다.

  • CascadeType.ALL
    모든 Cascade 적용

제가 문제가 발생했던 이유는 CascadeType.ALL을 적용시켰기 때문에 CascadeType.REMOVE 때문에 관련 Entity들이 전부 삭제된 것 같았습니다. (Transactional 걸어놔서 망정이지 ㅋㅋㅋ)

따라서 CascadeType.PERSIST로 변경을 하여 이러한 문제를 해결하여 정상적인 기능을 구현하였습니다.

느낀 점

JPA 관련해서 많은 공부를 해야된다는 것은 항상 느끼지만

이번에 영속성이라는 개념을 배워서 나중에 한번 영속성 관련해서 블로그 글을 쓰려고 합니다!

Entity 생명주기가 매우 중요하니까 빠른 시일내에 공부하려고 합니다!

profile
실력있는 개발자가 되보자!

0개의 댓글