자바 뚝딱거리기

[JPA] 3. 영속성 관리

bimppap 2021. 7. 9. 23:24

자바 ORM 표준 JPA 프로그래밍 3장 요약입니다 ><

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

엔티티 매니저 팩토리
-- 엔티티 매니저를 만드는 공장
-- 비용이 크다 -> 한 개만 만들어서 애플리케이션 전체에서 공유
-- 여러 스레드가 동시에 접근해도 안전 -> 스레드끼리 공유 가능

 

엔티티 매니저
-- 엔티티 매니저 공장에서 만들어짐. 비용이 거의 안 든다.
-- 동시성 문제 때문에 스레드 간에 공유하면 안 된다.
-- 엔티티 매니저는 데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. (보통 트랜잭션을 시작할 때 커넥션을 획득한다.)
-- 매니저를 통해 영속성 컨텍스트에 접근 및 관리를 할 수 있다.

3.2 영속성 컨텍스트란?

persistence context : 엔티티를 영구 저장하는 환경
-- persist() 엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장

3.3 엔티티의 생명 주기

엔티티의 상태
-- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
순수한 객체 상태. 아직 저장하지 않음. 영속성 컨텍스트나 디비와 관련 X

-- 영속(managed) : 영속성 컨텍스트에 저장된 상태
영속성 컨텍스트가 관리하는 엔티티. 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장함.

-- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 관리하지 않게 되는 상태. detach를 호출하면 비영속 상태가 된다. (close 메드로 컨텍스트를 닫거나 clear로 컨텍스트를 초기화해도 관리된던 엔티티들이 비영속 상태가 됨)

-- 삭제(removed) : 삭제된 상태
엔티티를 영속성 컨텍스트와 디비에서 삭제한다.

3.4 영속성 컨텍스트의 특징

  • 식별자
    영컨은 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다.
  • 데이터베이스 저장
    JPA는 트랜잭션을 커밋하는 순간 영컨에 새로 저장된 엔티티를 디비에 반영한다. (=플러시 flush)
  • 영속성 컨텍스트가 엔티티를 관리할 때 장점
    • 1차 캐시 : 영컨 내부의 캐시. 성능상 이점
    • 동일성 보장
    • 트랜잭션을 지원하는 쓰기 지연
    • begin(); // 트랜잭션 시작 save(A); save(B); save(C); commit(); // 트랜잭션 커밋
  • 변경 감지
  • 지연 로딩

3.5 플러시

실행하면 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.

플러시하는 법 3가지

  1. em.flush() 직접 호출
  2. 트랜잭션 커밋 (자동 호출됨)
  3. JPQL 실행 (자동 호출됨)

플러시 실행 시 일어나는 일

  1. 변경 감지 동작 -> 영컨 내 모든 엔티티를 스냅샷과 비교. 수정된 엔티티를 찾아 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록
  2. 쓰기 지연 SQL 저장소의 쿼리를 디비에 전송

3.6 준영속

준영속 상태의 특징

  • 비영속 상태에 가까움
  • 식별자 값을 가짐
  • 지연 로딩 못함

준영속 상태 엔티티를 다시 영속 상태로 변경하려면?
-> 병합. Merge 메소드는 준영속 상태의 엔티티를 받아 그 정보로 새로운 영속 상태의 엔티티를 반환한다. (병합은 비영속 엔티티도 영속으로 만든다.)