728x90
✅ entityManager.persist()란?
persist()는 비영속 상태의 객체를 영속 상태로 바꾸는 메서드야.
JPA에서 객체는 총 4가지 상태 중 하나를 가짐:
상태 | 설명 |
비영속 (new) | DB랑 아무 관련 없는 순수 자바 객체 |
영속 (managed) | JPA가 관리 중인 상태. 1차 캐시에 올라가 있음 |
준영속 (detached) | 원래 영속 상태였지만 JPA가 더 이상 관리하지 않음 |
삭제 (removed) | 삭제 예약 상태. flush 시 DB에서 삭제됨 |
✅ persist() 호출 흐름
Orders order = new Orders(); // 비영속 상태
order.setOrderCode("ABC123");
entityManager.persist(order); // 여기서부터 영속 상태!
이 때 JPA 내부에서는?
- 영속성 컨텍스트에 등록됨
- 객체는 managed 상태로 바뀜
- 아직 DB에는 반영되지 않음 (insert SQL이 즉시 실행되지는 않음)
- 트랜잭션 커밋 시점 혹은 flush() 시점에 실제 SQL이 DB에 날아감
✅ 정리: persist()가 하는 일
동작 | 설명 |
영속 상태 등록 | 객체를 JPA가 관리하는 상태로 만듬 |
1차 캐시 등록 | EntityManager 내부 캐시에 등록됨 |
쓰기 지연 SQL 저장소 등록 | 나중에 DB에 반영하기 위해 insert SQL 대기열에 등록 |
DB에는 즉시 반영 ❌ | 실제 insert는 flush/commit 시점까지 미뤄짐 |
✅ 예제 코드와 함께 이해해보기
Orders order = Orders.builder()
.orderCode("A-123")
.build(); // 비영속
entityManager.persist(order); // 영속 상태로 전환됨
System.out.println(order.getId()); // 이 시점에는 아직 null일 수 있음
entityManager.flush(); // DB에 insert SQL 실행됨
System.out.println(order.getId()); // 이제는 DB에서 생성된 id가 설정됨
✅ persist() 관련 자주 하는 질문
❓ Q1. persist()는 언제 insert 쿼리를 날려요?
- 바로 날리지 않음.
- 트랜잭션 커밋 직전이나 flush() 호출 시 insert SQL 실행됨.
- 이를 쓰기 지연(write-behind) 전략이라고 해.
❓ Q2. persist()와 save()는 뭐가 달라요?
- save()는 JPA가 아닌 Spring Data JPA가 제공하는 메서드.
- 내부적으로는 persist() 혹은 merge()를 호출함 (상태에 따라 다름)
- 즉, persist()는 JPA 표준, save()는 Spring Data JPA 편의 기능
❓ Q3. persist()와 merge() 차이는?
구분 | persist | merge |
대상 상태 | 새 객체 (비영속) | 준영속 또는 새로운 객체 |
동작 | 그대로 영속화 | 새로 복사본을 만들어 영속화 |
반환값 | void | 영속된 복사본 반환 |
✅ 시각화 (간단한 다이어그램)
// persist() 호출 전
Heap (자바 객체 메모리)
-----------------------
Orders@123 (비영속 객체)
└── orderCode: "A-123"
// persist() 호출 후
JPA 영속성 컨텍스트 (1차 캐시)
-----------------------------
[1] Orders@123 (영속 상태)
└── ID: null (아직 DB에 반영 X)
flush() or commit()
DB 테이블
-----------------------------
INSERT INTO orders (order_code) VALUES ("A-123")
✅ 결론
- persist()는 단순 insert가 아님. 객체를 JPA가 직접 관리하는 상태로 만드는 핵심 메서드
- 실제 DB insert는 나중에 일어나며, 이게 JPA의 성능 최적화 핵심 전략 중 하나야
- 이후에 order.setOrderCode("B-123")처럼 속성 수정하면, JPA는 자동으로 dirty checking 해서 update SQL도 만들어줘
728x90
'프로그래밍 > Spring' 카테고리의 다른 글
💭Spring Security 정리 - 4월 15일 (1) | 2025.04.15 |
---|---|
JPA 핵심 메서드 정리 (0) | 2025.04.14 |
Hibernate실습, JPQL 활용2 - 4월 14일 (0) | 2025.04.14 |
Hibernate실습, JPQL 활용 - 4월 14일 (0) | 2025.04.14 |
Hibernate란 - 4월 11일 (0) | 2025.04.11 |