Spring Boot MySQL rewriteBatchedStatements
TMThikari.data-source-properties.rewriteBatchedStatements: true
는 HikariCP 연결 풀에서 MySQL JDBC 드라이버의 배치 처리 성능을 최적화하기 위한 설정을 의미합니다. 이 설정은 MySQL 데이터베이스에 대량의 INSERT/UPDATE/DELETE 작업을 효율적으로 실행할 수 있도록 도와주며, 구체적인 의미와 동작 방식은 다음과 같습니다.
기본값은 false
입니다.
1. 기능 목적
- 배치 SQL 재작성: MySQL JDBC 드라이버는 기본적으로
executeBatch()
메서드를 호출해도 개별 SQL 문을 하나씩 전송합니다.rewriteBatchedStatements=true
를 설정하면, 드라이버가 여러 배치 작업을 단일 SQL 문으로 재구성하여 네트워크 통신 오버헤드를 줄이고 실행 속도를 향상시킵니다.
예시:-- 재작성 전 INSERT INTO table VALUES (1, 'a'); INSERT INTO table VALUES (2, 'b'); -- 재작성 후 INSERT INTO table VALUES (1, 'a'), (2, 'b');
2. 적용 범위
- 지원 작업: INSERT, UPDATE, DELETE 문 모두에 적용 가능하지만, INSERT에서 가장 효과적입니다.
- 드라이버 버전: MySQL Connector/J 5.1.13 이상에서 정상 동작하며, 일부 하위 버전(예: 5.1.12)에서도 작동할 수 있으나 공식 문서에서는 5.1.13+를 권장합니다.
3. HikariCP에서의 설정 의미
- URL 파라미터 대체: 일반적으로 JDBC URL에
rewriteBatchedStatements=true
를 추가하지만, HikariCP의data-source-properties
를 통해 별도로 설정할 수 있습니다. 이는 연결 풀 구성에서 유연성을 제공합니다.
예시 (Spring Boot 설정):spring: datasource: hikari: data-source-properties: rewriteBatchedStatements: true
4. 성능 영향
- 실험 결과:
- 50만 건 데이터 삽입 시 33초 → 2초로 15배 이상 향상.
- 1만 건 기준 JDBC 배치 1.1초, MyBatis 배치 2.2초로 기존 방식(5초) 대비 효율적.
- 주의사항:
- 데이터 일관성: 배치로 묶인 SQL 문의 구조가 일관되어야 재작성됩니다. 예를 들어, 다른 컬럼을 업데이트하는 SQL은 병합되지 않습니다.
- 패킷 크기 제한: 재작성된 SQL이
max_allowed_packet
(기본 4MB)을 초과하면 오류가 발생할 수 있으므로, MySQL 서버 설정 조정이 필요합니다.
5. 활용 시나리오
- 대량 데이터 처리: 로그 저장, 배치 잡, CSV 임포트 등에서 유용합니다.
- ORM 프레임워크: MyBatis, JPA(Hibernate)에서
saveBatch()
또는addBatch()
메서드 사용 시 성능 개선 효과가 큽니다. - 주의할 예외:
allowMultiQueries=true
와 함께 사용할 경우, SQL 구문 오류가 발생할 수 있으므로 주의가 필요합니다.
성능 vs. 안정성:
- 장점: 대량 데이터 처리 시 5~20배 성능 향상 (벤치마크).
- 주의: 재작성된 쿼리가 너무 길면 max_allowed_packet 오류 발생 가능 → MySQL 서버 설정 조정 필요.
PostgreSQL
- 옵션: reWriteBatchedInserts=true
- 동작: MySQL과 유사하게 배치 INSERT 문을 VALUES (...), (...) 형식으로 재작성하지만, UPDATE/DELETE에는 적용되지 않습니다.
- 성능: 기본 배치 모드보다 3~5배 빠릅니다.
공식 문서에서 권장하는 옵션입니다.
Oracle
- 옵션: 별도의 재작성 옵션이 없습니다.
- 동작: Oracle JDBC 드라이버는 기본적으로 배치 작업을 최적화합니다.
- PreparedStatement.addBatch() → executeBatch() 호출 시 자동으로 배열 바인딩(Array Binding)을 사용합니다.
- 성능: MySQL의 rewriteBatchedStatements와 유사한 성능을 보이지만, 별도 설정이 필요하지 않습니다.
SQL Server
- 옵션: useBulkCopyForBatchInsert=true (Microsoft JDBC 드라이버 8.4+)
- 동작: 대량 삽입 시 SQL Server의 Bulk Copy API를 사용하여 성능을 향상시킵니다.
- 성능: 일반 배치 대비 5~10배 빠릅니다.
기타
- MariaDB: MySQL Connector/J와 호환되므로 rewriteBatchedStatements=true를 동일하게 사용합니다.
- SQLite: 별도의 배치 재작성 옵션이 없으며, 트랜잭션으로 묶는 것이 일반적인 최적화 방법입니다.
- H2: OPTIMIZE_INSERT_FOR_BULK_LOAD=true 옵션으로 유사한 최적화를 할 수 있습니다.
요약
이 설정은 HikariCP를 통해 MySQL 배치 작업을 최적화하는 핵심 옵션으로, 대량 데이터 처리 시 성능을 극대화합니다. 다만 드라이버 버전, SQL 일관성, 패킷 크기 등을 고려하여 적용해야 합니다.