강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

jaesungyoun님의 프로필 이미지
jaesungyoun

작성한 질문수

실전! 스프링 데이터 JPA

save() vs saveAndFlush DB 통신 횟수

작성

·

31

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

영한님 안녕하세요.

Spring Data JPA가 제공하는 save, saveAndFlush 메서드에 대해 궁금한 점이 있는데요.

흔히들 saveAndFlush는 save와 달리 트랜잭션 커밋시점이 아닌, 영속성 컨텍스트 변경 사항을 즉각 DB에 반영하여, DB 통신이 증가한다는 단점이 있다고 합니다.

for (int i = 0; i < 3; i++) {
    repository.save(entity);
}    

그런데, 제가 의문이 드는 점은 save 메서드도 위와 같은 상황이 있을 때,

커밋 시점에 DB에 flush를 하기는 하지만, batch insert가 아니기 때문에 DB 통신 자체는 단 건으로 총 3번 일어나는 것 아닌가요?

따라서, DB 통신 자체에서 saveAndFlush가 얻는 이점은 없다고 생각되는 데 어떤 이점이 있을까요?

 

감사합니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

jaesungyoun님, Spring Data JPA의 savesaveAndFlush 메서드에 대해 질문을 주셨군요.

말씀하신 것처럼, save() 메서드는 기본적으로 엔티티를 영속성 컨텍스트에 저장하지만, 실제 DB 반영은 트랜잭션이 커밋될 때 이루어집니다. 이 경우 트랜잭션 커밋 시점까지 영속성 컨텍스트에 변경 사항이 모아지고, 전체가 한꺼번에 flush 되어 DB에 적용됩니다. 이론적으로는 배치 인서트를 통해 성능 향상의 이점도 얻을 수 있습니다.

반면에 saveAndFlush() 메서드는 호출 시점에 직접 flush 함으로써 영속성 컨텍스트의 변경 사항을 즉시 데이터베이스에 반영합니다. 이러한 특성을 통해 다음과 같은 이점이 있습니다.
1. 즉각적인 반영 필요: 특정 상황에서 변경 사항을 즉시 데이터베이스에 반영해야 할 필요가 있을 때 유용합니다. 예를 들어, 변경 사항이 빠르게 적용되었는지를 확인할 필요가 있는 경우입니다.
2. 데이터 무결성 보장: 다른 트랜잭션에서 즉각 반영된 데이터를 사용해야 하는 상황을 보장합니다.

하지만 통신 횟수의 측면에서는 말씀하신 대로 배치 인서트가 적용되지 않는다면 save()saveAndFlush() 모두 각 호출에 대해 DB 통신이 발생하므로, 통신 횟수에서 얻는 이점은 없다고 볼 수 있습니다.

따라서 saveAndFlush()의 주된 이점은 즉각적인 데이터베이스 반영이 필요한 상황에서의 데이터 일관성 확보로 이해하시면 됩니다.

감사합니다!

출처: 지식공유자 김영한님의 인프런 강의 자주 하는 질문

jaesungyoun님의 프로필 이미지
jaesungyoun

작성한 질문수

질문하기