문제점: 개발 과정에서 데이터베이스 스키마(테이블 구조, 컬럼 추가/변경 등)는 계속해서 변경됩니다. 여러 개발자가 협업하거나, 개발/테스트/운영 등 여러 환경에 애플리케이션을 배포할 때, 모든 데이터베이스의 스키마 버전을 일관되게 유지하고 변경 이력을 추적하는 것은 매우 어렵고 실수가 발생하기 쉽습니다.
Flyway: 이러한 데이터베이스 스키마 마이그레이션(Migration)을 자동화해주는 오픈소스 도구입니다.
SQL 마이그레이션 스크립트 작성:
src/main/resources/db/migration 경로에, 정해진 명명 규칙에 따라 SQL 파일을 작성합니다.V<버전>__<설명>.sql (e.g., V1__create_user_table.sql, V2__add_email_to_user.sql)애플리케이션 시작 시 자동 실행:
flyway_schema_history라는 메타데이터 테이블이 있는지 확인하고, 없다면 생성합니다.버전 비교 및 마이그레이션 수행:
db/migration 폴더에 있는 스크립트 파일 목록과 flyway_schema_history 테이블의 기록을 비교합니다.flyway_schema_history 테이블에 기록합니다.배치 처리란 사용자와의 상호작용 없이, 대용량의 데이터를 정해진 스케줄에 따라 일괄적으로 처리하는 작업을 의미합니다.
주요 특징:
@Scheduled와 연계)주요 사용 사례:
Job:
Step으로 구성됩니다.Step:
Step은 ItemReader, ItemProcessor, ItemWriter로 구성됩니다.ItemReader:
ItemProcessor:
ItemReader로부터 읽어온 데이터를 가공하고 변환하는 비즈니스 로직을 수행합니다. (선택 사항)ItemWriter:
ItemProcessor에 의해 가공된 데이터를 저장(쓰기)하는 역할을 합니다.JobRepository:
@Configuration
public class MyBatchJobConfig {
@Bean
public Job myJob(JobRepository jobRepository, Step myStep) {
return new JobBuilder("myJob", jobRepository)
.start(myStep)
.build();
}
@Bean
public Step myStep(JobRepository jobRepository, PlatformTransactionManager txManager,
ItemReader<InputData> reader, ItemWriter<OutputData> writer) {
return new StepBuilder("myStep", jobRepository)
.<InputData, OutputData>chunk(100, txManager) // 100개씩 묶어서 처리
.reader(reader)
.processor(item -> new OutputData(item)) // 간단한 프로세서
.writer(writer)
.build();
}
// ... ItemReader, ItemWriter Bean 설정 ...
}
Job, Step 구조와 ItemReader, ItemProcessor, ItemWriter라는 명확한 역할 분리를 통해 안정적이고 확장성 있는 대용량 데이터 처리 애플리케이션을 구축할 수 있게 해줍니다.JobRepository를 통한 재시작 기능은 Spring Batch의 핵심적인 장점입니다.