영속성 관리

Timo·2021년 4월 14일
0
post-thumbnail

김영한님의 <자바 ORM 표준 JPA 프로그래밍> 책을 정리한 내용입니다.

엔티티 매니저 팩토리와 엔티티 매니저

엔티티 매니저 팩토리는 엔티티 매니저를 만드는 공장이다.
비용이 크기 때문에 한 개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다.
반면에 엔티티 매니저 팩토리에서 엔티티 매니저를 생성하는 비용은 거의 들지 않는다.

엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 되지만,
엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안 된다.

영속성 컨텍스트

영속성 컨텍스트(Persistence Context)란? ‘엔티티를 영구 저장하는 환경’

엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

persist() 메소드는 엔티티 매니저를 사용해서 엔티티를 영속성 컨텍스트에 저장한다.

영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다.
그리고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.

엔티티의 생명 주기

엔티티는 4가지 상태가 존재한다.

  • 비영속(new/trasient): 영속성 컨텍스트와 전혀 관계 없는 상태
  • 영속(managed): 영속성 컨텍스트에 저장된 상태(영속성 컨텍스트에 의해 관리되는 상태)
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

영속성 컨텍스트의 특징

영속성 컨텍스트가 엔티티를 관리할 때 얻는 장점

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연로딩

플러시

플러시(flush)는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영(동기화)한다.

플러시를 한다고 해서 영속성 컨텍스트에 보관된 엔티티를 지우진 않는다.

준영속

영속 상태였다가 더는 영속성 컨텍스트가 관리하지 않는 상태

1차 캐시에서 엔티티가 제거되며 쓰기 지연 SQL 저장소의 관련 SQL도 전부 제거된다.

준영속 상태의 엔티티를 다시 영속 상태로 변경하려면 병합(merge)을 사용하면 된다.
merge() 메소드는 준영속 상태의 엔티티를 받아서 그 정보로 새로운 영속 상태의 엔티티를 반환한다.

profile
나는 매일 성장하는 사람

0개의 댓글