본문 바로가기
IT/Java

JPA메서드 save 와 saveAndFlush 비교

by 성준하이 2022. 12. 5.
반응형

이전 포스팅에서 jpa 에 대해서도 다뤄봤고 영속 방법중 하나인 더티체킹에 대해서도 다뤘다.

아래 참고 포스팅을 확인 바람.

 

이번 포스팅에서는 더티체킹이 아닌 merger 방법으로 데이터를 영속하는 메서드인 save메서드에 대해서 다뤄볼 것이다.

 

일단 @Transactional 어노테이션을 붙이지 않을 경우는 

새로운 Entity를 만들고
save/saveAndFlush 로 저장을 한다음
set으로 entity 의 값을 변경해주고 
db에서 값을 확인해보면

save를 쓰는 경우나나 saveAndFlush를 쓰는 경우나

둘다 set을 할 경우 update 가 되지 않는다.

 

@Transactional 어노테이션을 붙이는 경우에

save와 saveAndFlush를 비교를 하면 똑같이 메서드 종료 후 update가 된다.

 

그렇다면 여러번의 save / saveAndFlush 호출이 있을 경우엔 어떨까?

 

save 코드

Member member = Member.create(memberDTO);
member = memberRepository.save(member);
member.setName("test1");
member = memberRepository.save(member);
member.setName("test2");
member = memberRepository.save(member);
member.setName("test3");

 

saveAndFlush 코드

Member member = Member.create(memberDTO);
member = memberRepository.saveAndFlush(member);
member.setName("test1");
member = memberRepository.saveAndFlush(member);
member.setName("test2");
member = memberRepository.saveAndFlush(member);
member.setName("test3");

 

save를 사용할 경우 쿼리 출력이 insert 와 마지막 update 하나만 나오게 된다.

즉 db 에는 test3만 저장이 된것이고,

 

saveAndFlush 를 사용할 경우 쿼리 출력이 insert 와 모든 update 가 나오게 된다.

즉 db 에는 test1,test2,test3이 순서대로 update가 된것이었다.

 

여기서의 flush는 db에 업데이트 flush 개념 보다는 영속 컨텍스트 안에서 캐싱 공간에로 flush를 하는 과정이라고 생각하면 된다.

saveAndFlush로 업데이트를 하면 매번 쿼리를 캐싱 공간에 보내고 그걸 트랜잭션 종료 시점에 db 업데이트를 하고

save를 하면 마지막에 컨텍스트에 존재하는 형태의 데이터를 query로 만들어서 트랜잭션 종료시점에 db 업데이트를 하는 것이다.

 

즉 saveAndFlush보다는 save 가 성능적으로는 좀더 유리할수 있다고 생각이 든다.


참고 포스팅

https://thenicesj.tistory.com/106

 

SpringBoot/JPA part.1

저번 spring/mybatis 포스팅에 이어서 이번엔 springboot/JPA 포스팅을 다뤄볼것이다. spring과 springboot는 어떤 차이가 있는지는 아래 참고 포스팅 부분을 확인해보도록 하자. 시작하기 앞서 스프링을 해

thenicesj.tistory.com

https://thenicesj.tistory.com/411

 

JPA 더티체킹(Dirty Checking) 이란?

JPA에 대해서는 아래 참고 포스팅을 참고하면 확인해볼수 있다. 이번 포스팅에서 다뤄볼 내용은 더티체킹이라는 개념이며 직역으로는 변경상태 감지 라고 느낄수 있다. JPA에서는 값을 데이터베

thenicesj.tistory.com

 

반응형

'IT > Java' 카테고리의 다른 글

Flush에 대해  (31) 2022.12.08
JPA query Keyword (repository)  (34) 2022.12.06
spring annotation-driven 시 bean name 중복(충돌,conflicts) 해결  (35) 2022.12.04
JPA 더티체킹(Dirty Checking) 이란?  (37) 2022.12.03
List 와 map 에 대해서  (30) 2022.12.02

댓글