해결된 질문
작성
·
72
·
수정됨
0
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)
[질문 내용]
선생님 질문이 있습니다.
강의 22:00 쯤 변경 감지 듣다가 궁금증이 생겼습니다.
질문은
영속 컨텍스트에 넣지 않은 상태로 DB에서 바로 가져올 땐 커밋 시점 보다 먼저 쿼리가 발생하나요?
package hellojpa;
import jakarta.persistence.*;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = em.find(Member.class, 450L);
member.setName("XXXX");
// em.persist(member);
System.out.println("==================");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
출력결과
Hibernate:
select
m1_0.id,
m1_0.name
from
Member m1_0
where
m1_0.id=?
==================
Hibernate:
/* update
for hellojpa.Member */update Member
set
name=?
where
id=?
예상 출력 결과는
===
select ...
update ...
이렇게 나올 줄 알았는데요 왜 이렇게 나오지 않을까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 문주영님 질문에 답변드리겠습니다.
JPA의 변경 감지 기능은 영속성 컨텍스트 내의 객체 변경을 감지하고, 데이터베이스에 반영하는 역할을 합니다. 여러분의 코드에서는 다음과 같은 과정이 이루어집니다.
em.find()
: 데이터베이스에서 id
가 450L인 Member
엔티티를 조회합니다. 이 시점에서 SELECT
쿼리가 발생하고, 이는 결과적으로 콘솔에 “==================” 이전에 출력됩니다.
member.setName("XXXX")
: 조회한 엔티티의 name
속성을 변경합니다. 하지만 이 단계에서는 데이터베이스에 UPDATE
쿼리가 바로 실행되지 않고, 영속성 컨텍스트에 변경 사항으로 반영될 준비를 합니다.
tx.commit()
: 트랜잭션이 커밋되는 시점에 JPA는 내부적으로 flush
를 호출하여 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영합니다. 이 때 변경 감지가 일어나며 UPDATE
쿼리가 실행되고, 콘솔에 “==================” 이후에 출력됩니다.
이 순서대로 쿼리가 실행되는 이유는, JPA는 flush
를 수행함으로써 영속성 컨텍스트와 데이터베이스 간의 동기화를 이루기 때문입니다. flush
메커니즘 덕분에 데이터베이스에 꼭 필요한 최소한의 쿼리만 전달됩니다.
비슷한 맥락에서, 아래 링크들을 참고하면 더 많은 내용을 이해하실 수 있습니다.
SELECT
나 UPDATE
쿼리가 트리거되는지를 설명합니다.JPA Persist 및 Commit 시 SQL 시점에 대한 질문
em.persist()
와 commit
호출 시 쿼리가 발생하는 시점을 설명합니다.flush
과 commit
에 의한 UPDATE
쿼리 시점에 대한 설명이 포함되어 있습니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
영속 컨텍스트에 저장되지 않았다면
db 조회 시에는 항상 커밋 전 바로 select 쿼리 보내진다고 이해해도 될까요?