Spring 기반 MyBatis 대용량 데이터 처리 및 성능 최적화

2025. 1. 7. 11:33IT정보/프로그래밍 가이드

반응형

MyBatis는 Spring 애플리케이션과의 통합을 통해 대용량 데이터를 효율적으로 처리할 수 있는 강력한 프레임워크입니다. 이번 글에서는 Spring과 MyBatis를 활용하여 대용량 데이터 작업의 성능을 최적화하는 방법과 필요한 설정을 살펴보겠습니다.


MyBatis 설정 - Spring과의 통합

Spring에서 MyBatis를 사용하려면 필요한 설정을 먼저 구성해야 합니다. Spring Boot를 사용하는 경우, 아래와 같은 설정으로 MyBatis와 쉽게 통합할 수 있습니다.

1. Maven 의존성 추가

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.3.0</version>
</dependency>

2. application.yml 설정

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    mapper-locations: classpath:mapper/**/*.xml
    type-aliases-package: com.example.project.domain

3. Mapper 인터페이스

@Mapper
public interface YourMapper {
    void insertBulkData(@Param("list") List<YourData> dataList);
}

4. Mapper XML 파일

<insert id="insertBulkData" parameterType="java.util.List">
    INSERT INTO your_table (column1, column2, column3)
    VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.value1}, #{item.value2}, #{item.value3})
    </foreach>
</insert>

 

 

대용량 데이터 작업에서의 성능 최적화

1. ExecutorType.BATCH 사용

대량의 데이터 작업 시 ExecutorType.BATCH를 활용하면 SQL 쿼리를 일괄 처리하여 성능을 크게 향상할 수 있습니다.

@Autowired
private SqlSessionFactory sqlSessionFactory;

public void processBatchInsert(List<YourData> dataList) {
    try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
        YourMapper mapper = sqlSession.getMapper(YourMapper.class);
        for (YourData data : dataList) {
            mapper.insertBulkData(Collections.singletonList(data));
        }
        sqlSession.flushStatements();
    }
}

2. ResultHandler 사용

대량 데이터를 조회할 때 메모리 사용량을 줄이기 위해 ResultHandler를 사용하는 것이 효과적입니다. ResultHandler는 쿼리 결과를 한 번에 메모리에 로드하지 않고, 결과를 한 행씩 처리할 수 있도록 도와줍니다. 이를 통해 메모리 부족 문제를 방지할 수 있습니다.

예제 코드 : ResultHandler 적용

@Autowired
private SqlSessionFactory sqlSessionFactory;

public void handleLargeResultSet(Object parameter) {
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
        sqlSession.select("YourMapper.selectLargeData", parameter, new ResultHandler<YourData>() {
            @Override
            public void handleResult(ResultContext<? extends YourData> resultContext) {
                YourData data = resultContext.getResultObject();
                // 데이터 처리 로직 (예: 로그 저장, 파일 출력 등)
                System.out.println(data);
            }
        });
    }
}

주요 사항

  1. 메모리 효율성
    • 대량의 데이터를 한 번에 메모리에 로드하지 않으므로 OutOfMemoryError를 방지할 수 있습니다.
  2. 배치 작업에 유리
    • 데이터의 각 행을 처리하는 로직을 분리하여 병렬 처리나 파일 출력 등 다양한 응용 작업을 쉽게 수행할 수 있습니다.
  3. 성능 최적화
    • 필요하지 않은 데이터를 필터링하여 최소한의 데이터만 처리할 수 있습니다.

3. 트랜잭션 관리

@Transactional을 활용하여 데이터 작업의 트랜잭션 범위를 지정할 수 있으며 대용량 작업에서는 트랜잭션을 적절히 분리하여 안정성을 유지하세요.

@Service
public class YourService {

    @Transactional
    public void processData(List<YourData> dataList) {
        yourMapper.insertBulkData(dataList);
    }
}

 

 

Spring Batch와의 통합

Spring Batch는 대용량 데이터 처리에 특화된 프레임워크로, MyBatis와 결합하여 더욱 강력한 데이터 처리 시스템을 구축할 수 있습니다.

Spring Batch 설정 예제

  1. Job 설정
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
    return jobBuilderFactory.get("myJob")
                             .start(step)
                             .build();
}
  1. Step 설정
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, ItemReader<YourData> reader, ItemWriter<YourData> writer) {
    return stepBuilderFactory.get("myStep")
                              .<YourData, YourData>chunk(100)
                              .reader(reader)
                              .writer(writer)
                              .build();
}
  1. MyBatisItemWriter 사용
@Bean
public MyBatisBatchItemWriter<YourData> writer(SqlSessionFactory sqlSessionFactory) {
    MyBatisBatchItemWriter<YourData> writer = new MyBatisBatchItemWriter<>();
    writer.setSqlSessionFactory(sqlSessionFactory);
    writer.setStatementId("YourMapper.insertBulkData");
    return writer;
}

 

주의사항 및 추가 팁

  1. Connection Pool 크기 조정
    • 대량 작업 시 데이터베이스 커넥션 풀 크기를 조정하여 성능 병목 현상을 방지
    • 예 : HikariCP 설정
      spring:
        datasource:
          hikari:
            maximum-pool-size: 30
      
  2. 쿼리 최적화
    • 쿼리 실행 계획(EXPLAIN)을 통해 성능 병목을 파악하고 필요한 인덱스를 추가
  3. 에러 처리
    • 배치 작업 중 발생하는 오류를 효과적으로 처리하여 데이터 무결성을 유지
    • @Transactional과 커스텀 예외 처리 로직을 결합하여 구현할 수 있습니다.

Spring 기반 MyBatis 설정과 성능 최적화는 대용량 데이터 작업의 효율성을 크게 향상시킵니다. ExecutorType.BATCH, ResultHandler, Spring Batch와의 통합 등 다양한 기법을 적절히 활용하여 안정적이고 고성능의 데이터 처리 시스템을 구축할 수 있습니다.
추가 정보는 MyBatis 공식 문서를 참조하시기 바랍니다.

반응형