[JPA] Entity 객체 생명주기(Lifecycle)와 Persistence Context

2020. 9. 7. 12:51 Java 관련/JPA

Entity 객체 생명주기(Lifecycle)


  • New (비 영속 객체) : Entity 객체가 DB에 반영되지 않았고, Managed 상태가 아닌 상태를 말한다. 이 상태는 new 키워드를 사용해 생성한 Entity 객체를 말하고 영속화되지 않는다. 
  • Managed (영속 객체) : Entity 객체가 영속 객체가 된 상황은 크게 2가지가 있다. New (비 영속 객체) 상태에서 persist 메소드를 이용해 저장한 경우와 DB 테이블에 저장돼 있는 데이터를 find 메소드 또는 query를 사용해 조회한 경우다. 이 상태는 Persistence Context가 관리하는 상태이며, 해당 객체를 수정했는지(자동 변경 감지) 알아낼 수 있다.
  • Removed (삭제 객체) : Managed 상태인 객체를 remove 메소드를 이용해 삭제한 경우에 Removed (삭제 객체) 상태에 해당한다. 작업 단위가 종료되는 시점에 실제로 DB 테이블에 삭제가 동기화 된다. 이 상태에 객체는 작업 단위가 종료되는 동시에 DB에서 삭제되므로 재사용하면 안된다.
  • Detached (준 영속 객체) : 트랜잭션이 commit되었거나, clear, flush 메소드가 실행된 경우 Managed (영속 객체) 상태의 객체는 모두 Detached (준 영속 상태) 상태가 된다. 이 상태는 더 이상 DB와 동기화를 보장하지 않는다. 다시 Managed (영속 객체) 상태로 만들기 위한 merge 메소드가 존재한다.
Entity 객체의 생명주기를 잘 이해하고 있어야 DB 동기화 문제를 잘 이해할 수 있다. 실제로 DB에 반영되는 시점이 ORM에서는 다르기 때문이다.


Persistence Context (영속성 컨텍스트)

  영속성 컨텍스트는 단순히 캐시를 처리하기 위한 개념은 아니다. 이는 실제로 우리가 API를 통해 관리하거나 눈에 보이는 것은 아니다. JPA에서는 EntityManager가 영속성 컨텍스트를 갖는다.

  • 자동 변경 감지 : Managed (영속 객체) 상태의 객체가 영속성 컨텍스트에서 관리된다. 자동 변경 감지란, 영속 상태의 객체의 속성이 변경됨을 자동으로 감지하고 영속성 컨텍스트에서 관리되는 객체와 자동 동기화된다. 동기화된 객체(영속 객체)는 영속성 컨텍스트의 작업 단위가 종료되는 시점에 DB와 동기화 시킨다. 즉 영속성 컨텍스트에서 관리되는 영속 객체는 바로 DB와 동기화 되는 것이 아니라 작업 단위가 종료될 때만 동기화된다. (가능한 늦게 DB로 상태 변경을 전파한다.)
  • 캐시 : 영속성 컨테스트가 작업 단위에서 다루는 모든 객체(영속 객체)는 영속성 컨텍스트에서 기억한다. 예를 들어 key를 기준으로 Entity 객체를 조회한 경우 DB 데이터를 조회하기 전에 영속성 컨텍스트에서 영속 객체를 먼저 조회한다. 이 때 key에 해당하는 영속 객체가 존재하지 않는 경우에만 DB에서 데이터를 조회한다. 이를 반복 가능한 읽기라고 하며, DB를 조회하지 않고 영속성 컨텍스트에 영속 객체를 가져오기 때문에 성능상 많은 이점을 준다.
  • 객체 동일성 : 자바에서는 "==" 연산자를 사용해 객체 동일성을 체크한다. JPA에서 동일성은 자바와 DB 데이터에서 모두 일치하는 경우를 동일성이라고 판단한다. 즉 자바에서 "==" 연산자를 통한 동일성도 일치해야하며, DB에서는 key가 일치한 경우에만 동일성이 일치한다고 판단한다. key가 같아 자바 동일성은 해당되지만 작업 단위가 다른 경우에는 동일성이 불일치하다는 뜻이다.
출처 : https://blog.woniper.net/266?category=531455