JPA에서 엔티티는 비영속 → 영속 → 준영속 → 삭제의 상태를 가지며, 각 상태는 EntityManager가 엔티티를 어떻게 관리하는지에 따라 달라집니다.
| 상태 | 설명 | 주요 메서드 |
|---|---|---|
| 비영속 (Transient) | EntityManager가 관리하지 않는 상태 | new 객체 생성 |
| 영속 (Persistent) | EntityManager가 관리하는 상태, 변경 시 자동으로 DB 반영 | persist(), find(), merge() |
| 준영속 (Detached) | EntityManager가 더 이상 관리하지 않는 상태, 변경해도 DB에 반영되지 않음 | detach(), clear(), close() |
| 삭제 (Removed) | 엔티티가 삭제된 상태, 트랜잭션이 커밋되면 DB에서 제거됨 | remove() |
EntityManager가 관리하지 않는 상태. User user = new User(); // 비영속 상태
user.setUsername("John");
new키워드로 생성한 객체는 아직EntityManager와 연결되지 않았으므로 비영속 상태입니다.
EntityManager가 관리하는 상태. EntityManager에서 동일 엔티티 조회 시 DB 조회 없이 캐시 사용. EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
User user = new User();
user.setUsername("John");
em.persist(user); // 영속 상태로 변경 (1차 캐시에 저장)
user.setUsername("Mike"); // 변경 감지(Dirty Checking), 트랜잭션 종료 시 자동 반영
tx.commit(); // DB에 반영됨 (INSERT 실행)
em.close();
📌 중요 개념
EntityManager는 영속 상태 엔티티의 변경 사항을 감지하고, 트랜잭션 종료 시 자동으로 UPDATE 실행. EntityManager 내에서 동일 엔티티를 여러 번 조회하면 DB를 조회하지 않고 1차 캐시에서 가져옴.EntityManager가 더 이상 관리하지 않는 상태. merge() 사용. User user = em.find(User.class, 1L); // 영속 상태
em.detach(user); // 준영속 상태로 변경
user.setUsername("NewName"); // 변경해도 DB에 반영되지 않음
📌 준영속 상태가 되는 방법
| 방법 | 설명 |
|------|------|
| detach(entity) | 특정 엔티티만 준영속 상태로 변경 |
| clear() | 영속성 컨텍스트를 초기화하여 모든 엔티티를 준영속 상태로 변경 |
| close() | 영속성 컨텍스트를 종료하여 모든 엔티티를 준영속 상태로 변경 |
📌 준영속 상태에서 다시 영속 상태로 변경
User mergedUser = em.merge(user); // 다시 영속 상태로 변경
remove()를 호출하면 엔티티가 삭제 상태가 됨. DELETE 실행). User user = em.find(User.class, 1L);
em.remove(user); // 삭제 상태
삭제 상태가 되면
commit()시 실제 DB에서DELETE쿼리가 실행됩니다.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
// 1. 비영속 상태
User user = new User();
user.setUsername("John");
// 2. 영속 상태
em.persist(user);
// 3. 준영속 상태
em.detach(user);
// 4. 다시 영속 상태로 변경
User mergedUser = em.merge(user);
// 5. 삭제 상태
em.remove(mergedUser);
tx.commit();
em.close();
| 상태 변화 | 메서드 | 설명 |
|---|---|---|
| 비영속 → 영속 | persist(entity) | 엔티티를 영속성 컨텍스트에 등록 |
| 영속 → 준영속 | detach(entity), clear(), close() | 영속성 컨텍스트에서 분리 |
| 준영속 → 영속 | merge(entity) | 엔티티를 다시 영속 상태로 변경 |
| 영속 → 삭제 | remove(entity) | 삭제 상태로 변경 후 트랜잭션 커밋 시 DB에서 제거 |
detach(), clear(), close()를 사용하면 준영속 상태가 되어 EntityManager가 더 이상 관리하지 않는다.remove() 호출 후 트랜잭션 커밋 시 실제 DELETE 쿼리가 실행된다.merge()를 사용해야 한다.JPA 생명주기를 잘 이해하면 효율적인 성능 최적화와 데이터 관리가 가능합니다! 🚀