728x90

✅ JPA 핵심 메서드 정리

메서드 설명 상태 변화 DB반영 시점
persist() 새 객체를 영속 상태로 전환 비영속 → 영속 flush/commit
find() ID 기반으로 엔티티 조회 없음 (바로 영속 상태 반환) 즉시 SQL 실행
remove() 영속 상태 엔티티 삭제 예약 영속 → 삭제 예정 flush/commit
merge() 준영속/비영속 객체 병합 비/준영속 → 영속 (복사본 생성) flush/commit
flush() 영속성 컨텍스트의 변경 내용을 DB에 반영 없음 즉시 DB 반영
detach() 영속성 컨텍스트에서 분리 영속 → 준영속 해당 객체만 관리 종료
clear() 전체 영속성 컨텍스트 초기화 모든 객체 준영속화 모든 객체 관리 종료
contains() 해당 엔티티가 현재 영속성 컨텍스트에 있는지 확인 상태 확인용 없음

 

 


1️⃣ persist(Object entity)

  • 비영속 상태 객체를 영속 상태로 만듬 (JPA가 관리하게 됨)
  • insert SQL은 즉시 실행 ❌, 트랜잭션 커밋 시 실행됨 (쓰기 지연 저장소에 적재됨)
  • 주의: ID가 없는 경우엔 @GeneratedValue 설정이 있어야 자동 생성됨
Orders order = new Orders("A-123");
entityManager.persist(order); // 영속 상태 등록 (insert SQL 아직 X)

 

 


2️⃣ find(Class<T> entityClass, Object primaryKey)

  • ID(PK) 기반 조회
  • 1차 캐시 → DB 순서로 조회
  • 항상 영속 상태 객체를 반환
  • 만약 못 찾으면 null 반환
 
Orders order = entityManager.find(Orders.class, 1L); // select 실행 (또는 캐시에서 반환)

 


3️⃣ remove(Object entity)

  • 영속 상태 객체를 삭제 대상으로 표시
  • 트랜잭션 커밋 시 실제 DELETE SQL 실행
Orders order = entityManager.find(Orders.class, 1L);
entityManager.remove(order); // delete SQL은 flush 또는 commit 시 실행

 

 


4️⃣ merge(Object detachedEntity)

  • 준영속 또는 비영속 객체를 영속 상태로 병합
  • 새로운 영속 객체를 만들어 반환
  • 원래 객체는 여전히 관리되지 않음
Orders detachedOrder = new Orders();
detachedOrder.setId(1L); // DB에 이미 있는 주문

Orders managedOrder = entityManager.merge(detachedOrder); // 복사본을 만들어 영속 상태로 병합

🟡 주의: persist()는 동일한 ID가 이미 있으면 예외 발생하지만, merge()는 기존 데이터 위에 병합함

 

 


5️⃣ flush()

  • 영속성 컨텍스트의 변경 내용을 즉시 DB에 반영
  • 보통은 커밋 시점에 자동 호출되지만, 명시적으로 호출해서 즉시 DB 반영 가능
entityManager.flush(); // insert/update/delete SQL 실행

예시:

entityManager.persist(order); // insert SQL 준비됨 (쓰기 지연 저장소)
entityManager.flush();        // 지금 DB에 insert SQL 실행

 

 


6️⃣ detach(Object entity)

  • 해당 엔티티만 영속성 컨텍스트에서 분리함
  • 즉시 준영속 상태가 되어 JPA가 더 이상 추적하지 않음
entityManager.detach(order); // 더 이상 변경감지 안 됨
order.setOrderCode("B-123"); // 반영 안 됨!

 

 


7️⃣ clear()

  • 영속성 컨텍스트를 전체 초기화
  • 즉, 현재 관리 중인 모든 영속 객체를 한 번에 detach
entityManager.clear(); // 관리 중이던 모든 객체 → 준영속 상태

 

 


8️⃣ contains(Object entity)

  • 해당 객체가 현재 영속성 컨텍스트에 존재하는지 확인
entityManager.contains(order); // true: 영속 상태, false: 비/준영속

 

 


🔁 상태 변화 요약 다이어그램

 
new (비영속)
  |
  | persist()
  v
managed (영속)
  |
  | remove() or clear()/detach()
  v
removed / detached (준영속/삭제예정)

 


✅ 결론 정리

목적 메서드 비고
새로운 데이터 저장 persist() 영속성 컨텍스트에 등록
데이터 조회 find() PK로 조회, 영속 상태 보장
데이터 삭제 remove() 삭제 예약, flush 시 실행
데이터 병합 merge() 복사본 만들어 병합
DB 강제 동기화 flush() insert/update/delete 즉시 실행
개별 객체 관리 해제 detach() 변경감지 X
전체 관리 해제 clear() flush 없이 전부 detach
관리 여부 확인 contains() 영속 상태 확인용

 

 

 

 


 

728x90