인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

dlsrksrhk님의 프로필 이미지

작성한 질문수

[백엔드/예외처리 시나리오/집계 최적화] 백엔드 포트폴리오와 실무 이력 강화 전략. 올인원 PART1

대량의 쿼리가 중간에 실패한다면?

bulkInsert 부분에서 마지막에 이상한? 부분이 있는것 같아서 문의드립니다.

작성

·

7

0

마지막 부분에 getBatchSize()1000정도 권장해주셨는데요.

jdbcTemplate.batchUpdate()는 내부적으로 배치사이즈만큼 for문을 통해 반복하는것 같습니다. 즉 실제 처리해야할 대상 데이터가 1000개가 넘는다면 1000번째 이후 데이터부터는 INSERT가 안될거고요.

만약 1000개 미만이라면 예를 들어 500개밖에 없다면 501번째 반복때 java.lang.ArrayIndexOutOfBoundsException발생할것 같습니다.

만약 chunk가 최대 1000개정도가 적당하다라는 말씀이신거면 모르겠지만 1000으로 하드코딩해서 쓴다 라고 하신것처럼 와닿아서.. 오해의 소지가 있는것 같아 남깁니다~

    private void bulkProcessSettlements(Map<Long, BigDecimal> settlementMap, LocalDate paymentDate) {
        String sql = "INSERT INTO settlements (partner_id, total_amount, payment_date) VALUES (?, ?, ?)";

        jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
//
            }

            @Override
            public int getBatchSize() {
                return 1000;
            }
        });
    }

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

dlsrksrhk님, jdbcTemplate.batchUpdate()getBatchSize()에 대한 질문에 답변드리겠습니다.

getBatchSize() 메서드는 배치 처리를 위한 사이즈를 지정하는 부분입니다. 이 값은 처리할 객체의 수에 따라 유동적으로 설정될 필요가 있습니다. 언급하신 것처럼 실제 데이터의 수가 1000개 미만일 경우나 초과할 경우, 이 함수의 반환 값은 상황에 따라 조정되어야 합니다.

특히, 실제 settlementMap의 사이즈를 고려하여 동적으로 getBatchSize()를 설정하시길 권장합니다. 예를 들어:

@Override
public int getBatchSize() {
    return settlementMap.size();
}

또한, 대량의 데이터를 처리할 때 적정한 배치크기를 정하는 것은 매우 중요합니다. 일반적으로 데이터베이스와의 연결 수, 메모리 사용 등을 고려하여 적절히 조정하여 성능을 최적화하는 것이 좋습니다. 이렇게 함으로써 ArrayIndexOutOfBoundsException 같은 예외가 발생하지 않도록 예방할 수 있습니다.

해당 설정을 상황에 맞게 조정하여 사용하시면 더 나은 성능과 안정성을 제공할 수 있을 것입니다. 도움이 되셨길 바랍니다!

자세한 내용은 관련 문서를 참고하실 수 있습니다:
Spring Boot JDBC Template