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이 실행되는 시점입니다.

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와 통신하지 않습니다

3️⃣ persist(memberB)도 동일하게 처리된다
em.persist(memberB);
👉 memberB도 같은 과정을 거칩니다.
현재 상태 정리
✔ 1차 캐시
@Id Entity
memberA → memberA
memberB → memberB
✔ 쓰기 지연 SQL 저장소
INSERT memberA
INSERT memberB
📌 중요
- 이 시점까지도 DB에는 아무 SQL도 실행되지 않았습니다
- persist는 “저장 예약”이라고 생각하면 이해가 쉽습니다

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 |