작성
·
407
0
안녕하세요. 전 현재 queryDSL 강의까지 듣고 몇달간 프로젝트를 진행중인 학생입니다.
이번에 맞닥뜨리게된 문제가 특이해서 질문 남겨봅니다.
다름이 아니라 CascadeType을 지정하지 않은 상태에서 데이터를 DB에 저장했었습니다.
당시엔 flag를 통한 delete를 기능에 담아내고 있었기 때문입니다.
하지만 시간이 흘러 delete를 해야할 타이밍이 와서 기능을 구현하는데
의존성 때문에 부모 객체가 삭제될 수 없다며
Connection org.postgresql.jdbc.PgConnection@37333b1f marked as broken because of SQLSTATE(08006), ErrorCode(0) 에러가 나며 에러를 띄웠습니다.
아무리 찾아봐도 CascadeType을 통해 JPA에서 영속 상태를 정한다고만 하고
Bard, ChatGpt, Bing 등 비슷한 답을 줬습니다.
서비스 전의 DB라 DB에 있던 튜플들을 전부 삭제하는 것으로 해결했으나 궁금증은 여전히 해결되지 않았습니다.
CascadeType을 지정하지 않았을 때 저장된 값은 CascadeType.ALL로 바꿨을 때도 영속상태로 들어가질 않나요?
만약 그렇다면 해당 값이 어떻게 CascadeType이 지정되기 전에 저장됐는지 아닌지 알 수 있는 건가요?
답변 1
1
안녕하세요, 인프런 AI 인턴이에요.
CascadeType을 지정하지 않은 경우, 부모 엔티티를 삭제하려고 하면 상기한 에러가 발생할 수 있습니다. 이는 JPA의 영속성 전이에 관한 내용입니다.
CascadeType을 지정하지 않으면 기본값인 CascadeType.NONE이 적용되므로, 해당 엔티티를 영속성 컨텍스트에서 제거하여 DB에서 업데이트된 내용이 반영되도록 작업해야 합니다. 이때 필요한 것이 EntityManager의 remove() 메서드 입니다.
해당 엔티티를 영속성 컨텍스트에서 제거한 후, flush() 메서드를 호출하여 변경된 내용을 DB에 반영할 수 있습니다.
CascadeType을 지정하지 않았을 때 저장된 값도 CascadeType.ALL로 바꾸어도 영속 상태로 들어가지 않습니다. 이는 엔티티의 상태 변화가 트랜잭션을 통해 이루어지기 때문입니다.
CascadeType이 지정되기 전에 저장된 값인지 아닌지에 대해서는 알 수 없습니다. 그러나 Cascade가 적용된 이후로는 부모 엔티티를 삭제하면 자식 엔티티도 함께 삭제되도록 지정되어 있습니다.
이상하게 동작하여 발생한 문제라면, 스택 트레이스 및 디버깅 과정에서 더 깊이 들어가보시는 것이 도움이 될 것입니다. 감사합니다.