[개발 일기] 2025.05.10 - Bulk을 사용한 저장이 하나씩 저장하는 것 보다 빠른 이유

2025. 5. 10. 13:02·개발 일기

💡 개요

 

Bulk을 사용한 저장이 하나씩 저장하는 것보다 빠른 이유에 대해 정리해 보자.

 

 

 

🛠️ Bulk

 

Bulk을 사용한 저장이란, 여러 데이터를 한번에 모아 저장하는 것을 말한다.

 

 

일반적으로 Batch Insert나 Bulk Insert 등으로 표현된다.

 

 

하나씩 저장

for (User user : userList) {
    userRepository.save(user);
}

 

 

한번에 모아 저장

userRepository.saveAll(userList);

 

 

한 번에 저장하는 방식이 성능 면에서 유리한 이유는 무엇일까?

 

 

가장 큰 이유는 지연 시간 감소에 있다.

 

 

일반적으로 데이터베이스는 데이터를 저장할 때 트랜잭션을 사용한다.

 

 

데이터를 하나씩 저장하면 그에 따라 커밋도 여러 번 발생하게 되고, 이로 인해 디스크 I/O와 트랜잭션 처리 비용이 증가한다.

 

 

반면, Bulk Insert를 사용하면 여러 데이터를 한 번에 저장하고, 커밋도 한 번만 수행하면 되기 때문에 성능이 향상된다.

 

 

특히 JPA와 같은 ORM을 사용할 경우, save()를 반복 호출하면 매번 영속성 컨텍스트 관리, 트랜잭션 처리, flush() 등의 작업이 반복되어 불필요한 오버헤드가 발생한다.

 

 

하지만 saveAll()을 사용하면 엔티티들을 한 번에 영속성 컨텍스트에 등록하고, 트랜잭션 종료 시 한 번의 flush로 일괄 처리할 수 있다.

 

 

하지만 개별 저장을 사용할 때 커밋이 한번만 수행되게 할 수도 있다.

 

@Transactional
public void saveUsers(List<User> userList) {
    for (User user : userList) {
        userRepository.save(user);
    }
}

 

 

위 코드를 보면 @Transactional이 saveUsers() 메서드에 선언되어 있기 때문에 커밋은 한 번만 발생한다.

 

 

하지만 위 방식 또한 saveAll()보다 느린 이유는 쿼리 생성 문제와 관련되어 있다.

 

 

ORM 기술인 JPA는 저장 시 내부적으로 SQL 쿼리를 생성하는데, save()를 반복하면 저장할 엔티티 수만큼 개별 쿼리가 생성된다.

 

 

반면 saveAll()을 사용하면 여러 엔티티를 하나의 쿼리 또는 batch 쿼리로 묶어 전송할 수 있어, DB 입장에서도 처리 효율이 높아진다.

'개발 일기' 카테고리의 다른 글

[개발 일기] 2025.05.12 - 분산 저장 (파티셔닝, 샤딩)  (0) 2025.05.12
[개발 일기] 2025.05.11 - Redis 만료 원리  (0) 2025.05.11
[개발 일기] 2025.05.09 - MIME  (0) 2025.05.09
[개발 일기] 2025.05.08 - 레코드 수준의 잠금(row-level locking)  (0) 2025.05.08
[개발 일기] 2025.05.07 - WebRTC 구현 방식  (0) 2025.05.07
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.05.12 - 분산 저장 (파티셔닝, 샤딩)
  • [개발 일기] 2025.05.11 - Redis 만료 원리
  • [개발 일기] 2025.05.09 - MIME
  • [개발 일기] 2025.05.08 - 레코드 수준의 잠금(row-level locking)
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.05.10 - Bulk을 사용한 저장이 하나씩 저장하는 것 보다 빠른 이유
상단으로

티스토리툴바