작성
·
39
0
안녕하세요. JPA활용1 강의 중 상품 리포지토리 개발 부분에서 궁금한 점이 생겨 질문드립니다.
첫 번째 사진은 ItemRepository의 save함수이고 두 번째 사진은 ItemService의 join함수입니다.
save함수의 경우 persist(item)을 하였을 때, DB에 바로 저장되는 것이 아니라 트랜잭션이 커밋될 때까지 영속성 컨택스트에 들어있는 것으로 알고 있습니다. item의 id는 DB에서 부여하는 것이니 트랜잭션이 끝날 때가지 id값은 null일 것이라고 생각했습니다.
그런데 join함수를 보면 트랜잭션이 끝나기 전 item의 id를 return하는 부분이 있고, 실제 테스트를 했을 때도 id값이 1로 존재하는 것을 확인했습니다.
저는 item 엔티티를 만들 때 @GeneratedValue전략으로 SEQUENCE를 사용한 것도 아니고,return을 하는 시점은 아직 트랜잭션이 끝나기 전이라 DB에서 id를 부여한 것도 아닌데, 왜 id값이 존재하는지 궁금합니다.
아래와 같이 테스트를 진행했을 때 성공하였는데, 혹시 테스트를 잘못한 것일까요?
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. kunwoo0512님.
질문해주신 내용에 관련하여, 다른 유사한 질문과 함께 그 답변을 안내드립니다. 트랜잭션과 영속성 컨텍스트, 그리고 엔티티의 ID 생성과 관련된 질문들이 많으며, 일부가 귀하의 궁금증을 해결하는 데 도움이 될 것입니다.
itemRepository.save(item); 부분에서 궁금한 것이 있습니다 !
save
메서드에서 엔티티의 ID가 어떻게 처리되는지 상세히 설명하고 있습니다.save
메서드를 호출하면, JPA는 영속성 컨텍스트에 엔티티를 저장합니다. ID는 데이터베이스에 저장되면서 생성되고, 그 즉시 엔티티 객체에도 반영됩니다.persist
가 호출될 때 엔티티의 ID가 어떻게 생성되고, 언제 반환되는지 다룹니다.persist
를 호출할 때 즉시 ID를 할당합니다. 이 과정은 영속성 컨텍스트에 엔티티가 등록되는 순간 ID가 생성된다는 것을 의미합니다.이 답변들이 질문해주신 내용을 이해하는 데 도움이 되기를 바랍니다. 아이템이 em.persist
호출 후 바로 ID를 가지는 이유는 JPA의 영속성 컨텍스트 관리 방식과 관련이 있습니다. 트랜잭션이 커밋되기 전에라도 영속성 컨텍스트가 엔티티 상태를 관리하므로, ID는 이미 할당된 상태입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.