Spring Batch Insert: IDENTITY 전략과 rewriteBatchedStatements=true를 활용한 DB 성능 개선

🤖 AI 추천

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

🔖 주요 키워드

Spring Batch Insert: IDENTITY 전략과 rewriteBatchedStatements=true를 활용한 DB 성능 개선

핵심 기술

이 글은 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 전략을 유지하면서 JdbcTemplatebatchUpdateBatchPreparedStatementSetter를 사용하여 직접 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 개발자들에게 실질적인 도움을 주려는 전문적이고 유익한 톤을 유지하고 있습니다.

📚 관련 자료