woniper

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

Framework

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

Woniper 2015.05.12 16:48
  1. JPA란 무엇인가?
  2. JavaSE 환경에서 JPA 설정 및 CRUD
  3. JavaEE 환경(Spring)에서 JPA 설정 및 CRUD
  4. @OneToOne, 1:1 관계 매핑
  5. @OneToMany / @ManyToOne, 1:N / N:1 관계 매핑
  6. @ManyToMany, N:M 관계 매핑
  7. Entity 객체 생명주기(Lifecycle)와 Persistence Context

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가 같아 자바 동일성은 해당되지만 작업 단위가 다른 경우에는 동일성이 불일치하다는 뜻이다.


4 Comments
  • 프로필사진 어구래 2016.07.15 09:47 신고 JPA보고 갑니다.. 다 봤습니다.. 정말 정리가 잘 되어 있네요... 도움 많이 됐습니다. 고맙습니다.
  • 프로필사진 BlogIcon Woniper 2016.07.15 09:54 신고 도움되셨다니 다행이네요. 감사합니다!!
  • 프로필사진 질문자 2017.01.17 16:12 신고 JPA란 무엇인가? 부터 현재 게시글까지 잘 보았습니다. 도움이 많이 됐습니다. 감사합니다.
    그런데 제일 마지막 부분에 'key가 같아 자바 동일성은 해당되지만 작업 단위가 다른 경우에는 동일성이 불일치하다는 뜻이다.'
    라는 말이 이해가 잘 안가서 질문드립니다.

    객체 동일성 설명을 보면서 제가 이해한대로 위의 말을 다시 써 보자면
    key가 같으면 DB 동일성은 해당되지만 작업 단위가 다른경우에는 ( 자바 기준으로 동일객체가 아니라고 생각하는거 맞나요? ) JPA의 객체 동일성이 불일치하다는 뜻이다.
    라고 적는게 맞는거 같은데... 혹시 제가 잘못 이해한건가요? 잘못 이해했다면 어떤 부분에서 잘못 이해했는지 알려주시면 감사하겠습니다.
  • 프로필사진 BlogIcon Woniper 2017.02.02 16:38 신고 흔히 자바에서 생각하는 동일한 인스턴스(객체)인지 판단하기 위해서는 "==" 연산자를 사용하는건 아실거에요. 그런데 jpa에서는 DB에 데이터를 구분하는 key 또한 동일해야 동일하다는 조건인데요. 여기서 말하는 작업 단위는 하나에 트랜잭션을 말합니다. 정리해보자면
    java 동일성
    a == b 가 true인 경우는 동일성
    jpa
    a == b 가 true, a.key == b.key 도 true인 경우는 동일성입니다.
    그런데 jpa persistence를 정확히 이해하셨다면 하나에 트랜잭션에서 조회된 객체는 여러번 조회되어도 동일한 객체를 반환합니다. 말로 설명하자니 어려운데... 혹시 이해 안가시면 다시 댓글 달아주세요. 알림이 오지 않아 이제야봤네요. 감사합니다.
댓글쓰기 폼