이전 포스팅에서 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
https://thenicesj.tistory.com/411
'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 |
댓글