[java] MyBatis에서 배치 작업 최적화하기

MyBatis는 데이터베이스와의 상호 작용을 간편하게 처리할 수 있는 자바 퍼시스턴스 프레임워크입니다. 배치 작업은 대량의 데이터를 한 번에 처리하는 작업을 의미하며, MyBatis에서 배치 작업을 최적화하는 방법에 대해 알아보겠습니다.

1. JDBC 배치 기능 사용하기

MyBatis는 JDBC의 배치 기능을 활용하여 배치 작업을 수행할 수 있습니다. 이를 위해 SqlSession 클래스의 insert, update, delete 메서드를 사용할 때, 배치 파라미터(Batch Parameter)를 이용하여 여러 개의 파라미터를 한 번에 처리할 수 있습니다.

List<Object> batchParameters = new ArrayList<>();
// 배치 작업을 위한 파라미터들을 List에 추가

try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
    for (Object parameters : batchParameters) {
        sqlSession.insert("insertQuery", parameters);
    }
    sqlSession.flushStatements();
    sqlSession.commit();
}

2. Batch 삽입 사용하기

MyBatis 3.4.0 이상부터는 &lt;insert&gt; 태그의 useGeneratedKeys 속성을 활용하여 배치 작업을 최적화할 수 있습니다. 이 속성을 true로 설정하면 자동 생성된 키를 사용해 배치 작업을 수행할 수 있습니다. 이를 통해 디비에 데이터를 배치로 삽입할 때 자동 생성된 키를 한 번에 얻을 수 있습니다.

<insert id="insertQuery" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO table(column1, column2) VALUES(#{value1}, #{value2})
</insert>

3. 배치 크기 조절하기

배치 작업을 최적화하는 데에는 배치 크기를 조절하는 것이 중요합니다. 크기가 너무 작으면 커밋 횟수가 많아져 성능이 저하될 수 있고, 크기가 너무 커도 성능이 저하될 수 있으므로 적절한 배치 크기를 찾아야 합니다.

일반적으로는 수천 개의 쿼리가 아닌 수백 개의 쿼리를 배치 크기로 설정하는 것이 좋습니다. 이를 위해 mybatis.configuration.defaultExecutorType 설정을 BATCH로 설정하거나, sqlSession 객체를 생성할 때 sqlSessionFactory.openSession(ExecutorType.BATCH)로 생성하는 것이 좋습니다.

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);

4. 적절한 트랜잭션 사용하기

배치 작업은 트랜잭션의 단위로 처리되기 때문에, 적절한 트랜잭션을 설정하는 것이 중요합니다. 배치 작업이 많은 경우 커밋 횟수를 최소화하여 전체 처리 속도를 향상시킬 수 있습니다.

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(false); // 자동 커밋 비활성화

try {
    // 배치 작업 수행
    sqlSession.insert("insertQuery", parameter);

    sqlSession.commit(); // 모든 작업을 커밋
} catch (Exception e) {
    sqlSession.rollback(); // 롤백
} finally {
    sqlSession.close(); // 세션 종료
}

MyBatis를 사용하여 배치 작업을 최적화하는 방법에 대해 설명했습니다. 이를 통해 대량의 데이터를 효율적으로 처리할 수 있으며, MyBatis의 성능을 극대화할 수 있습니다.

참고: MyBatis 문서