플러시
2023. 11. 20. 23:19ㆍJAVA/스프링 데이터 JPA
플러시란?
영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 의미
플러시 발생
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시 하는 방법
- em.flush() - 직접 호출
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
Member member = new Member(200L, "member200");
em.persist(member);
em.flush(); // 강제 호출
1차 캐시에서 조회
Q : 1차 캐시는 그러면 지워지는 건가요?
A : 아니요. 데이터베이스에 반영이 되는 과정. 지워지지는 않음
JPQL 커리 실행시 플러시가 자동으로 호출되는 이유
다음과 같은 코드를 보자.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 중간에 JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
Q1 : 실제 데이터베이스에 이 쿼리가 날아갈까?
A1 : 날아가지 않는다.
Q2 : (member) A, B, C를 모두 조회하면 데이터베이스에서 조회가 될까?
A2 : 조회되지 않는다. 쿼리 자체가 날아가지 않았기 때문이다.
위와 같은 이유로 문제가 생길 수 있다. JPA에서는 이런걸 방지하고자 무조건 flush를 날린다.
플러시 모드 옵션
em.setFlushMode(FlushModeType.COMMIT)
사실상 쓸 일은 없다.
플러시는!
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 ->커밋 직전에만 동기화 하면 됨
'JAVA > 스프링 데이터 JPA' 카테고리의 다른 글
| 데이터베이스 스키마 자동 생성 (0) | 2023.12.27 |
|---|---|
| 객체와 테이블 매핑 (0) | 2023.12.24 |
| 준영속 상태 (2) | 2023.11.20 |
| 영속성 컨텍스트 2 (2) | 2023.11.12 |
| 영속성 컨텍스트 1 (0) | 2023.11.12 |