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

영한노게임님의 프로필 이미지
영한노게임

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

준영속 상태

질문 em.find(), JPQL 조회 및 이해 확인 질문

작성

·

41

0

  1. 같은 조회이지만 JPQL은 무조건 플러시한다는 개념을 알게되었습니다 반면 find()는 그렇지 않은것으로 아는데 find()또한 1차 캐시에서 가져오지 못할 경우 플러시 후 가져와야하지 않나요? 이 두 방식은 결국 "플러시"라는 차이가 있어보이는데 이유에 대해 이해가 가지 않네요.

  2. 영속성 컨텍스트에서 관리되는 엔티티 객체에 대해 수정을 할 경우 커밋시도시 먼저 엔티티의 최종적 모습을 확인해서 Update쿼리문을 만든다고 생각(쓰기지연저장소에 저장)했습니다. 반면 persist() 곧바로 쿼리문이 쓰기지연 저장소에 insert문으로 저장된다고 인지중입니다. 그렇다면 persist()후에 해당 엔티티를 수정을 가한다면 최종적으로 커밋시에 insert + update 두 쿼리문이 수행되는 걸까요?

     

답변 2

0

jpql도 1차캐시를 우선 관찰하지 않나요?

0

안녕하세요, 인프런 AI 인턴입니다. 영한노게임님.

질문해주신 두 가지 주제에 대해 답변드리겠습니다.

  1. em.find()와 JPQL 조회의 flush 차이점

    • flush의 차이: JPQL을 사용할 때는 플러시가 자동으로 일어나지만, em.find()는 그렇지 않습니다. 이유는 em.find()는 특정 엔티티를 1차 캐시에서 우선 조회하고, 없을 경우 DB에서 직접 조회하기 때문입니다. JPQL은 SQL 쿼리를 직접 실행하여 여러 엔티티를 조회할 때 사용되기 때문에, 플러시가 필요합니다. 이 과정에서 최신 상태의 데이터를 유지하기 위해 영속성 컨텍스트의 변경 사항을 DB에 반영하는 것입니다.

유사한 질문을 다룬 답변을 참고하세요:
- Percictence Context에 대해 질문있습니다
- em.find()와 영속성 컨텍스트 관련 질문

  1. 영속화된 엔티티 수정과 쿼리 실행

    • 엔티티 수정 후 커밋: em.persist()는 엔티티를 영속성 컨텍스트에 저장하며, Insert 쿼리를 쓰기지연 저장소에 추가합니다. 이후, 엔티티의 필드를 수정하면, 플러시 시점에 Update 쿼리가 추가로 쓰기지연 저장소에 기록됩니다. 따라서, 커밋 시 Insert와 Update 쿼리가 둘 다 실행됩니다.

유사한 질문을 다룬 답변을 참고하세요:
- JPA 1차 캐시와 쓰기지연 DB 질문 드립니다.

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

영한노게임님의 프로필 이미지
영한노게임

작성한 질문수

질문하기