OneTime] 🚀 성능 개선일지 2 (feat. Bulk Insert)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- *백엔드 개발자** (Spring 프레임워크 사용자, 대규모 데이터 삽입 작업 필요자)
- *난이도**: 중간 (JDBC, Hibernate, MySQL 설정 이해 필요)
핵심 요약
saveSchedules
단계에서 28,800개의 INSERT 연산으로 성능 병목 발생rewriteBatchedStatements=true
설정 없이Bulk Insert
사용 시 성능 개선 효과 미적용JdbcTemplate.batchUpdate()
활용으로@GeneratedValue(strategy = IDENTITY)
제약 우회
섹션별 세부 요약
1. 문제 식별: 병목 지점 분석
StopWatch
를 통해saveSchedules
가 전체 처리 시간의 99%를 차지함 확인- 30분 단위 스케줄 생성 시 28,800개의 INSERT 연산 발생
@GeneratedValue(strategy = GenerationType.IDENTITY)
로 인한 Hibernate Batch Insert 제약
2. 해결 방안: `Bulk Insert` 도입
- 일반 INSERT와
Bulk Insert
의 SQL 쿼리 구조 비교 JdbcTemplate
을 활용한 직접 삽입 방식으로 IDENTITY 전략 유지BatchPreparedStatementSetter
구현을 통한 대량 삽입 처리
3. 성능 개선 결과
rewriteBatchedStatements=true
설정 전: 16.56s → 설정 후: 0.41s (97.5% 개선)saveSchedules
단계 소요 시간: 17.35s → 0.09s (99% → 42%로 줄임)createQrCode
단계도 개선 필요성 확인 (다만 미미한 성능 개선으로 우선순위 하락)
결론
- 대량 데이터 삽입 시
Bulk Insert
활용 필수 (예:JdbcTemplate.batchUpdate()
사용) - MySQL JDBC 드라이버 설정에
rewriteBatchedStatements=true
명시 - 성능 병목 분석을 위해
StopWatch
도구 활용 추천