JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다
트랜잭션 밖에서는 데이터 변경은 반영되지 않는다
spring Data JPA 구현 코드에 데이터 변경이 일어나는 코드는 @Transactionl이 추가됨
영속성 컨텍스트
Entity를 저장하고 관리하는 저장소이며,
애플리케이션과 테이터 베이스 사이에 존재하고, entity를 보관하는 가상의 데이터베이스 같은 역할
Spring Data JPA에서 제공하는 Save 메서드 코드는 em.persist를 통해 데이터 베이스에 저장하는 게 아니라 영속성 컨텍스트에 저장
em.persist(member);
// 엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장한다는 의미
이때, Entity는 영속 상태라고 부름(영속성 컨텍스트가 관리되고 있는 상태)
이미 영속 상태인 경우 merge를 통해 덮어쓴다.
영속성 컨텍스트의 특징
영속성 컨텍스트는 엔티티 식별자 값으로 구분
식별자 값이 반드시 있어야 함
JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터 베이스에 반영하는 데 이를 flush라 한다
영속성컨텍스트 장점
- 영속성 컨텍스트 내에 1차 캐시
- 영속성 컨텍스트 내부에 있는 캐시를 1차 캐시라 하고, 영속 상태의 엔티티를 이곳에 저장
- persist를 하는 순간 pk 값, 타입과 객체를 매핑하여 1차 캐시에 가지고 있음
- 한 트랜잭션 내에 1차 캐시에 이미 있는 값을 조회하는 경우 DB를 조회하지 않고 1차 캐시에 있는 내용을 가져옴
- 1차 캐시는 전체 공유가 아니라 한 트랜잭션 내에서만 공유
- but, 조회 시 1차 캐시에 없다면 DB에서 가져와서 1차 캐시에 저장 후 반환
- 영속성 컨텍스트 내에 쓰기 지연 SQL 저장소
- 트랜잭션을 커밋 하기 직전까지 내부 쿼리 저장소에 모아둔다, 커밋 할 때 쿼리를 DB에 보낸다
- 1차 캐시에 넣고, 쓰기 지연 SQL 저장소에 쿼리를 만들어 쌓는다
- commit 하는 순간 flush가 되면서 DB에 반영
- flush란 영속성 컨텍스트의 변경 내용을 DB에 반영하며, 1차 캐시를 지우지는 않는다
- 엔티티 수정(Dirty Checking)
- entity 상태 변경 검사
- JPA에서 트랜잭션이 끝나는 시점에 변화가 있는 모든 entity 객체를 데이터 베이스에 자동으로 반영해 준다
- 영속성 컨텍스트에 처음 저장되는 순간 스냅샷을 저장해놓고, 트랜잭션이 끝나는 시점에 비교하여 변경된 부분을 쿼리로 생성하여 데이터베이스로 반영
플러시(flush)
플러시는 영속성 컨텍스트의 변경 내용을 데이터 베이스에 반영한다
영속성 컨텍스트의 엔티티를 지우는 게 아니라 변경 내용을 데이터 베이스에 동기화하는 것
플러시 하는 방법
1. em.flush()
2. 트랜잭션 커밋 시 자동 호출
3. JPQL 쿼리 실행 시 자동 호출
@Transactional 우선순위
클래스 보다 메서드가 우선순위가 높다
'CS' 카테고리의 다른 글
[CS] N+1 문제 해결 (0) | 2024.05.08 |
---|---|
[CS] 인터페이스 vs 추상 클래스 (0) | 2024.05.08 |
[CS] ORM(Object Relation Mapping) (0) | 2024.05.08 |
[CS] JDK란? (0) | 2024.05.08 |
[CS] MVC 패턴이란? (0) | 2024.05.08 |