경계의 경계

Hibernate의 Entity Lifecycle 본문

Spring Data/Hibernate

Hibernate의 Entity Lifecycle

gigyesik 2024. 5. 8. 20:39

들어가며

Hibernate를 사용하면 객체를 생성하여 DB에 데이터를 저장하거나, DB에 들어 있는 데이터를 조회할 수 있다.

이를 엔티티(영속성 객체)라 하는데, 이 엔티티는 DB에 연결되어 있는 라이프사이클동안 여러 단계를 거친다.

Hibernate에서 정의하는 엔티티의 상태는 다음과 같다.

  • Transient State
  • Persistent State
  • Detached State
  • Removed State

State 1 : Transient State

  • Transient State는 엔티티 객체의 첫 번째 상태로, new 키워드를 통해 객체가 새로 생성된 POJO(Plain Old Java Object)이다.
  • Transient State에서 엔티티 객체는 Hibernate 세션에 연결되어 있지 않다. 즉, DB에 연결되어 있지 않다.
  • 엔티티 객체에 수정이 일어나도, DB 데이터는 변화하지 않는다.
  • 힙 메모리(Heap Memory)에 존재하고 있다.
    • 어플리케이션에서 객체가 생성되었으나 세션에 연결되지 않은 경우나
    • 객체가 닫힌 세션에서 생성된 경우이다.
Employee e = new Employee();   
e.setId(1);  
e.setFirstName("Gigyesik");  

State 2 : Persistent State

  • 엔티티 객체가 Hibernate 세션에 연결되고 나면 그 객체는 Persistent State로 변화한다.
    • Hibernate 세션을 사용하여 엔티티 객체를 저장하는 경우
    • Hibernate 세션을 사용하여 엔티티 객체를 조회하는 경우
  • 엔티티 객체 하나는 DB 테이블의 row 하나를 의미한다. 즉, 엔티티 객체에 수정이 일어나면 DB에도 수정이 일어난다.
  • 사용 가능한 메서드는 아래와 같다.
    • session.persist(e);
    • session.save(e);
    • session.saveOrUpdate(e);
    • session.update(e);
    • session.merge(e);
    • session.lock(e);
// Transient State
Employee e = new Employee("Gigyesik"); 

//Persistent State
session.save(e);

State 3 : Detached State

  • Persistent State 객체를 Detached State로 바꾸기 위해서는 세션을 닫거나 캐시를 비워야 한다.
  • 세션이 닫히거나 캐시가 클리어되면 엔티티 객체에 수정이 일어나도 DB 데이터에는 영향을 주지 않는다.
  • 언제든 아래 메서드를 사용하여 새로운 세션에 연결해 Persistent State로 돌아갈 수 있다.
    • merge()
    • update()
    • load()
    • refresh()
    • save()
    • update()
  • Detached State에서 사용할 수 있는 메서드는 아래와 같다.
    • session.detach(e);
    • session.evict(e);
    • session.clear();
    • session.close();
// Transient State
Employee e = new Employee("Gigyesik");

// Persistent State 
session.save(e); 

// Detached State
session.close(); 

State 4 : Removed State

  • Hibernate의 엔티티 Lifecycle 중 마지막 상태이다.
  • 엔티티 객체가 DB에서 삭제되어 있는 경우이다.
  • session.delete() 메서드를 통해 사용할 수 있다.
  • DB에 데이터가 존재하지 않으므로 엔티티 객체가 수정되어도 DB에 반영되지 않는다.
Employee e = new Employee();     
Session s = sessionfactory.openSession();
e.setId(1);

// Persistent State
session.save(e)  

// Removed State                 
session.delete(e);

Resources