본문 바로가기
Programming/JPA & Spring Data JPA 기초

12. 영속 컨텍스트 & 라이프사이클

by JKROH 2023. 3. 23.
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

 

* 영속 객체와 영속 컨텍스트

  • 영속 엔티티 / 객체
    • DB 데이터에 매핑되는 메모리 상의 객체
    • @Entity 애너테이션을 사용한 클래스를 이용해 생성한 객체
    • 영속 컨텍스트에 보관된 객체가 영속 객체가 된다.
  • 영속 컨텍스트
    • 일종의 메모리 저장소
    • Enitity Manager가 관리할 엔티티 객체를 보관하는 장소
    • (Entity Type, 식별자)를 key로, 엔티티 객체를 value로 하는 일종의 맵 형태로 저장
  • EntityManager.close()
    • 영속 컨텍스트 제거
  • 배치처리 X

 

* 영속 컨텍스트와 캐시

  • 동일 식별자 -> 동일 객체
    • 영속 컨텍스트에 보관된 객체 조회
  • Repeatable Read 효과
    • 특정한 식별자로 읽어온 영속 객체는 영속 컨텍스트에 담긴다.
    • 동일한 식별자로 이름을 다르게 해서 객체 인스턴스를 만들어도, DB에서 select하지 않는다. 대신 영속 컨텍스트에 저장된 객체를 가져온다.

 

* 영속 객체 라이프 사이클

  • 객체를 생성하면 이 객체는 영속 객체는 아니다.
  • 이 상태에서 persist()를 통해 객체를 저장하면 해당 객체는 관리 상태가 된다.
  • 또는 find()로 읽어온 객체는 관리 상태가 된다.
  • 관리 상태는 영속 컨텍스트에 보관된 상태이다.
  • 영속 컨텍스트에 관리된다는 것은 변경이 추적된다는 의미다.
  • 따라서 관리됨 상태에 있는 객체로 변경하게 되면 트랜잭션 커밋 시점에 변경 내역이 DB에 반영된다.
  • 관리됨 상태의 객체를 remove()하면 삭제됨 상태가 된다. 즉, 삭제 됐다는 상태의 변경이 추적된다. 이는 커밋 시점에 삭제된다.
  • close()하게 되면 분리됨 상태가 되어 변경을 추적하지 않는다. detach()를 통해 강제로 분리할 수 있다.

 

* 영속 컨텍스트와 변경 추적

  • find()를 통해 찾아온 객체는 영속 컨텍스트에 보관된다.
  • 이 상태에서 데이터를 바꾸고 트랜잭션을 커밋하면 커밋 시점에 영속 컨텍스트에 담겨있는 관리됨 상태의 객체에 변경이 있는지를 확인하고, 변경된 사항을 DB에 반영한다.
  • 즉, update 쿼리를 실행한다.

 

* 분리됨 상태는 변경 추적 대상 아님

  • 분리된 객체에 아무리 변화를 가해도 변경 추적이 되지 않기 때문에 DB에 update하지 않는다.
  • 분리된 상태의 객체는 EntityManager의 merge()를 통해 다시 관리됨 상태로 바꿀 수 있다.

 

* 정리

  • JPA는 영속 엔티티(객체)를 영속 컨텍스트에 담아 변경 추적한다.
    • 트랜잭션 커밋 시점에 변경 반영
  • 배치와 같은 대량 변경은 굳이 JPA로 할 필요 없다.
    • 그냥 직접 쿼리를 실행하는 것이 낫다.
    • JPA에도 대량 변경을 관리할 수 있는 수단이 있으나 굳이.
  • 분리됨 상태는 변경을 추적하지 않는다.
반응형

댓글