플러시 flush() 는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.
플러시를 실행하면 구체적으로 일어나는 특징을 알아보도록 하겠습니다.
- 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찿는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시하는 방법은 3가지다.
1. em.flush()를 직접 호출한다.
2. 트랙잭션 커밋 시 플러시가 자동 호출된다.
3. JPQL 쿼리 실행 시 플러시가 자동 호출된다.
1). 직접 호출
엔티티 매니저의 flush() 메소드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시한다. 테스트나 다른 프레임워크와 JPA를 함께 사용 할 때를 제외하고 거의 사용하지 않는다.
2). 트랙잭션 커밋시 플러시 자동 호출
데이터베이스에 변경 내용을 SQL로 전달하지 않고 트랜잭션만 커밋하면 어떤 데이터도 데이터베이스에 반영하지 않는다. 따라서 트랜잭션을 커밋하기 전에 꼭 플러시를 호출해서 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영해야한다. JPA는 이런 문제를 예방하기 위해 트랜잭션을 커밋할 때 플러시를 자동으로 호출한다.
'BackEnd > SpringBoot' 카테고리의 다른 글
Mustache 한글깨짐 (0) | 2022.06.20 |
---|---|
연관 관계 매핑 (0) | 2022.05.11 |
java.io.EOFException: null (0) | 2022.05.07 |
H2 Database 설치 (0) | 2022.04.30 |
UserDetailService (0) | 2022.04.27 |