• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

기본 키 매핑 member.getId() 질문

24.04.18 22:15 작성 조회수 52

0

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

섹션 4 기본키 매핑 중 24:56분

identity전략을 사용하고 em.persist을 하고난 뒤, member.getId()했을때 select 쿼리가 왜 안날라가는지에 대해 설명하실 때 JDBC 드라이버 관련된 이야기를 하셨습니다.

근데 em.persist를 하고 난 뒤면, 해당 멤버에 대한 엔티티가 1차 캐시에 이미 저장되어 있기 때문에 JDBC 내부 동작과는 관련없이 select 쿼리가 안나가는 것 아닌가요? DB까지 갈 필요없이 1차 캐시에 존재하니까..?

답변 2

·

답변을 작성해보세요.

0

David님의 프로필

David

2024.04.19

안녕하세요. 변은서님, 공식 서포터즈 David입니다.

em.persist를 하고 난 뒤면, 해당 멤버에 대한 엔티티가 1차 캐시에 이미 저장되어 있기 때문에

엔터티가 1차 캐시에서 저장되었다고 이해하고 계시는데, id 값은 우리가 지정하지 않기 때문에 저장한다고 한들 id가 없는 엔터티가 됩니다. 따라서, JDBC 내부동작에 의해 insert 결과로 insert된 데이터에 대한 id를 반환받아서 엔터티의 id로 세팅해줍니다.

이 과정이 없다면 id를 알기 위해 별도의 select 쿼리를 해야하는 것이죠.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.18

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

변은서님의 질문은 Identity 전략을 사용하고 em.persist를 수행한 후 member.getId() 호출 시에 왜 SELECT 쿼리가 발생하지 않는지에 관한 궁금증을 담고 있습니다. 여기서 핵심은 Identity 전략을 사용할 때, em.persist 호출 즉시 INSERT 쿼리가 발생하고 이로 인해 생성된 ID가 엔티티에 할당되기 때문입니다. 이 과정에서 1차 캐시의 역할과 JDBC 내부 동작에 대한 설명이 포함되며 궁금증이 생겼군요.

먼저, Identity 전략에서 em.persist 호출 시점에 데이터베이스와의 통신이 발생하여 ID 값을 얻게 되고, 이 ID는 바로 엔티티에 할당됩니다. 이는 Identity 전략의 특성상 엔티티의 ID가 데이터베이스에 의해 결정되기 때문입니다. 따라서, em.persist 호출 직후에는 이미 엔티티에 ID가 할당되어 있으므로, member.getId()를 호출할 때 추가적인 SELECT 쿼리가 발생할 필요가 없습니다. 이때 엔티티는 이미 1차 캐시에 저장되어 있으며, ID 값을 조회하는 행위는 메모리 내에서 이루어지기 때문에 데이터베이스와의 추가적인 통신이 발생하지 않는 것입니다.

관련하여 더 자세한 설명을 원하시면, 다음의 질문&답변을 참고하시길 바랍니다:
- identity전략에서 질문이 있습니다.에서는 persist 시점에 발생하는 동작과 관련하여 설명합니다.
- 질문있습니다.에서는 Identity 전략 사용 시, em.persist 후 영속성 컨텍스트와 1차 캐시의 관계에 대해 설명하고 있습니다.

위의 링크들은 Identity 전략과 관련된 다른 질문들로, 변은서님의 질문과 직접적으로 관련된 부분을 포함하고 있지만, 비슷한 맥락에서 영속성 컨텍스트와 1차 캐시의 동작 방식을 이해하는데 도움이 될 것으로 보입니다.

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