인프런 커뮤니티 질문&답변

kunwoo0512님의 프로필 이미지
kunwoo0512

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

영속성 컨텍스트와 id 생성의 관계

작성

·

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

안녕하세요. kunwoo0512님, 공식 서포터즈 y2gcoder입니다.

AI 인턴이 대부분의 설명을 잘해주었다고 생각합니다!

이에 더해 Identity 전략일 때는 persist 시 식별자를 얻기 위해 DB로 insert 문을 바로 날리게 됩니다!

jpa는 식별자를 기준으로 많은 작업들을 하기 때문에 엔티티를 영속화하려면 식별자가 필수입니다. 트랜잭션 끝나기 전 flush 단계가 아닌 persist 호출 시 바로 insert 문을 날려 식별자를 조회해오게 됩니다 🙂

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. kunwoo0512님.

질문해주신 내용에 관련하여, 다른 유사한 질문과 함께 그 답변을 안내드립니다. 트랜잭션과 영속성 컨텍스트, 그리고 엔티티의 ID 생성과 관련된 질문들이 많으며, 일부가 귀하의 궁금증을 해결하는 데 도움이 될 것입니다.

  1. itemRepository.save(item); 부분에서 궁금한 것이 있습니다 !

    • 이 답변에서는 save 메서드에서 엔티티의 ID가 어떻게 처리되는지 상세히 설명하고 있습니다.
    • 핵심 요약: save 메서드를 호출하면, JPA는 영속성 컨텍스트에 엔티티를 저장합니다. ID는 데이터베이스에 저장되면서 생성되고, 그 즉시 엔티티 객체에도 반영됩니다.
  2. data jpa 공부하다가

    • 이 답변에서는 트랜잭션 내에서 persist가 호출될 때 엔티티의 ID가 어떻게 생성되고, 언제 반환되는지 다룹니다.
    • 핵심 요약: JPA는 persist를 호출할 때 즉시 ID를 할당합니다. 이 과정은 영속성 컨텍스트에 엔티티가 등록되는 순간 ID가 생성된다는 것을 의미합니다.
  3. Transactional

    • 이 답변에서는 트랜잭션의 롤백과 커밋이 데이터베이스 상태 및 테스트 코드에 미치는 영향을 다룹니다.
    • 핵심 요약: 테스트에서도 영속성 컨텍스트의 변경 사항이 반영되며, 트랜잭션이 커밋되기 전에도 ID는 할당됩니다.

이 답변들이 질문해주신 내용을 이해하는 데 도움이 되기를 바랍니다. 아이템이 em.persist 호출 후 바로 ID를 가지는 이유는 JPA의 영속성 컨텍스트 관리 방식과 관련이 있습니다. 트랜잭션이 커밋되기 전에라도 영속성 컨텍스트가 엔티티 상태를 관리하므로, ID는 이미 할당된 상태입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kunwoo0512님의 프로필 이미지
kunwoo0512

작성한 질문수

질문하기