JpaRepository를 사용할 때, save() 메소드가 객체를 반환하는 이유

Jake·2022년 5월 17일
0

JpaRepository를 사용하면 save() 메소드는 저장한 객체를 그대로 반환한다. 왜일까?

아래와 같은 코드를 통해 알아보자.

Entity

@Entity @Getter @Setter //setter는 보통 사용하면 안되지만, 예시에서는 편의를 위해 사용
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Sample {

    @Id @GeneratedValue
    private Long id;

    private String title;

    private String content;

    @Builder
    public Sample(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

Repository

public interface SampleRepository extends JpaRepository<Sample, Long> {
	
}

Test Code

@Test
public void 새로_저장() throws Exception {
    //given
    Sample sample = new Sample("title", "content");
    Sample savedSample = sampleRepository.save(sample);

    //when
    em.flush();
    em.clear();

    Optional<Sample> foundSample = sampleRepository.findById(sample.getId());
    Optional<Sample> foundSavedSample = sampleRepository.findById(savedSample.getId());

    //then
    assertThat(foundSample.isPresent()).isTrue();
    assertThat(foundSavedSample.isPresent()).isTrue();
    assertThat(foundSample.get().getId()).isEqualTo(foundSavedSample.get().getId());

}

  • 테스트가 성공한다.
  • 즉, save() 메소드에 매개변수로 들어간 객체는 반환된 객체와 같다.

Merge

  • 오늘의 질문에 대한 답은 merge에서 찾을 수 있다.
  • JpaRepository는 동일한 id의 엔티티가 있을 경우 merge를 하는데, 이 경우 반환된 엔티티를 사용하지 않으면 변경을 가해도 이미 영속성 컨텍스트에서 제거된 엔티티를 사용하게 되는 불상사가 발생할 수 있다.

참고 :
https://stackoverflow.com/questions/8625150/why-use-returned-instance-after-save-on-spring-data-jpa-repository

https://kkambi.tistory.com/134

profile
Java/Spring Back-End Developer

0개의 댓글