Java/JPA
JPA (Java Persisitence API) - JPA 영속성 관리 (2)
codejcd
2022. 5. 17. 00:39
영속성 컨텍스트
번역하면 엔티티를 영구 저장하는 환경으로 논리적인 개념입니다.
엔티티 매니저에 의해 관리되며, DB와 애플리케이션 사이에서 엔티티의 일종의 저장소 같은 역할.
엔티티의 생명주기
- 비영속(New/Transient)
영속성 컨텍스트와 관계가 없는 상태.
- 영속(Managed)
영속성 컨텍스트에 저장된 상태
- 준영속(Detached)
영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제(Removed)
삭제된 상태
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
Member member = new Member();
member.setId(11L);
member.setName("Jack");
/* 여기까지는 비영속 */
em.persist(member); // 영속성 컨텍스트 관리 시작
em.clear(); // 준영속 상태로 영속성 컨텍스트 삭제
em.remove(member); // 비영속 상태로 영속성 컨텍스트와 DB 삭제
영속성 컨텍스트 관리의 장점
- 1차 캐시
영속성 컨텍스트에 저장해놓았다가 트랜잭션이 커밋되기 전까지 DB를 조회하지 않고 캐시에 있는 값을 조회합니다.
비즈니스 로직이 매우 복잡할 경우 약간의 이득이 있을 수 있지만 트랜잭션 내에서 일어나므로 효과는 크지 않을 수 있습니다. - 동일성 보장
같은 트랜잭션 안에서 엔티티의 비교의 == 연산자를 통해 비교할 수 있습니다. - 트랜잭션을 지원하는 쓰기 지연
트랜잭션 커밋 전까지 INSERT SQL을 쓰기 SQL 저장소에 모았다가 전송할 수 있습니다. - 변경 감지
엔티티를 수정하면 스냅샷과 비교하여 변경된 부분이 있는 경우
업데이트 SQL을 쓰기 SQL 저장소에 저장했다가 트랜잭션 커밋 시 DB에 전송합니다.
플러시
플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영.
영속성 컨텍스트의 내용들을 DB와 동기화한다고 이해하면 됩니다.
이름 때문에 오해할 수 있지만 삭제하거나 비우는 작업이 아닙니다.
스냅샷과 비교해서 수정된 엔티티를 찾고, 수정된 엔티티에 대해 쿼리를 생성하여 쓰기 지연 SQL 저장소에 등록합니다.
쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송합니다.
플러시 하는 경우
- flush() 메소드 명시적 호출.
- 트랙잭션 커밋할 경우
- JPQL 쿼리 실행할 경우
참고
자바 ORM 표준 JPA 프로그래밍 / 김영한 저자