본문 바로가기
왜?

[왜] 스프링부트 테스트에서 repository save()가 반환하는 객체를 사용해야 할까?

by KKambi 2020. 5. 11.

궁금증

인프런 - 스프링 부트 개념과 활용(백기선)에서

스프링 데이터 6부 : 스프링 데이터 JPA 연동을 듣다가 생긴 호기심이다.

 

@DataJpaTest에서 엔티티 객체를 생성하여 save()했는데

왜 반환된 객체를 새로운 참조 변수에 담아 그를 테스트하는지 궁금했다.

 

바로 newAccount!

 

해결

save()

  • save()는 엔티티의 상태가 어떻든 저장한다.
  • 엔티티를 새로 저장할 수도 있고, 기존 엔티티를 새로운 엔티티와 병합할 수도 있다.
  • 병합 시 동일한 id에 연결된 엔티티에 상태를 복사하고 그 엔티티를 반환한다.

 

save()로 새로 저장하는 경우에는 Account와 newAccount가 동일한 객체다.

하지만, merge하는 경우엔 다른 인스턴스일 것이다.

 

 

반환된 인스턴스를 사용하지 않으면, 분리된 엔티티(detached entity)를 수정하게 되어 문제가 발생한다.

 

 

 

출처

www.stackoverflow.com/questions/8625150/why-use-returned-instance-after-save-on-spring-data-jpa-repository

댓글