플러시

2023. 11. 20. 23:19JAVA/스프링 데이터 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