[JPA] 영속성 관리
JPA는 어플리케이션과 데이터베이스 사이에 영속성 컨텍스트(Persistent Context)개념을 두고 데이터를 관리한다.
영속성 관리
영속성이란 영구히 저장되는 성질을 말한다. ORM 이기 때문에 영구히 저장되는 환경이 RDB이고, 영구히 저장할 대상은 엔티티다. JPA 에서는 이 행위를 엔티티 매니저라는 객체가 수행한다.
엔티티 매니저 (EntityManager)
엔티티를 관리하는 관리자다. 엔티티와 관련된 모든 작업(삽입, 수정 삭제 등)을 수행할 수 있다.
엔티티 매니저는 엔티티 매니저 팩토리를 통해 생성할 수 있다.
EntityManagerFactory emf=Persistent.createEntityManagerFactory("test");
팩토리 이므로 어플리케이션 실행 시 한번만 생성해 공유하도록 한다. (여러 쓰레드가 접근해도 안전하다.) 이 시점에 connection pool을 초기화 한다. (커넥션 풀이 만들어 진다)
EntityManager em = emf.createEntityManager();
em.persist(entity);
em.find(entity);
em.remove(entity);
같은 EntityManagerFactory
로 만들어지는 EntityManager는 같은 database에 접속한다.
영속성 컨텍스트
- 어플리케이션과 데이터베이스 사이에 존재하는 논리적인 개념으로 엔티티를 저장하는 환경을 의미한다.
entityManager
를 통해서만 접근이 가능하다.- J2EE 환경에서는 여러 엔티티 매니저가 하나의 영속성 컨텍스트를 공유한다.
- 영속성 컨텍스트의 장점
◦ 1차 캐시: 엔티티 조회시 영속성 컨텍스트에 존재하면 바로 리턴, 없으면 데이터베이스 조회 후 리턴. 1차 캐시의 키는 식별자 값이다.
◦ 동일성(==) 보장: 조회시 항상 같은 엔티티 인스턴스를 리턴(주소값이 같음)
◦ 트랜잭션을 지원하는 쓰기 지원 : 트랜잭션 커밋 될 때까지 내부 쿼리저장소에 모아뒀다가 한번에 실행
◦ 변경 감지: 엔티티의 스냅샷을 유지하면서 엔티티의 변경 사항을 체크한다.
◦ 지연 로딩: 연관된 엔티티를 모두 불러오는 것이 아니라, 실제 호출될 때 로딩되도록 지원
엔티티 생명주기
New : new로 생성만 된 상태로, 영속성 컨텍스트와 관련이 없는 엔티티
Customer customer = new Customer();
Managed(Persistent) : 영속성 컨텍스트에서 관리되는 엔티티. 반드시 식별자를 갖는다. 영속성 컨텍스트에 저장되고, 엔티티 매니저에 의해 관리된다.
entityManger.persist(customer);
Detached: 영속성 컨텍스트에 존재하다가 분리된 엔티티. detached되면 1차 캐시, 쓰기 지연 저장소에 저장된 정보들이 모두 삭제된다.
entityManger.detach(customer);
entityManger.clear();
entityManger.close();
Removed: 영속성 컨텍스트와 데이터베이스에서 삭제된 엔티티.
entityManger.remove(customer);
참고
https://joont92.github.io/jpa/%EC%98%81%EC%86%8D%EC%84%B1-%EA%B4%80%EB%A6%AC/