Jpa Save vs SaveAll 성능 차이 체감해보기

2025. 1. 11. 17:08Spring

프로젝트를 진행하면서 JPA의 save와 saveAll 메서드를 사용해 데이터를 저장하게 됩니다. 일반적으로 100개 미만의 데이터를 저장할 때는 두 메서드 간의 성능 차이를 크게 느끼지 못할 수 있습니다. 그러나 대량의 데이터를 저장할 때는 두 메서드의 성능 차이가 매우 크다는 점을 확인할 수 있었습니다. 이번 글에서는 이 차이에 대해 살펴보고 각각의 사용 시 주의해야 할 점을 정리해 보겠습니다.

 

Save vs SaveAll 차이점

 

save와 saveAll의 가장 큰 차이는 트랜잭션의 생성 방식처리 방식에 있습니다.

  • 동작 방식: 데이터를 하나씩 저장하며, 호출될 때마다 별도의 트랜잭션을 생성하여 처리합니다.
  • 특징: N개의 데이터를 저장할 경우 N번의 트랜잭션이 생성됩니다.

save

  • 동작 방식: 한 번의 트랜잭션 안에서 여러 개의 데이터를 반복 처리하며 저장합니다.
  • 특징: N개의 데이터를 저장해도 트랜잭션은 한 번만 생성됩니다.

saveAll

 

성능 비교
  • save: 트랜잭션 생성 비용이 데이터의 개수만큼 기하급수적으로 증가합니다. 많은 데이터를 처리할수록 저장 시간이 급격히 늘어납니다.
  • saveAll: 하나의 트랜잭션에서 데이터를 일괄 저장하므로 상대적으로 더 빠르고 효율적입니다.

13000개의 데이터를 저장하는 상황에서 save를 사용하면 각 데이터별로 트랜잭션이 생성되므로 엄청난 시간과 비용이 소모되었습니다. 반면 saveAll은 트랜잭션을 한 번만 생성하여 데이터를 저장하므로 시간과 비용 면에서 훨씬 효율적임을 확인했습니다.

 

save 사용 결과

save를 사용해 13000개의 데이터를 로컬 db에 저장할 때는 16분 30초가 걸리는 상황이 발생했습니다. 만약 클라우드 db 공간에 저장하는 경우에는 더 큰 시간과 비용이 발생할 것입니다.

saveAll

saveAll을 이용할 경우 38초만에 처리가 가능한 것을 확인할 수 있다. 이를 통해 트랜잭션의 생성과 삭제를 하는 과정에서 꽤 많은 시간이 소요되는 것을 알 수 있다.

 

사용 유의점

 

1. 정형화된 데이터

  • saveAll 추천: 데이터 형식이 정형화되어 있고 저장 과정에서 문제가 발생하지 않을 것으로 예상되는 경우 saveAll을 사용하는 것이 적합합니다.
  • 이유: 하나의 트랜잭션에서 처리하므로 빠르고 효율적입니다.

2. 비정형 데이터

  • save 추천: 대용량 데이터가 비정형적이거나 데이터 유효성 검증이 확실하지 않은 경우 save를 사용하는 것이 더 안전할 수 있습니다.
  • 이유: 트랜잭션 특성상 saveAll로 데이터를 처리하다가 하나의 데이터에서 오류가 발생하면 전체 트랜잭션이 롤백됩니다. 결과적으로 모든 데이터 저장이 실패하게 됩니다.
  • 해결 방안: 데이터를 저장하기 전에 철저히 검증하거나 개별 저장(save) 방식을 고려해야 합니다.
결론
  • 소규모 데이터 처리: save와 saveAll의 성능 차이가 크지 않으므로 상황에 맞게 선택할 수 있습니다.
  • 대용량 데이터 처리: 가능한 경우 saveAll을 사용하여 성능을 최적화합니다. 단 데이터 유효성 검증과 예외 상황에 주의해야 합니다.