Jpa Save vs SaveAll 성능 차이 체감해보기
2025. 1. 11. 17:08ㆍSpring
프로젝트를 진행하면서 JPA의 save와 saveAll 메서드를 사용해 데이터를 저장하게 됩니다. 일반적으로 100개 미만의 데이터를 저장할 때는 두 메서드 간의 성능 차이를 크게 느끼지 못할 수 있습니다. 그러나 대량의 데이터를 저장할 때는 두 메서드의 성능 차이가 매우 크다는 점을 확인할 수 있었습니다. 이번 글에서는 이 차이에 대해 살펴보고 각각의 사용 시 주의해야 할 점을 정리해 보겠습니다.
Save vs SaveAll 차이점
save와 saveAll의 가장 큰 차이는 트랜잭션의 생성 방식과 처리 방식에 있습니다.
- 동작 방식: 데이터를 하나씩 저장하며, 호출될 때마다 별도의 트랜잭션을 생성하여 처리합니다.
- 특징: N개의 데이터를 저장할 경우 N번의 트랜잭션이 생성됩니다.
- 동작 방식: 한 번의 트랜잭션 안에서 여러 개의 데이터를 반복 처리하며 저장합니다.
- 특징: N개의 데이터를 저장해도 트랜잭션은 한 번만 생성됩니다.
성능 비교
- save: 트랜잭션 생성 비용이 데이터의 개수만큼 기하급수적으로 증가합니다. 많은 데이터를 처리할수록 저장 시간이 급격히 늘어납니다.
- saveAll: 하나의 트랜잭션에서 데이터를 일괄 저장하므로 상대적으로 더 빠르고 효율적입니다.
13000개의 데이터를 저장하는 상황에서 save를 사용하면 각 데이터별로 트랜잭션이 생성되므로 엄청난 시간과 비용이 소모되었습니다. 반면 saveAll은 트랜잭션을 한 번만 생성하여 데이터를 저장하므로 시간과 비용 면에서 훨씬 효율적임을 확인했습니다.
save를 사용해 13000개의 데이터를 로컬 db에 저장할 때는 16분 30초가 걸리는 상황이 발생했습니다. 만약 클라우드 db 공간에 저장하는 경우에는 더 큰 시간과 비용이 발생할 것입니다.
saveAll을 이용할 경우 38초만에 처리가 가능한 것을 확인할 수 있다. 이를 통해 트랜잭션의 생성과 삭제를 하는 과정에서 꽤 많은 시간이 소요되는 것을 알 수 있다.
사용 유의점
1. 정형화된 데이터
- saveAll 추천: 데이터 형식이 정형화되어 있고 저장 과정에서 문제가 발생하지 않을 것으로 예상되는 경우 saveAll을 사용하는 것이 적합합니다.
- 이유: 하나의 트랜잭션에서 처리하므로 빠르고 효율적입니다.
2. 비정형 데이터
- save 추천: 대용량 데이터가 비정형적이거나 데이터 유효성 검증이 확실하지 않은 경우 save를 사용하는 것이 더 안전할 수 있습니다.
- 이유: 트랜잭션 특성상 saveAll로 데이터를 처리하다가 하나의 데이터에서 오류가 발생하면 전체 트랜잭션이 롤백됩니다. 결과적으로 모든 데이터 저장이 실패하게 됩니다.
- 해결 방안: 데이터를 저장하기 전에 철저히 검증하거나 개별 저장(save) 방식을 고려해야 합니다.
결론
- 소규모 데이터 처리: save와 saveAll의 성능 차이가 크지 않으므로 상황에 맞게 선택할 수 있습니다.
- 대용량 데이터 처리: 가능한 경우 saveAll을 사용하여 성능을 최적화합니다. 단 데이터 유효성 검증과 예외 상황에 주의해야 합니다.
'Spring' 카테고리의 다른 글
[트러블 슈팅 - 중복 API 요청] API 멱등성 (feat: redis) 해결 완료 (0) | 2024.09.11 |
---|---|
[MockMvc - SpringTest] Spring Security Login Test (0) | 2024.08.25 |
[트러블 슈팅 - Spring Test] 의존성 주입 실패 (test yml 파일 안 읽힘) (0) | 2024.08.25 |
Spring Security와 Redis 이용한 로그인 세션 유지 (0) | 2024.08.14 |
Github Action 이용한 CI/CD Spring Server 자동화 배포 (feat: Synology Nas) (0) | 2024.06.05 |