• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

jpql로 여러 값을 가져올때 영속성 컨테스트 값 저장 형태

23.12.21 17:11 작성 조회수 150

0

예를들어 id값이 20~30인 member를 가져올때 영속성 컨테스트안의 1차캐시에는 값들이 어떻게 저장이 되나요?

 

일단 강의에서는 em.persist 와 em.find 인 경우 1차 캐시에 값을 저장한다고 해서 위와 같이 jpql을 사용했을때 일단 영속성 컨테스트에 값이 저장되는지 확인해보았습니다.

영속성 컨테스트에 값이 저장되었다면 commit시

1.flush 발생

2.스냅샷과 비교해서 변경감지.

3.변경이있었다면(setter) 쓰기 지연 SQL 저장소에 UPDATE쿼리 생성 및 저장

4.쓰기 지연 SQL 저장소에 있는 모든 쿼리를 실행.

5.커밋(실제DB반영)

위 과정이 일어나서 NAME 값이 changeMember로 변경되어야하는데 확인해보니 실제로 값이 변경되는걸 확인할 수 있었습니다.

 

update 쿼리도 2번일어나는데

 

그럼 위의 예시에서

executeQuery로 jpql 실행 시

1차 캐시에 값이

@id Entity

20 member(20,memberA)

30 member(30,memberB)

이렇게 저장되는 거 같은데 맞나요??(리스트로 가져오면 , 하나씩 풀어서 저장)

 

그리고 commit시 위에 제가 생각한 과정대로 이해한게 맞을까요?

답변 2

·

답변을 작성해보세요.

1

안녕하세요. 덴푸라님

예를들어 id값이 20~30인 member를 가져올때 영속성 컨테스트안의 1차캐시에는 값들이 어떻게 저장이 되나요?

-> 이 경우 id값이 20 ~ 30인 member를 데이터베이스에서 조회하고 영속성 컨텍스트에 보관합니다. 만약 기존에 영속성 컨텍스트에 같은 id의 엔티티가 존재한다면, 방금 JPQL로 조회한 엔티티를 버립니다.

나머지 부분은 생각하신 내용이 맞습니다 🙂

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.21

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

덴푸라님의 질문에 대해 “자바 ORM 표준 JPA 프로그래밍 - 기본편” 강의에서 관련된 내용이 있어 안내드립니다. 영속성 컨텍스트와 1차 캐시의 동작원리, 쓰기 지연 저장소에 대한 작동 메커니즘, flush 발생 시점, 그리고 엔티티 상태 변화에 따라 발생하는 쿼리의 흐름 등에 대해 궁금하신 것으로 보입니다.

영속성 컨텍스트와 1차 캐시, 쓰기 지연 저장소와 관련하여 유사한 질문에 답변이 제공된 경우가 있으니 참고하시면 도움이 될 것 같습니다.

  • “1차캐시와 SQL 쓰기지연 저장소에 저장되는 시점이 궁금합니다.“에 대한 답변: 링크
  • “변경 감지에 대해서 질문이 있습니다.“에 대한 답변: 링크
  • “엔티티매니저 persist 와 트랜잭션 커밋 관련해서 질문드립니다.“에 대한 답변: 링크

위의 링크들을 참고하시면 영속성 컨텍스트의 동작 과정 및 트랜잭션과 관련한 자세한 설명을 확인하실 수 있습니다.

추가 질문이 있으시다면 해당 게시글에 댓글을 달아 질문하시면 강의 담당자나 다른 수강생들이 도움을 줄 수도 있습니다.

감사합니다.