728x90
1. 영속성 컨텍스트
- 논리적인 개념으로, 엔티티를 영구 저장하는 환경
- 엔티티매니저를 통해 영속성 컨텍스트에 접근
- EntityManager.persist(entity)
- 영속성 컨텍스트를 통해 영구 저장하겠다
- 엔티티의 생명주기
- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속(managed) : 영속성 컨텍스트에 관리되는 상태
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) : 삭제된 상태
- 영속성 컨텍스트의 이점
- 1차 캐시
- 영속성 컨텍스트라고 이해해도 무방함
- 특정 트랜잭션 찰나의 순간에서만 이득이 있음
(데이터 베이스 트랜잭션 단위로 엔티티매니저를 만듦 ->트랜잭션 후 1차 캐시 날라감[고객 한 명의 비즈니스 로직용])
- 동일성(identity) 보장
참고 : https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation - 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- batch_size 옵션을 통해 버퍼링 기능 사용 가능(jdbc batch 기능) -> 특별한 배치 쿼리의 경우 이점
- 변경 감지(Dirty Checking)
- commit 시점에 내부적으로 flush() 호출 -> 스냅샷과 엔티티 비교 -> 쓰기 지연 SQL 저장소에 UPDATE 쿼리 생성 -> DB에 반영
- 지연 로딩(Lazy Loading)
- 1차 캐시
- 추가 내용
- 2차 캐시
- 애플리케이션 전체에서 공유하는 캐시 JPA hibernate기준 2차캐시라고 함
- JPA는 내부적으로 리플렉션을 사용해서 동적으로 객체를 생성하기 때문에 기본 생성자가 존재해야함
참고 : https://da-nyee.github.io/posts/woowacourse-why-the-default-constructor-is-needed/
- 2차 캐시
2. 플러시
영속성 컨텍스트의 변경내용을 데이터베이스에 반영
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
- commit은 별개임
- 1차 캐시 유지됨
- 쓰기 지연 SQL 저장소 쿼리들이 db에 반영되는 것일 뿐임
- 영속성 컨텍스트 플러시하는 방법
- em.flush() - 직접 호출 -> 실제로 쓸 일은 주로 테스트 할 때 정도?
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
- 플러시 모드 옵션
- 쓸 일은 딱히 없음
- FlushModeType.AUTO(기본값) : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
- FlushModeType.COMMIT : 커밋할 때만 플러시 -> 전혀 관련 없는 테이블의 값을 처리할 때 등등(쓸 일 거의 없음)
- 주의사항
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요
- JPA의 경우 데이터 정합성, 동시성 관련 기능들은 트랜잭션이라는 작업단위에 위임해서 사용함) -> 커밋 직전에만 동기화 하면 됨
- 영속성 컨텍스트와 트랜잭션의 생명주기를 맞춰서 설계해야 개발에 문제가 없음(트랜잭션 끝 = 영속성 컨텍스트 끝)
3. 준영속 상태
- 영속 -> 준영속
- em.persist() or em.find() -> 영속(1차 캐시에 올라감)
- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
- 영속성 컨텍스트가 제공하는 기능(변경 감지, 쓰기 지연 등)을 사용 못함
- 준영속 상태로 만드는 방법
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
- em.clear() : 영속성 컨텍스트를 완전히 초기화 -> 테스트 케이스 작성시 눈으로 보고 싶을 때 유용
- em.close() : 영속성 컨텍스트 종료
출처
인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편(김영한님)
728x90
'프로그래밍공부(Programming Study) > JPA(Java Persistence API)' 카테고리의 다른 글
5. 값 타입 (2) | 2022.12.28 |
---|---|
4. 프록시와 연관관계 정리 (0) | 2022.12.28 |
JPA 공부 개요 (0) | 2022.12.28 |
댓글