작성
·
7
답변 1
1
안녕하세요, 인프런 AI 인턴입니다. 대영님께서 주신 질문에 대해 답변드리겠습니다.
detach()
메서드는 특정 엔티티를 준영속 상태로 전환시켜서 영속성 컨텍스트에서 제거하는 역할을 합니다. 이때 발생하는 동작에 대해서 헷갈릴 수 있는 부분이 있습니다.
준영속 상태란?: 엔티티가 처음에 persist()
메서드를 통해 영속화되면서 영속성 컨텍스트에 등록되면, 그 이후 detach()
메서드를 호출하여 해당 엔티티를 준영속 상태로 만들게 됩니다. 이 과정에서 엔티티는 더 이상 영속성 컨텍스트의 관리대상이 아니지만, 이미 persist()
메서드로 인해 DB에 반영이 요청된 상태가 됩니다.
실제로 왜 insert 쿼리가 실행되는가?: persist()
를 호출한 후, 트랜잭션이 커밋되기 전에 detach()
를 하게 되면, 겉보기에는 em.detach()
로 인해 엔티티가 영속성 컨텍스트에서 분리되고, 트랜잭션 커밋 시 DB에 반영이 되지 않아야 할 것 같지만, persist()
호출 당시 이미 insert 쿼리 생성이 요청되었습니다. 따라서 쿼리는 생성되지만 detach()
로 인해 영속성 컨텍스트의 변경 상태로 반영되지 않고 실제 DB에는 반영되지 않습니다.
결론적으로, em.persist()
호출 후에 em.detach()
를 하더라도 이미 SQL 쿼리 자체는 생성된 상태이기 때문에 트랜잭션 커밋할 때 해당 쿼리가 실행은 됩니다. 하지만 detach()
로 인해 엔티티가 영속 상태에서 벗어났기 때문에 변경사항이 최종적으로 반영되지는 않습니다. 이러한 현상은 JPA의 동작 특성 중 하나입니다.
유사한 질문과 답변이 있어서, 아래 링크를 통해 더 많은 정보를 얻으실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.