[Spring Boot] JPA에서 save, saveAll? 데이터 저장이 느릴 때?

·2023년 12월 21일
0

Spring Boot

목록 보기
2/6

왜 saveAll을 사용할까?

Entity를 구성하고 Jpa의 save를 이용해서 초기 데이터를 저장하고자 했다. 초기 데이터의 양은 만개가 넘어가는 많은 양의 데이터였다. save를 이용하니 데이터 저장에 걸리는 시간이 너무 길었다. 왜 그런 문제가 발생하는지 알아보자!

@Transaction이란?

더 이상 쪼갤 수 없는 업무 처리의 최소 단위로 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산이다. 트랜잭션 처리가 정상적으로 완료된 경우 커밋(commit)을 하고, 오류가 발생할 경우 원래 상태대로 롤백(rollback)을 한다.

  • AOP 기술로 Spring 프록시와 관련

그렇다면 save는?

@Transactional
@Override
public <S extends T> S save(S entity) {

	Assert.notNull(entity, "Entity must not be null.");

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

save를 호출하면 트랜젝션에 참여하거나 생성하여 저장하는 작업을 수행

그렇다면 saveAll는?

@Transactional
@Override
public <S extends T> List<S> saveAll(Iterable<S> entities) {

	Assert.notNull(entities, "Entities must not be null!");

	List<S> result = new ArrayList<S>();

	for (S entity : entities) {
		result.add(save(entity));
	}

	return result;
}

내부에서 save를 호출하지만 같은 인스턴스이기 때문에 스프링 프록시를 타지않음

정리

  • save(), saveAll()는 데이터를 저장하는데 사용한다.
  • save()의 경우 매번 스프링 프록시를 탄다.
  • saveAll()의 경우 save()를 호출하지만 같은 인스턴스이기 때문에 스프링 프록시 로직을 타지 않는다.
  • saveAll()의 경우 많은 양의 데이터를 저장하는데 속도면에서 훨씬 유용하다.

0개의 댓글