Spring Batch Insert: IDENTITY 전략과 rewriteBatchedStatements=true를 활용한 DB 성능 개선
🤖 AI 추천
이 문서는 Spring 프레임워크 환경에서 대규모 데이터 삽입 시 성능 병목을 경험하고 있는 백엔드 개발자에게 특히 유용합니다. 특히 DB의 IDENTITY 전략 사용 시 Bulk Insert 적용의 어려움과 이를 해결하기 위한 JdbcTemplate 활용법, 그리고 MySQL에서 rewriteBatchedStatements=true 옵션 설정의 중요성을 상세하게 다루고 있어 실질적인 문제 해결에 큰 도움이 될 것입니다.
🔖 주요 키워드

핵심 기술
이 글은 Spring Boot 환경에서 대규모 데이터 삽입 시 발생하는 성능 병목 현상을 분석하고, 특히 IDENTITY
전략을 사용하는 경우에도 Bulk Insert
를 효과적으로 적용하는 방법을 제시합니다. StopWatch
를 활용한 병목 지점 분석부터 JdbcTemplate
을 이용한 직접적인 Bulk Insert
구현, 그리고 MySQL에서 rewriteBatchedStatements=true
옵션의 중요성까지 다룹니다.
기술적 세부사항
- 성능 측정 및 병목 분석: Grafana K6를 사용하여 이벤트 생성 API의 초기 성능을 측정하고, Spring의
StopWatch
를 통해saveSchedules
메서드가 주요 병목 지점임을 규명했습니다. - Bulk Insert 소개: 다수의 데이터를 한 번의 쿼리로 묶어 삽입하는
Bulk Insert
의 원리와 효과를 설명합니다. - IDENTITY 전략과 Bulk Insert 제약:
IDENTITY
전략 사용 시 Hibernate의 배치 삽입이 지원되지 않는 이유(DB에서 ID 생성 시점과 Hibernate 배치 인서트의 ID 사전 필요성)를 명확히 설명합니다. - 대안: JdbcTemplate을 활용한 직접 Bulk Insert:
IDENTITY
전략을 유지하면서JdbcTemplate
의batchUpdate
와BatchPreparedStatementSetter
를 사용하여 직접Bulk Insert
를 구현하는 방법을 보여줍니다. - MySQL의 rewriteBatchedStatements=true 설정: JDBC 드라이버가 배치 쿼리를 실제로 병합하기 위해
rewriteBatchedStatements=true
옵션을 DB URL에 추가하는 것이 필수적임을 강조합니다. - 결과:
Bulk Insert
적용 후 처리 속도가 약 16.56초에서 0.41초로 97.5% 개선된 결과를 제시하며,saveSchedules
의 성능 비중이 크게 감소했음을 보여줍니다. - 추가 개선 고려:
createQrCode
단계의 개선 가능성도 언급하지만, 병목 지점인saveSchedules
개선에 집중하며 마무리합니다.
개발 임팩트
- 대량 데이터 삽입 작업의 성능을 획기적으로 개선할 수 있습니다.
IDENTITY
전략과Bulk Insert
의 호환성 문제를 해결하는 실질적인 방법을 제공합니다.StopWatch
와 같은 프로파일링 도구 활용의 중요성을 인지하고 적용하는 데 도움을 줍니다.rewriteBatchedStatements=true
와 같은 DB 설정의 중요성을 배울 수 있습니다.
커뮤니티 반응
본문에서는 특정 커뮤니티 반응을 직접적으로 언급하지는 않지만, Bulk Insert
관련 문제는 개발자들 사이에서 빈번하게 논의되는 주제이며, rewriteBatchedStatements=true
설정은 많은 MySQL 사용자들에게 필수적인 팁으로 알려져 있습니다.
톤앤매너
이 글은 문제 해결 과정을 명확하게 설명하고, 기술적인 세부 사항을 구체적인 코드 예시와 함께 제시하여 IT 개발자들에게 실질적인 도움을 주려는 전문적이고 유익한 톤을 유지하고 있습니다.
📚 관련 자료
Spring JDBC
Spring Framework의 핵심 모듈 중 하나로, JdbcTemplate을 포함하여 JDBC 데이터베이스 액세스를 간소화하는 기능을 제공합니다. 이 글에서 사용된 직접적인 Bulk Insert 구현 방식은 JdbcTemplate의 주요 활용 사례입니다.
관련도: 95%
HikariCP
고성능 JDBC 데이터베이스 연결 풀입니다. DB URL에 rewriteBatchedStatements=true와 같은 연결 옵션을 설정하는 것은 데이터베이스 드라이버 및 연결 풀의 동작에 영향을 미치므로, HikariCP와 같은 연결 풀 설정과 연관 지어 이해할 수 있습니다.
관련도: 80%
Hibernate
JPA 및 Hibernate의 구현체입니다. 글에서 IDENTITY 전략과 Hibernate 배치 삽입의 제약 사항을 다루고 있으며, Hibernate 자체는 데이터베이스 상호작용을 추상화하는 데 사용되지만, 이 글에서는 Hibernate의 제약을 우회하기 위한 다른 접근 방식을 제시하고 있습니다.
관련도: 70%