728x90
반응형

JPA에서 Entity의 생명주기는 엔티티가 생성되고 영속성 컨텍스트에 저장되며, 분리되거나 삭제되기까지의 과정을 말합니다. 엔티티는 비영속(New/Transient), 영속(Managed), 준영속(Detached), 삭제(Removed) 삭제로 구분됩니다.

1. 비영속(New/Transient)

비영속 상태는 엔티티가 단순히 메모리에 존재하지만 영속성 컨텍스트에 포함되지 않은 상태입니다. 따라서 JPA가 전혀 관리하지 않으며, 데이터베이스와도 연결되지 않습니다.

Member member = new Member(); // 비영속 상태

여기서 member는 영속성 컨텍스트에 저장되지 않았기에 비영속 상태입니다. 이 상태일 때는 EntityManager의 도움 없이 일반 객체로 사용할 수 있습니다.

 

2. 영속(Managed)

EntityManager 를 통해 영속성 컨텍스트에 저장된 상태로, JPA가 해당 엔티티를 관리합니다. 영속 상태의 엔티티는 변경 사항이 자동으로 반영됩니다. 예를 들어 엔티티의 값이 수정되면 Dirty Checking을 통해 트랜잭션이 종료될 때 데이터베이스에 반영됩니다.

em.persist(member); // 객체를 영속성 컨텍스트에 저장하여 영속 상태로 전환

3. 준영속(Detached)

준영속 상태는 한때 영속 상태였던 엔티티가 분리되어 영속성 컨텍스트에서 관리되지 않은 상태입니다. 영속성 컨텍스트가 이 엔티티를 추적하지 않기 때문에 변경 사항이 데이터베이스에 반영되지 않으며, 지연 로딩도 사용할 수 없습니다.

준영속 만드는 법

detach

특정 엔티티를 준영속 상태로 만듭니다.em.detach(member);는 member 엔티티만 영속성 컨텍스트에서 분리하여 준영속 상태로 만듭니다. 이후 변경 사항은 데이터베이스에 반영되지 않습니다.

em.detach(member); // 특정 엔티티만 준영속 상태로 변경

clear

영속성 컨텍스트에 존재하는 모든 엔티티를 준영속 상태로 만듭니다. em.clear();는 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만들며, 영속성 컨텍스트가 초기화되어 새로운 상태가 됩니다.

em.clear(); // 모든 엔티티를 준영속 상태로 변경

close

영속성 컨텍스트를 종료하고 관리하던 모든 엔티티를 준영속 상태로 만듭니다. em.close();는 영속성 컨텍스트를 완전히 닫고 모든 엔티티를 준영속 상태로 전환합니다.

em.close(); // 영속성 컨텍스트 종료

4. 삭제 (Removed)

삭제 상태는 엔티티가 영속성 컨텍스트와 데이터베이스에서 제거된 상태입니다. remove() 메서드를 호출하면 삭제 상태가 되며, 트랜잭션이 끝날 때 데이터베이스에서 제거됩니다.

em.remove(member); // 엔티티를 삭제 상태로 변경

 

em.remove(member);는 member를 영속성 컨텍스트와 데이터베이스에서 삭제하도록 합니다. 이 상태의 엔티티는 더 이상 사용할 수 없습니다.

 

5. 준영속 상태의 특징과 병합 (merge)

준영속 상태는 영속 상태와 다르게 JPA가 관리하지 않기 때문에 Dirty Checking, Lazy Loading 등의 기능을 사용할 수 없습니다. 다만 준영속 상태의 엔티티는 한때 영속 상태였기 때문에 식별자(ID)를 가지고 있는 것이 비영속 상태와의 차이입니다.

 

merge

merge() 메서드는 준영속 상태의 엔티티를 다시 영속 상태로 만들어서 관리합니다. 병합 시 동일한 식별자(ID)를 가진 엔티티를 영속성 컨텍스트에서 찾아서 병합하고, 없으면 새로 조회합니다.

Member mergedMember = em.merge(member); // 준영속 상태의 엔티티를 병합하여 영속 상태로 전환

em.merge(member);는 member의 식별자를 기준으로 영속성 컨텍스트에서 동일한 엔티티를 찾고, 없으면 새로 생성하여 영속 상태로 만듭니다. 병합된 엔티티는 다시 데이터베이스와 연결됩니다.

6. 추가 메서드

persist 

새 인스턴스를 영속성 컨텍스트에 추가하여 관리 상태로 전환합니다.

em.persist(newEntity);

remove 

영속 상태의 엔티티를 삭제 상태로 전환합니다.

em.remove(existingEntity);

refresh

엔티티의 상태를 DB에 동기화 합니다.

em.refresh(entity);

lock

지정된 LockModeType으로 엔티티를 잠급니다.

em.lock(entity, LockModeType.WRITE);

 

https://docs.oracle.com/html/E13946_01/ejb3_overview_em_lifecycle.html (참고)

728x90
반응형

'Spring(Boot & FrameWork)' 카테고리의 다른 글

벌크 연산  (0) 2024.04.29
OSIV  (0) 2024.04.10
@Not Empty  (0) 2024.04.01