본문 바로가기

Spring boot

[spring boot] flush란? persist, flush, commit 비교

플러시(flush)란?

영속성 컨텍스트의 변경내용을 DB에 반영하는 것.

 

  • 영속성 컨텍스트(1차 캐시)를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화 (변경감지)
  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화(flush) 하면 됨 (commit 하면 자동으로 flush 먼저 실행)

 

플러시 모드 옵션 (보통 AUTO, 건들지 X)

em.setFlushMode(FlushModeType.COMMIT)

  • FlushModeType.AUTO       : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
  • FlushModeType.COMMIT   : 커밋할 때만 플러시

 

 

 

persist, flush, commit 비교 

 

em.persist(entity);

1차 캐시에 저장 및 쓰기 지연 SQL 저장소에 SQL 쌓음.

[그림 1] 출처 : 김영한.(2019).자바 ORM 표준 JPA 프로그래밍 - 기본편(강의자료)

+ em.merge(entity); 

   DB에서 데이터를 들고와(select 쿼리로 찾아봄) 새로운 데이터로 완전히 교체.

   Transation끝날 때 commit올림.

   중요! 

    merge는 영속성 컨텍스트에서 벗어났을 때 사용,,

    가급적 데이터 변경은 Transaction속에서 변경 감지(set 이용)를 이용하기. 

 

 

em.flush();

[그림2]속 1~4번을 담당.

변경을 감지해 수정된 엔티티를 쓰기 저장 SQL 저장소에 등록하고 이 쿼리를 DB에 전송 

[그림 2] 출처 : 김영한.(2019).자바 ORM 표준 JPA 프로그래밍 - 기본편(강의자료)

 

 

em.commit();

[그림2]속 1~5번을 담당.

쓰기 지연 SQL저장소 속 SQL이 실제 DB에 flush되고 commit됨.

commit하면 자동으로 flush([그림 2] 속 1~4번) 먼저 실행. (flush 옵션이 AUTO일 때)

[그림 3] 출처 : 김영한.(2019).자바 ORM 표준 JPA 프로그래밍 - 기본편(강의자료)

 

 

 

추가 정보 

flush한다고 commit까지 되는 것은 아니다. 

난 commit은 저장이라고 생각함..!