본문으로 이동
문서

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 변경 사항이 영속성 컨텍스트에 반영되지 않을 수 있으므로 상태 동기화에 주의하세요.