Backend/JPA

[자바 ORM 표준 JPA 프로그래밍] 3장. 영속성 관리

anxi 2024. 1. 29. 20:22

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

  • 엔티티 매니저 팩토리
// persistence.xml 코드의 <persistence-unit name = "{name}">
EntityManagerFactory emf = Persistence.createEntityManagerFactory("{name}");

 

- 엔티티 매니저를 만드는 공장

- 공장을 만드는 비용은 상당히 크다. -> 한 개의 엔티티 매니저 팩토리를 만들어서 전체 애플리케이션에서 공유

- 여러 스레드가 동시에 접근해도 안전 -> 서로 다른 스레드 간에 공유 가능

 

  • 엔티티 매니저
EntityManager em = emf.createEntityManager();

 

- 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유 금지


영속성 컨텍스트

  • 엔티티를 영구 저장하는 환경
em.persist(entity);

 

- 위의 메소드 실행시 entity가 영속성 컨텍스트에 저장된다.

 

  • 엔티티 매니저 생성 시 하나의 영속성 컨텍스트 생성
  • 엔티티 매니저를 통해 영속성 컨텍스트에 접근 및 관리 가능

엔티티 생명주기

비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태

Member member = new Member();
member.setId(1L);
member.setUsername("a");

 

  • 엔티티 객체를 생성하고 아직 저장하지 않은 상태
  • 영속성 컨텍스트나 DB와는 전혀 관련이 없다.

 

영속 : 영속성 컨텍스트에 저장된 상태

em.persist(member);

 

  • 영속성 컨텍스트가 관리하는 엔티티
  • 영속 상태 : 영속성 컨텍스트에 의해 관리
  • em.find()나 JPQL을 사용하여 조회한 엔티티 또한 영속 상태이다.

 

준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태

// 특정 엔티티를 준영속 상태로 변경
em.detach(member);

// 영속성 컨텍스트 닫기
em.close();

// 영속성 컨텍스트 초기화
em.clear();

 

 

삭제 : 삭제된 상태

em.remove(member);

 

  • 엔티티를 영속성 컨텍스트와 DB에서 삭제한다.

영속성 컨텍스트의 특징

  • 영속성 컨텍스트와 식별자 값
    • 영속성 컨텍스트는 엔티티를 식별자 값(PK)로 구분
    • 영속 상태는 식별자 값이 반드시 있어야 한다.
  • 영속성 컨텍스트와 DB 저장
    • 트랜잭션 커밋할 때 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영한다.(flush)
  • 장점
    • 1차 캐시 : 영속성 컨텍스트 내부의 캐시
      • 영속성 컨텍스트 내 영속 상태인 엔티티가 있다면 이후 조회시 DB에서 조회하는 것이 아닌 1차 캐시에서 조회한다.
    • 동일성 보장 
      • find를 통해 영속 상태 엔티티를 여러개 조회해서 동일성(==)을 비교해도 참(True)을 반환한다. (실제 인스턴스 동일)
    • 트랜잭션을 지원하는 쓰기 지연
      • 쓰기 지연 SQL 저장소에 쿼리를 저장해두고 트랜잭션 커밋 시 DB에 쿼리를 보낸다.
    • 변경 감지 (Dirty Checking)
      • 엔티티의 변경사항을 DB에 자동으로 반영하는 기능
      • 영속성 컨텍스트에 보관된 엔티티와 플러시 시점의 엔티티를 비교해서 엔티티를 수정한다.
    • 지연 로딩

플러시 : 영속성 컨텍스트의 변경 내용을 DB에 반영

플러시 방법

1. 직접 호출 : em.flush()

2. 트랜잭션 커밋 시 플러시 자동 호출

3. JPQL 쿼리 실행 시 플러시 자동 호출


병합 : merge()

  • 영속 상태가 아닌 엔티티를 새로운 영속 상태로 반환
  • 영속 상태가 아닌 엔티티가 영속 상태로 변경되는 것이 아닌 새로운 영속 상태의 엔티티가 되는 것이다.

 


출처 : 자바 ORM 표준 JPA 프로그래밍 책