컬리 개발자, JPA saveAll의 한계 극복: JDBC Bulk Insert로 1:N 데이터 성능 개선
핵심 내용
컬리 개발자가 JPA saveAll의 비효율성을 지적하며, Auto Increment PK 추론을 활용한 JDBC Bulk Insert로 1:N 데이터 처리 성능을 개선했다.
자세히 보기
컬리 파트너서비스개발팀 백엔드 개발자 유형환은 BULK 처리 성능 개선 경험을 공유했다. 대용량 데이터 처리 시 시스템 리소스 급증이 장애의 주원인이 되며, 이를 해결하기 위해 Read, Process, Write 중 Write 영역에 집중했다.
JPA saveAll의 한계와 JDBC 대안
JPA의 saveAll은 메소드 이름과 달리 BULK 형태가 아닌 건건이 INSERT 쿼리를 발생시켜 성능 저하를 유발한다. 특히 외부에서 인입된 1:N 구조의 데이터를 DB에 적재할 때, JPA의 영속성 컨텍스트 관리 오버헤드가 크다. 이에 따라 JDBC를 활용해 실제 BULK INSERT 쿼리를 실행하는 방식으로 전환했다.
Auto Increment PK 추론을 통한 외래키 처리
BULK INSERT의 가장 큰 난관은 삽입된 행의 **Primary Key(PK)**를 알 수 없어 연관 테이블의 외래키 설정이 불가능하다는 점이다. 저자는 Auto Increment가 적용된 테이블에서 last_insert_id()로 반환된 첫 번째 PK 값을 기준으로, 애플리케이션 레벨에서 나머지 PK를 순차적으로 계산하는 방식을 제안했다.
- 작동 원리: BULK INSERT 후 반환된 첫 PK(예: 57)에 인덱스를 더하여 각 행의 PK(58, 59...)를 예측한다.
- 적용 절차: ① Member 테이블 BULK INSERT → ② 첫 PK 조회 → ③ 계산된 PK로 Article 테이블의 외래키 매핑 → ④ Article 테이블 BULK INSERT.
성능 개선 효과 및 주의사항
테스트 결과, Member 1만 건과 Article 3만 건을 적재할 때 JPA 사용 시 78초가 소요되었으나, 해당 JDBC 방식 적용 시 성능이 크게 개선되었다. 다만 JPA와 JDBC 혼용 시 영속성 컨텍스트 불일치 문제를 주의해야 하며, 정답은 없으므로 상황에 맞는 기술 선택이 중요하다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.