[JPA] JpaRepository.save()는 어떰 함수일까?

코딩쟁이·2020년 7월 16일
1

JPA

목록 보기
2/2
post-custom-banner

JpaRepository.save()는 어떤 함수인지 알아보자.

public S save(S entity) {
 
		if (entityInformation.isNew(entity)) {
			em.persist(entity);
			return entity;
		} else {
			return em.merge(entity);
		}
	}

코드를 보게 되면 첫번째 조건문에서 entity가 새로 만들어진 상태라면 persist를 호출하고

이외의 상태라면 merge를 호출한다.

그렇다면 만약 새로 만든 Entity에 대해서 merge를 호출하게 되면 어떻게 될까?

public void Test(){
	Popinfo popinfo = new Popinfo();
  popinfo.setId("test");

  em.merge(popinfo);
  
  em.flush();
}

merge를 사용했을 때 로그를 확인해보자.

Hibernate: select popinfo0.id as id1_2_0, popinfo0.artist as artist2_2_0, popinfo0.channel_title as channel_3_2_0, popinfo0.content_type as content_4_2_0, popinfo0.img as img5_2_0, popinfo0.link as link6_2_0, popinfo0.title as title7_2_0, popinfo0.upload_time as upload_t8_2_0 from popinfo popinfo0 where popinfo0.id=?

Hibernate: insert into popinfo (artist, channel_title, content_type, img, link, title, upload_time, id) values (?, ?, ?, ?, ?, ?, ?, ?)

select쿼리를 수행한 후에 없는 데이터임을 확인하고 insert문을 수행한다. 만약 DB에 있는 데이터라면 Update를 수행 했을 것이다.

반면 persist를 사용했을때는 insert문만 수행된다.

새로추가된 Entity의 경우 merge를 사용해도 결과물은 동일하지만 entity마다 select문을 한번 더 수행하기 때문에 매우 비효율적이라고 할 수 있다. 다량의 엔티티를 삽입, 수정해야 하는 상황이라면 더욱더 주의해야 할 필요성이 있다.

결론.

JpaRepository.save를 사용하면 상관없겠지만, 사용하지 않는 경우 persist, merge를 구분해서 사용해야 한다.

profile
코딩 마렵당
post-custom-banner

1개의 댓글

comment-user-thumbnail
2021년 11월 27일

안녕하세요 해당 게시글 덕분에 이해가 됐습니다!
그런데 혹시 public S save(S entity) 전체 내용 까서 보려면
어디서 어떻게 들어가야하나요?

.save에 ctrl+클릭했더니 interface CrudRepository가 뜨고
S save(S var1); 변수만? 있네요ㅠㅠ

답글 달기