[4. 영속성 관리 - 내부 동작 방식] JPA 쓰기 지연(Write-Behind) 동작 과정?

2025. 12. 23. 12:49·공부/1. 자바 ORM 표준 JPA 프로그래밍 - 기본편

1️⃣ 기본 코드 먼저 보기

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작

em.persist(memberA);
em.persist(memberB);

//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋

이 코드를 실행하면 memberA, memberB 두 개의 데이터가 DB에 저장됩니다.
하지만 중요한 포인트는 INSERT SQL이 실행되는 시점입니다.


출처 - 인프런 자바 ORM 표준 JPA 프로그래밍 - 기본편

2️⃣ persist(memberA)를 호출하면 무슨 일이 일어날까?

em.persist(memberA);

이 한 줄에서 DB에 INSERT가 실행될 것 같지만, 실제로는 그렇지 않습니다.

✔ 이 시점에 일어나는 일

✅ ① 영속성 컨텍스트에 등록

  • memberA는 영속 상태가 됩니다
  • EntityManager가 이 엔티티를 관리하기 시작합니다

✅ ② 1차 캐시에 저장

  • 1차 캐시는 영속성 컨텍스트 내부에 있는 캐시
  • 보통 @Id 값을 키로 사용합니다
1차 캐시
@Id        Entity
memberA → memberA 객체

✅ ③ INSERT SQL 생성 (하지만 실행 ❌)

  • JPA는 INSERT SQL을 미리 만들어 둡니다
  • 이 SQL은 바로 DB로 가지 않고
    👉 쓰기 지연 SQL 저장소에 보관됩니다

📌 아직 DB와 통신하지 않습니다


출처 - 인프런 자바 ORM 표준 JPA 프로그래밍 - 기본편

3️⃣ persist(memberB)도 동일하게 처리된다

em.persist(memberB);

👉 memberB도 같은 과정을 거칩니다.

현재 상태 정리

✔ 1차 캐시

@Id        Entity
memberA → memberA
memberB → memberB

✔ 쓰기 지연 SQL 저장소

INSERT memberA
INSERT memberB

 

📌 중요

  • 이 시점까지도 DB에는 아무 SQL도 실행되지 않았습니다
  • persist는 “저장 예약”이라고 생각하면 이해가 쉽습니다

출처 - 인프런 자바 ORM 표준 JPA 프로그래밍 - 기본편

4️⃣ transaction.commit()을 호출하면 무슨 일이 일어날까?

transaction.commit();

이 한 줄이 모든 일을 실제로 처리하는 시점입니다.

커밋 과정은 내부적으로 이렇게 진행됩니다

🔹 ① flush 발생

  • 영속성 컨텍스트가 DB와 동기화
  • 쓰기 지연 SQL 저장소에 있던 SQL을 DB로 전송
INSERT memberA
INSERT memberB

🔹 ② DB에 실제 INSERT 실행

  • 이때 비로소 DB에 데이터가 저장됩니다

🔹 ③ DB 트랜잭션 commit

  • 모든 SQL이 정상적으로 실행되면 커밋
  • 데이터가 최종 확정됩니다

5️⃣ 전체 흐름 한 번에 정리

📍 persist 시점

  • 1차 캐시에 저장
  • INSERT SQL 생성
  • 쓰기 지연 SQL 저장소에 보관
  • ❌ DB 실행 안 함

📍 commit 시점

  • flush 발생
  • INSERT SQL 실행
  • DB에 반영
  • 트랜잭션 커밋

'공부 > 1. 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글

[6. 연관관계 매핑 기초] 테이블 관계를 잘 모르겠다… 1대다, 다대일?  (1) 2025.12.28
[4. 영속성 관리 - 내부 동작 방식] 변경감지(Dirty Checking)이란?  (1) 2025.12.23
[4. 영속성 관리 - 내부 동작 방식] JPA 1차 캐시란 무엇일까? em.find()가 DB를 바로 조회하지 않는 이유  (1) 2025.12.22
[4. 영속성 관리 - 내부 동작 방식] JPA 엔티티 생명주기 정리 (비영속 → 영속 → 준영속 → 삭제)  (0) 2025.12.22
[4. 영속성 관리 - 내부 동작 방식] EntityManager는 어떻게 생성되고 DB와 연결될까?(커넥션 풀 개념 정리)  (0) 2025.12.22
'공부/1. 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글
  • [6. 연관관계 매핑 기초] 테이블 관계를 잘 모르겠다… 1대다, 다대일?
  • [4. 영속성 관리 - 내부 동작 방식] 변경감지(Dirty Checking)이란?
  • [4. 영속성 관리 - 내부 동작 방식] JPA 1차 캐시란 무엇일까? em.find()가 DB를 바로 조회하지 않는 이유
  • [4. 영속성 관리 - 내부 동작 방식] JPA 엔티티 생명주기 정리 (비영속 → 영속 → 준영속 → 삭제)
hak0622
hak0622
개발하면서 “이게 뭐지?”라는 순간마다 궁금한 점을 바탕으로 정리한 개발 블로그입니다.
  • hak0622
    궁금한 개발 이야기 Why?
    hak0622
  • 전체
    오늘
    어제
    • 분류 전체보기 (71)
      • 공부 (36)
        • 1. 자바 ORM 표준 JPA 프로그래밍 - 기본.. (35)
        • 시험 (1)
      • 프로젝트 (35)
        • 스프링 부트 3 백엔드 개발자 되기 Blog + .. (35)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
hak0622
[4. 영속성 관리 - 내부 동작 방식] JPA 쓰기 지연(Write-Behind) 동작 과정?
상단으로

티스토리툴바