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
'프로그래밍 > Spring' 카테고리의 다른 글
| 💭Spring Security OAuth2 로그인 구현 - 4월 15일 (0) | 2025.04.16 |
|---|---|
| 💭Spring Security 정리 - 4월 15일 (1) | 2025.04.15 |
| entityManager.persist()란? (0) | 2025.04.14 |
| Hibernate실습, JPQL 활용2 - 4월 14일 (0) | 2025.04.14 |
| Hibernate실습, JPQL 활용 - 4월 14일 (0) | 2025.04.14 |