BULK 처리 Write에 집중해서 개선해보기
유형환 · 컬리 · 컬리 기술 블로그
소개
애플리케이션, DB 모두 행복한 BULK 처리
AI 핵심 요약
대량 쓰기에서 행별 INSERT가 애플리케이션과 DB에 부담을 주는 문제를 해결하기 위해, 글은 JPA와 JDBC의 쓰기 방식을 비교합니다. JPA `saveAll()`은 엔티티별 ID 매핑 등의 이유로 대개 개별 INSERT를 실행하므로, 단순 데이터는 JDBC `batchUpdate`로 묶어 처리하는 방법을 제시합니다. 부모·자식 테이블처럼 외래 키가 필요한 경우에는 부모 데이터를 먼저 벌크 삽입하고 첫 자동 증가 PK를 바탕으로 키를 계산해 자식 데이터를 구성한 뒤 함께 삽입합니다. 테스트에서는 회원 1만 건과 게시글 약 3만 건 처리에 JPA 78초, JDBC 1.7초가 걸렸으며, 성능과 구현 복잡도 사이에서 상황에 맞는 도구를 선택해야 한다고 설명합니다.
- JPA의 `saveAll()`은 이름과 달리 보통 행마다 INSERT를 실행하므로, 실제 SQL 로그로 동작을 확인하세요.
- JDBC `batchUpdate`는 여러 행을 묶어 DB 왕복과 쓰기 부하를 줄이는 데 활용할 수 있습니다.
- 자동 증가 PK를 연속적으로 추론하는 방식은 DB의 키 생성 규칙과 동시성 조건을 확인한 뒤 적용해야 합니다.
- JPA와 JDBC를 함께 쓰면 JDBC 변경 사항이 영속성 컨텍스트에 반영되지 않을 수 있으므로 상태 동기화에 주의하세요.
비슷한 학습 자료
Spring Batch 애플리케이션 성능 향상을 위한 주요 팁 (김남윤, Yun)
if kakao · YouTube
Spring JDBC 성능 문제, 네트워크 분석으로 파악하기
강민주 · 토스 기술 블로그
데이터가 있었는데요, 아니 없어요
호선우 · 컬리 기술 블로그
JPA 덕분에 DB에서 삽질한 이야기
박제희 · 컬리 기술 블로그
Kafka Connect로 DB 데이터 쉽게 연동하기
김소라 · 컬리 기술 블로그
컬리의 BigQuery 도입기 - 2부
허재진 · 컬리 기술 블로그