2025. 1. 7. 11:33ㆍIT정보/프로그래밍 가이드
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);
}
});
}
}
주요 사항
- 메모리 효율성
- 대량의 데이터를 한 번에 메모리에 로드하지 않으므로 OutOfMemoryError를 방지할 수 있습니다.
- 배치 작업에 유리
- 데이터의 각 행을 처리하는 로직을 분리하여 병렬 처리나 파일 출력 등 다양한 응용 작업을 쉽게 수행할 수 있습니다.
- 성능 최적화
- 필요하지 않은 데이터를 필터링하여 최소한의 데이터만 처리할 수 있습니다.
3. 트랜잭션 관리
@Transactional을 활용하여 데이터 작업의 트랜잭션 범위를 지정할 수 있으며 대용량 작업에서는 트랜잭션을 적절히 분리하여 안정성을 유지하세요.
@Service
public class YourService {
@Transactional
public void processData(List<YourData> dataList) {
yourMapper.insertBulkData(dataList);
}
}
Spring Batch와의 통합
Spring Batch는 대용량 데이터 처리에 특화된 프레임워크로, MyBatis와 결합하여 더욱 강력한 데이터 처리 시스템을 구축할 수 있습니다.
Spring Batch 설정 예제
- Job 설정
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
return jobBuilderFactory.get("myJob")
.start(step)
.build();
}
- 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();
}
- MyBatisItemWriter 사용
@Bean
public MyBatisBatchItemWriter<YourData> writer(SqlSessionFactory sqlSessionFactory) {
MyBatisBatchItemWriter<YourData> writer = new MyBatisBatchItemWriter<>();
writer.setSqlSessionFactory(sqlSessionFactory);
writer.setStatementId("YourMapper.insertBulkData");
return writer;
}
주의사항 및 추가 팁
- Connection Pool 크기 조정
- 대량 작업 시 데이터베이스 커넥션 풀 크기를 조정하여 성능 병목 현상을 방지
- 예 : HikariCP 설정
spring: datasource: hikari: maximum-pool-size: 30
- 쿼리 최적화
- 쿼리 실행 계획(EXPLAIN)을 통해 성능 병목을 파악하고 필요한 인덱스를 추가
- 에러 처리
- 배치 작업 중 발생하는 오류를 효과적으로 처리하여 데이터 무결성을 유지
- @Transactional과 커스텀 예외 처리 로직을 결합하여 구현할 수 있습니다.
Spring 기반 MyBatis 설정과 성능 최적화는 대용량 데이터 작업의 효율성을 크게 향상시킵니다. ExecutorType.BATCH, ResultHandler, Spring Batch와의 통합 등 다양한 기법을 적절히 활용하여 안정적이고 고성능의 데이터 처리 시스템을 구축할 수 있습니다.
추가 정보는 MyBatis 공식 문서를 참조하시기 바랍니다.
'IT정보 > 프로그래밍 가이드' 카테고리의 다른 글
오라클 대용량 데이터 처리, 실무에서 꼭 알아야 할 팁들 (0) | 2025.04.22 |
---|---|
🔥 대용량 데이터를 Spring Boot REST API 통신할 때 ReadTimeoutException이 발생한다면? (0) | 2025.04.15 |
자바 개발자라면 꿈 같은 Stream API 10가지 패턴 (0) | 2025.03.31 |
Java Stream 장단점과 사용법 쉽게 이해하기 (0) | 2025.01.08 |
HTTP 502 오류 분석 및 해결을 위한 준비 사항 (0) | 2024.12.31 |