[JPA Repository] save와 saveAndFlush의 차이

YE Kim·2023년 8월 7일
0

동시성이슈

목록 보기
2/6

이 글은 인프런 '재고시스템으로 알아보는 동시성이슈 해결방법' 강의를 듣고 작성한 글입니다.

현재 위치 : 4강 5분대

목적

save 메소드는 자주 사용하는데, saveAndFlush 메소드는 친숙하지 않아 제대로 알기 위함.

사전 지식

  • save 메소드를 실행하면 flush()나 commit() 메소드 실행 전 까지 persist 상태로 메모리에 저장된다.
  • flush()를 하면 메모리에 persist 된 SQL들이 쓰기 지연 SQL에 등록되고, 모두 실행하여 DB에 반영된다.

그게 뭔데?

Spring을 공부하면 한번쯤은 영속성 컨텍스트(persistence context)에 대해 들어보았을 것이다.

영속성 컨텍스트에 대해 설명하면 한없이 길어지니 간단하게 줄이자면
데이터 변경 사항을 메모리(1차 캐시)에 들고있다가, commit/flush 후 DB에 반영하는 구조로 아래와 같은 이점들이 있다.

  • 쓰기 지연으로 인해 여러 쿼리를 한꺼번에 처리해 성능 이점
  • 1차 캐시로 하나의 트랜잭션에서 같은 값임을 보장
  • entity snapshot 저장으로 인한 변경감지

한마디로 save를 실행한다 해서 바로 DB로 가는게 아니라, commit/flush 메소드가 있어야 쓰기 지연 SQL이 한꺼번에 실행되며 실제 insert가 일어난다는 소리



결론 : 그럼 둘이 뭐가 다른데?

  1. @Transactional 이 없는 경우
    동일함

  2. @Transactional이 있는 경우
    save -> 영속성 컨텍스트에만 저장, @Transactional 종료 후 쓰기 지연 SQL에 저장, DB에 반영
    saveAndFlush -> 쓰기 지연 SQL까지 저장, @Transactional 종료 후 DB 반영

따라서 saveAndFlush를 쓰면 바로 read를 해도 새 데이터를 읽어올 수 있다.
save는 read를 바로 하면 새 데이터가 반영되지 않는다.

다만 두 경우 모두 실제 DB에 반영된 것이 아니라 쓰기 지연 SQL에 저장 된 상태이므로, 외부에서는 새 데이터를 조회할 수 없다. @Transactional 종료 후 실제 DB에 반영 되어야 외부에서 읽을 수 있다.

참고

https://www.baeldung.com/spring-data-jpa-save-saveandflush
https://ramees.tistory.com/36

profile
주니어 백엔드 개발자

0개의 댓글