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 내부에서는?

  1. 영속성 컨텍스트에 등록
  2. 객체는 managed 상태로 바뀜
  3. 아직 DB에는 반영되지 않음 (insert SQL이 즉시 실행되지는 않음)
  4. 트랜잭션 커밋 시점 혹은 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