JPA의 성능 최적화 기능
1. 1차 캐시와 동일성 보장
- 간은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
2. 트랜잭션을 지원하는 쓰기 지연
- 비슷한 쿼리들은 한번에 보내준다. ex) insert 비슷한거 3개 동시에 등록(commit되는 순간 한번에 들어감)
3.지연 로딩
- 지연로딩 : 객체가 실제 사용될 때 로딩
- 즉시로딩 : Join SQL로 한번에 연관된 객체까지 미리 조회
상황에 맞게 사용하기(옵션을 통해 간단하게 사용가능)
영속성
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경이라는 뜻
- 논리적인 개념
- 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.
엔티티의 생명주기
엔티티의 생명주기 | |
비영속 | 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 - 세팅만 한 상태 |
영속 | 영속성 컨텍스트에 관리되는 상태 - 생성 후 엔티티메이저에 집어 넣어진 상태 BUT 아직 쿼리가 실행되지는 않은 상태 |
준영속 | 영속성 컨텍스트에 저장되었다가 분리된 상태 |
삭제 | 삭제된 상태 |
엔티티 조회, 1차 캐시에서 조회
1차캐시 | |
@ID(key) | Entity(value) |
member1 | member |
한 트랜잭션 안에 같은 쿼리문이 실행된다면 쿠키에 있는 정보를 가져오기 때문에 DB에 접속하지 않는다.
영속 엔티티의 동일성 보장
같은 트랜잭션 안에서의 같은 것들을 비교했을 때에 true가 나온다
엔티티등록 트랜잭션을 지원하는 쓰기 지원
1차 캐시에 저장 후 쓰기지연 SQL 저장소에 쿼리문을 저장한다. 그 후 commit이 실행되면 쓰기지연 저장소에 있던 것들이 DB에 접근한다.
엔티티 수정
변경감지
@id | Entity | 스냅샷 |
memberA | memberA | memberA 스냅샷 |
memberB | memberB | memberB 스냅샷 |
*스냅샷 - 최초로 들어온 1차 캐시 정보의 상태를 스냅샷하여 데이터 변경시 자동으로 Entity와 스냅샷을 비교하여 업데이터 쿼리를 쓰기지연 SQL 저장소에 저장한 후 커밋되는 시점에 쿼리를 날린다.
플러시
- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면 됨!
플러시발생
- 변경 감지
- 수정된 엔티티를 쓰기지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시하는 방법
em.flush() - 직접호출
트랜잭션 커밋 - 플러시 자동호출
JPQL 쿼리 실행 - 플러시 자동 호출
준영속 상태
- 영속 -> 준영속
- 영속 상태의 엔티티가 연속성 컨텍스트에서 분리
- 영속성 컨텍스트가 제공하는 기능을 사용 못함
준영속 상태로 만드는 방법
em.detach(entity) - 특정 엔티티만 준영속 상태로 전환
em.clear() - 영속성 컨테스트를 완전히 초기화
em.close - 영속성 컨텍스트를 종료
'spring정리' 카테고리의 다른 글
1. SpringDI(Dependency Injection) (0) | 2021.11.10 |
---|