목차
엔티티의 생명주기
엔티티는 다음과 같이 4단계의 생명 주기가 있다.
- 비영속 (new/transient)
- 영속 (managed)
- 준영속 (detached)
- 삭제 (removed)

비영속 (new / transient)
- 객체를 새로 생성한 상태이다.
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다.
- 비영속 상태는 영속상태가 아니므로 영속성 컨텍스트에 의해 관리되지 않는다.
Member member = new Member();
member.setId("memberId"); // member는 비영속상태
영속 (managed)
- 영속성 컨텍스트에 관리되는 상태이다.
- 생성한 객체를 em.persist()를 통해 영속성 컨텍스트에 저장하거나, 혹은 em.find()를 통해 DB에서 엔티티를 조회하면 영속성 컨텍스트에 저장되어 관리되어지므로 이때 영속 상태가 된다.
- 영속성 컨텍스트에 저장되었다고 해서 바로 쿼리가 날라는 것이 아니라 트랜잭션을 커밋해야 DB에 저장이 된다.
Member member = new Member(); member.setId("memberId"); // member는 비영속상태 em.getTransaction().begin(); em.persist(memeber); // memebr는 영속상태
준영속 (detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태이다.
Member member = new Member(); member.setId("memberId"); // member는 비영속상태 em.getTransaction().begin(); em.persist(memeber); // memebr는 영속상태 em.detach(member); // 특정 엔티티('member')만 준영속 상태로 전환 em.close(); // 영속성 컨텍스트를 닫음 em.clear(); // 영속성 컨텍스트의 데이터를 비움
삭제 (removed)
- 객체를 삭제한 상태이다.
- 1차캐시와 데이터베이스에서 모두 삭제된 상태이다.
em.remove(member);
그러면 비영속과 준영속의 차이는 무엇일까?
비영속과 준영속의 가장 큰 차이는 영속상태가 되어본 경험이다.
영속상태가 되기 위해서는 식별자가 반드시 필요하다.
따라서 준영속 상태의 엔티티는 식별자가 존재한다는 것을 보장하지만, 비영속 상태의 엔티티는 식별자가 존재할수도, 존재하지 않을 수도 있다.
참고
'spring 🍀 > spring-data-jpa' 카테고리의 다른 글
JPA N+1 문제 해결과정 ( join fetch + CountQuery) (0) | 2023.11.23 |
---|---|
JPA 프록시와 지연로딩/즉시로딩 (1) | 2023.11.23 |
JPA의 Entity는 기본 생성자가 왜 반드시 필요할까? (1) | 2023.11.20 |
EntityManager와 EntityManagerFactory (0) | 2023.11.20 |
영속성 컨텍스트란? (0) | 2023.11.18 |
엔티티의 생명주기
엔티티는 다음과 같이 4단계의 생명 주기가 있다.
- 비영속 (new/transient)
- 영속 (managed)
- 준영속 (detached)
- 삭제 (removed)

비영속 (new / transient)
- 객체를 새로 생성한 상태이다.
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다.
- 비영속 상태는 영속상태가 아니므로 영속성 컨텍스트에 의해 관리되지 않는다.
Member member = new Member();
member.setId("memberId"); // member는 비영속상태
영속 (managed)
- 영속성 컨텍스트에 관리되는 상태이다.
- 생성한 객체를 em.persist()를 통해 영속성 컨텍스트에 저장하거나, 혹은 em.find()를 통해 DB에서 엔티티를 조회하면 영속성 컨텍스트에 저장되어 관리되어지므로 이때 영속 상태가 된다.
- 영속성 컨텍스트에 저장되었다고 해서 바로 쿼리가 날라는 것이 아니라 트랜잭션을 커밋해야 DB에 저장이 된다.
Member member = new Member(); member.setId("memberId"); // member는 비영속상태 em.getTransaction().begin(); em.persist(memeber); // memebr는 영속상태
준영속 (detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태이다.
Member member = new Member(); member.setId("memberId"); // member는 비영속상태 em.getTransaction().begin(); em.persist(memeber); // memebr는 영속상태 em.detach(member); // 특정 엔티티('member')만 준영속 상태로 전환 em.close(); // 영속성 컨텍스트를 닫음 em.clear(); // 영속성 컨텍스트의 데이터를 비움
삭제 (removed)
- 객체를 삭제한 상태이다.
- 1차캐시와 데이터베이스에서 모두 삭제된 상태이다.
em.remove(member);
그러면 비영속과 준영속의 차이는 무엇일까?
비영속과 준영속의 가장 큰 차이는 영속상태가 되어본 경험이다.
영속상태가 되기 위해서는 식별자가 반드시 필요하다.
따라서 준영속 상태의 엔티티는 식별자가 존재한다는 것을 보장하지만, 비영속 상태의 엔티티는 식별자가 존재할수도, 존재하지 않을 수도 있다.
참고
'spring 🍀 > spring-data-jpa' 카테고리의 다른 글
JPA N+1 문제 해결과정 ( join fetch + CountQuery) (0) | 2023.11.23 |
---|---|
JPA 프록시와 지연로딩/즉시로딩 (1) | 2023.11.23 |
JPA의 Entity는 기본 생성자가 왜 반드시 필요할까? (1) | 2023.11.20 |
EntityManager와 EntityManagerFactory (0) | 2023.11.20 |
영속성 컨텍스트란? (0) | 2023.11.18 |