반응형

오늘은 JDBC(Java Database Connectivity)에서 배치 처리(Batch Processing)를 활용하여 성능을 최적화하는 방법에 대해 학습합니다. 배치 처리는 대량의 데이터를 한 번에 처리하는 경우 매우 유용하며, 특히 반복적인 SQL 실행에서 성능을 크게 향상시킬 수 있습니다.


1. JDBC 배치 처리란?

배치 처리는 여러 SQL 명령을 하나의 단위로 묶어서 데이터베이스에 전송하여 실행하는 기법입니다. 이를 통해 네트워크 왕복 횟수를 줄이고 성능을 최적화할 수 있습니다.


2. JDBC 배치 처리의 기본 원리

배치 처리는 다음 단계를 따릅니다:

  1. PreparedStatement 생성: SQL 문을 준비합니다.
  2. 데이터 바인딩 및 추가: 반복적으로 데이터를 바인딩하고 addBatch() 메서드를 사용해 명령을 배치에 추가합니다.
  3. 배치 실행: executeBatch() 메서드로 한꺼번에 실행합니다.
  4. 결과 확인: 반환된 결과를 확인하여 성공 여부를 처리합니다.

3. JDBC 배치 처리 예제

예제: 대량의 사용자 데이터를 삽입

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BatchProcessingExample {
    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@localhost:1521:xe";
        String user = "your_username";
        String password = "your_password";

        String insertSQL = "INSERT INTO Users (id, name, email) VALUES (?, ?, ?)";
        Connection conn = null;

        try {
            // 데이터베이스 연결
            conn = DriverManager.getConnection(url, user, password);

            // 자동 커밋 비활성화
            conn.setAutoCommit(false);

            try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
                // 대량 데이터 삽입
                for (int i = 1; i <= 1000; i++) {
                    pstmt.setInt(1, i); // ID 설정
                    pstmt.setString(2, "User" + i); // 이름 설정
                    pstmt.setString(3, "user" + i + "@example.com"); // 이메일 설정

                    // 배치에 추가
                    pstmt.addBatch();

                    // 일정량마다 실행
                    if (i % 100 == 0) {
                        pstmt.executeBatch();
                        pstmt.clearBatch();
                    }
                }

                // 남아있는 배치 실행
                pstmt.executeBatch();
                conn.commit();
                System.out.println("배치 처리가 완료되었습니다.");
            } catch (SQLException e) {
                // 오류 시 롤백
                conn.rollback();
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException closeEx) {
                closeEx.printStackTrace();
            }
        }
    }
}

4. 주요 코드 설명

  1. addBatch(): SQL 명령을 배치에 추가합니다.
  2. executeBatch(): 배치에 추가된 모든 SQL 명령을 한 번에 실행합니다.
  3. clearBatch(): 배치를 초기화하여 메모리 누수를 방지합니다.
  4. setAutoCommit(false): 배치 실행 후 수동으로 커밋하거나 롤백합니다.

5. 배치 처리의 장점과 한계

장점

  • 성능 향상: 네트워크 트래픽 감소로 실행 시간이 단축됩니다.
  • 코드 간결화: 반복적인 SQL 실행을 줄일 수 있습니다.

한계

  • 에러 처리의 복잡성: 실행 중 하나의 SQL 명령이 실패하면 전체 배치를 롤백하거나 개별적으로 재처리해야 합니다.
  • 메모리 관리: 대규모 데이터 처리 시 메모리 사용량을 주의해야 합니다.

6. 배치 처리에서 성능 최적화 팁

  1. 적절한 배치 크기 설정
    • 배치 크기는 시스템에 따라 다르지만, 일반적으로 100~500건이 적당합니다.
    • 너무 큰 배치 크기는 메모리 부담을 증가시키며, 너무 작으면 성능 향상이 미미합니다.
  2. 데이터베이스 연결 풀 사용
    • HikariCP와 같은 연결 풀을 사용하면 데이터베이스 연결을 효율적으로 관리할 수 있습니다.
  3. 에러 발생 시 개별 처리
    • executeBatch()는 실행된 SQL 명령 수를 배열로 반환합니다. 이를 통해 오류 발생 시 어떤 작업이 실패했는지 추적할 수 있습니다.

7. 대규모 프로젝트에서 배치 처리 활용

배치 처리는 다음과 같은 작업에 유용합니다:

  • 로그 데이터 삽입
  • 대량의 데이터 마이그레이션
  • 보고서 생성 시 필요한 임시 데이터 삽입

Spring Batch 또는 Quartz Scheduler와 결합하면 더욱 강력한 배치 작업 환경을 구성할 수 있습니다.

반응형

+ Recent posts