본문 바로가기
개발/JPA

Entity의 생명주기 (Entity LifeCycle)

by leedonggeun 2024. 2. 9.

JPA에서 Entity는 4가지의 생명주기를 가집니다.

비영속 (New / Transient)

Entity를 생성하고 아직 저장하지 않은 상태입니다.
따라서, 영속성 컨텍스트 혹은 데이터베이스와는 전혀 연관이 없는 상태입니다.

Member member1 = new Member();
member1.setId(1);
member1.setUserName("회원1");

 

영속 (Managed)

Entity Manager를 통해 Entity영속성 컨텍스트에 저장한 상태 혹은 저장된 Entity를 조회한 상태입니다.
영속성 컨텍스트가 관리하는 Entity를 이 영속 상태라고 합니다.

Member member2 = new Member();
member2.setId(2);
member2.setUserName("회원2");

// 저장
entityManager.persist(member2);

// 혹은 조회
member2 = entityManager.find(Member.class, 2);

 

준영속 (Detached)

영속성 컨텍스트가 관리하던 영속 상태의 Entity를 관리하지 않는 상태로 변경했을 때의 상태입니다.

// 위에서 영속 상태로 변경한 member2 객체를 준영속 상태로 변경한다.
entityManager.detach(member2);

// 혹은 영속성 컨텍스트를 닫을 때도 변경된다.
entityManager.close();

// 혹은 영속성 컨텍스트를 초기화할 때도 변경된다.
entityManager.clear();

사실 잘 이해가 가지 않아 더 찾아봤습니다.
아래와 같이 Entity의 식별자가 변경되거나, 트랜잭션 중 Detach되는 경우가 실무에서 그나마 발생할 것 같습니다. (사실 이럴 경우가 없을 것 같지만)

Member member3 = entityManager.find(Member.class, 3);
member3.setId(4);	// 식별자가 영속성 컨텍스트에 없는 값으로 변경되므로 준영속 상태로 변경된다.
member3.setUserName("회원3변경");
Member member3 = entityManager.find(Member.class, 3);
member3.setUserName("회원3변경");

// 커밋 전 준영속 상태로 변경한다.
entityManager.detach(member3);

// 커밋 이후 UPDATE문이 발생하지 않는다.
transaction.commit();

병합 (merge)

준영속 상태의 Entity를 다시 영속 상태로 변경하려면 병합해야합니다.
병합은 비영속 상태의 Entity도 사용이 가능합니다.

// 영속 상태의 Entity
Member member = entityManager.find(Member.class, 1);

// 준영속 상태로 변경한다.
entityManager.detach(member);

member.setUserName("병합된 회원1");
 
// 다시 영속 상태로 변경해준다. 
// 이때, 식별자를 기준으로 영속성 컨텍스트에서 조회한다.
// 식별자가 이미 존재한다면 UPDATE / 없다면 INSERT가 수행된다.
entityManager.merge(member);

 

삭제 (Removed)

Entity를 영속성 컨텍스트와 데이터베이스에서 삭제하는 경우입니다.

Member member = entityManager.find(Member.class, 1);

entityManager.remove(member);

 

'개발 > JPA' 카테고리의 다른 글

영속성 컨텍스트 (Persistence Context)  (0) 2024.02.10

댓글