inflearn logo
강의

Course

Instructor

Practical! Spring Data JPA

save() vs saveAndFlush DB 통신 횟수

50

jaesungyoun

3 asked

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가 얻는 이점은 없다고 생각되는 데 어떤 이점이 있을까요?

 

감사합니다

java spring spring-boot jpa

Answer 1

0

communityai8509

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

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

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

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

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

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

감사합니다!

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

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

64

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

100

3

MemberRepository 구현체

0

55

1

pdf 표현 질문드립니다.

0

59

1

로그가 남지 않는 문제.

0

78

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

67

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

68

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

88

2

Sort 인터페이스는 잘 사용 안하나요?

0

50

1

스캔대상 질문드립니다.

0

45

1

하이버네이트6에서의 최적화에 이은 질문

0

81

1

순수 JPA 리포지토리 코드 수정부분

0

85

2

bulk연산 후 flush하는 이유를 모르겠어요

0

147

3

bulk insert 질문입니다.

0

174

2

교만했던 것 같아요.

0

142

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

143

2

동적 테이블에 대한 질문

0

84

1

영속성 전이와 연관관계

0

128

2

강의 10:25 질문

0

71

1

단건 update 질문

0

94

2

엔티티 와 도메인의 경계

0

124

1

UsernameOnlyDto 타입 type mismatch 오류

0

114

1

Projection 개념과 데이터 전달과정에 대해 질문 있습니다.

0

131

1

JUnit4, JUnit5 충돌 문제

0

177

2