-
JPA (2) - 영속성 관리카테고리 없음 2024. 1. 11. 11:15
> JPA에서 가장 중요한 것은 1. 객체와 관계형 데이터 베이스 매핑하기 2. 영속성 컨텍스트이다.
- 엔티티 매니저는 요청에 따라 엔티티 매니저를 생성해서 주고, 사용자는 엔티티 매니저를 통해 커넥션풀에서 커넥션을 얻어서 DB에 접근한다.
1. 영속성 컨텍스트란?
> 엔티티를 영구 저장하는 환경을 뜻한다. (em.persist())
> 영속성 컨텍스트는 논리적은 개념이다. (엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.)
1.1 엔티티의 생명주기
> 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
> 영속 : 영속성 컨텍스트에 관리되는 사애
> 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
> 삭제 : 삭제된 상태
Member member = new Member(); // 비영속 em.persist(member) // 영속 em.detach(member) // 준영속 em.clear() em.close() em.remove(member) // 삭제
1.2 영속성 컨텍스트의 이점
> 1차캐시 :
DB에서 한번 조회하거나 persist해서 영속성 컨텍스트에서 관리되면, 다시 같은 식별자의 객체 찾을 때 1차캐쉬에서 조회함!
> 동일성 보장 (같은 클래스) : JPA 트랜잭션 내에서 ==비교는 동일성 비교로 같은 class인지 비교하는데, 같은 엔티티라면 동일성 보장해준다! (DB에서 조회한 거랑, new 한거랑 같다고 나옴 )
* 동일성 : 완전 같음 (주소,정보)
* 동등성 : 정보가 같다
> 트랜잭션을 지원하는 쓰기 지연 : 실제 DB에 반영을 한번에 함! (commit혹은 SQL 날아가는 시점)
> 변경감지: 영속성 컨텍스트에서 관리하는 엔티티에 변화가 생기면 commit시점에 자동 반영
> flush()발생시 1차캐시와 flush된 값을 비교
> 지연로딩
- 1차캐시
- 쓰기 지연 sql
- 변경감지
2. flush
> 영속성 컨텍스트의 변경 내용을 데이터 베이스에 반영 (등록,업데이트,삭제 등등) [어플리케이션 to DB]
> 변경감지시 작동, 수정된 엔티티 쓰기 지연 SQL 저장소에 등록됨 -> SQL 저장소에 쿼리를 데이터 베이스에 전송
> flush는 em.flush()직접호출, 트랜잭션커밋, JPQL 실행 시 자동으로 호출
2.1 플러시 모드 옵션
em.setFlushMode(FlushModeType.COMMIT) -> AUTO : 커밋이나 쿼리 실행시 (기본값)
* 플러시는 영속성 컨텍스트를 비우는 것이 아님
변경 내용을 동기화하는 것 (트랜잭션이라는 작업 단위 중요 - > 커밋 직전에만 동기화하면됨)
3. 준영속 상태
영속 상태의 엔티티가 분리됨 -> 영속성 컨텍스트의 기능 사용 못함
* JPA는 동적으로 객체를 생성해야해서 엔티티는 기본 생성자 무조건 필요
batch사이즈를 설정하면 쿼리를 몇개까지 모아서 날릴 것인지 설정 가능함! -> 뒤에 자세히 나옴