TIL - 20251123

juni·2025년 11월 23일

TIL

목록 보기
186/316

1123 Spring Boot: DB 마이그레이션(Flyway)과 배치 처리(Spring Batch)


✅ 1. 데이터베이스 스키마 관리: Flyway

  • 문제점: 개발 과정에서 데이터베이스 스키마(테이블 구조, 컬럼 추가/변경 등)는 계속해서 변경됩니다. 여러 개발자가 협업하거나, 개발/테스트/운영 등 여러 환경에 애플리케이션을 배포할 때, 모든 데이터베이스의 스키마 버전을 일관되게 유지하고 변경 이력을 추적하는 것은 매우 어렵고 실수가 발생하기 쉽습니다.

  • Flyway: 이러한 데이터베이스 스키마 마이그레이션(Migration)을 자동화해주는 오픈소스 도구입니다.

➕ Flyway의 동작 원리

  1. SQL 마이그레이션 스크립트 작성:

    • 개발자는 src/main/resources/db/migration 경로에, 정해진 명명 규칙에 따라 SQL 파일을 작성합니다.
    • 명명 규칙: V<버전>__<설명>.sql (e.g., V1__create_user_table.sql, V2__add_email_to_user.sql)
  2. 애플리케이션 시작 시 자동 실행:

    • Spring Boot 애플리케이션이 시작될 때, Flyway는 데이터베이스에 flyway_schema_history라는 메타데이터 테이블이 있는지 확인하고, 없다면 생성합니다.
    • 이 테이블에는 지금까지 실행된 마이그레이션 스크립트의 버전과 성공 여부가 기록됩니다.
  3. 버전 비교 및 마이그레이션 수행:

    • Flyway는 db/migration 폴더에 있는 스크립트 파일 목록과 flyway_schema_history 테이블의 기록을 비교합니다.
    • 아직 실행되지 않은 새로운 버전의 스크립트가 있다면, 버전 순서대로 해당 SQL 스크립트를 데이터베이스에 실행합니다.
    • 실행이 성공하면, 그 결과를 flyway_schema_history 테이블에 기록합니다.
  • 장점:
    • 스키마 버전 관리 자동화: 어떤 환경에서든 애플리케이션을 실행하기만 하면, 데이터베이스 스키마가 항상 최신 버전으로 자동 업데이트됩니다.
    • 형상 관리: 데이터베이스 스키마 변경 이력이 SQL 파일 형태로 Git과 같은 버전 관리 시스템에 함께 관리되어, 변경 사항을 추적하기 용이합니다.
    • 협업 효율성: 팀원 모두가 동일한 데이터베이스 스키마를 유지할 수 있습니다.

✅ 2. 배치 처리 (Batch Processing)

  • 배치 처리란 사용자와의 상호작용 없이, 대용량의 데이터를 정해진 스케줄에 따라 일괄적으로 처리하는 작업을 의미합니다.

  • 주요 특징:

    • 대용량 데이터: 수백만 건 이상의 데이터를 처리합니다.
    • 자동화: 사용자의 개입 없이 자동으로 실행됩니다. (e.g., Spring의 @Scheduled와 연계)
    • 견고성: 작업 중간에 실패하더라도, 어디서부터 다시 시작해야 하는지 알 수 있는 재시작(Restart) 기능이나, 특정 오류를 건너뛰는 스킵(Skip) 기능 등이 중요합니다.
  • 주요 사용 사례:

    • 매일 밤 은행의 일일 거래 정산
    • 월말에 사용자 등급 및 포인트 계산
    • 로그 파일의 데이터를 읽어와 통계 DB에 저장

✅ 3. Spring Batch: 대용량 배치의 표준 프레임워크

  • Spring Batch는 Spring 기반의 애플리케이션에서 강력하고 안정적인 배치 처리 기능을 구현할 수 있도록 지원하는 프레임워크입니다. 대용량 데이터 처리의 필수 요소인 로깅, 재시작, 스킵, 리소스 관리 등을 위한 포괄적인 기능을 제공합니다.

➕ Spring Batch의 핵심 구성 요소

  1. Job:

    • 하나의 배치 작업 전체를 의미하는 최상위 개념입니다.
    • Job은 하나 이상의 Step으로 구성됩니다.
  2. Step:

    • Job을 구성하는 독립적인 하나의 단계입니다. "읽고 → 처리하고 → 쓴다"는 실질적인 작업이 이루어지는 단위입니다.
    • 하나의 StepItemReader, ItemProcessor, ItemWriter로 구성됩니다.
  3. ItemReader:

    • 배치 처리할 데이터를 읽어오는 역할을 합니다.
    • 데이터 소스는 파일(CSV, XML), 데이터베이스, 메시지 큐 등 다양할 수 있습니다.
  4. ItemProcessor:

    • ItemReader로부터 읽어온 데이터를 가공하고 변환하는 비즈니스 로직을 수행합니다. (선택 사항)
    • 예를 들어, 특정 데이터를 필터링하거나, 다른 형식의 객체로 변환하는 작업을 합니다.
  5. ItemWriter:

    • ItemProcessor에 의해 가공된 데이터를 저장(쓰기)하는 역할을 합니다.
    • 데이터 저장소는 데이터베이스, 파일, 다른 시스템 등 다양할 수 있습니다.
    • Chunk 기반 처리: Spring Batch는 데이터를 하나씩 처리하는 대신, 일정 개수(Chunk)만큼 묶어서 한 번에 처리하고 트랜잭션을 커밋합니다. 이는 대용량 데이터 처리 시 I/O 부하를 줄여 성능을 크게 향상시킵니다.
  6. JobRepository:

    • Job과 Step의 실행 상태, 성공/실패 여부 등 배치 작업의 메타데이터를 데이터베이스에 기록하고 관리합니다.
    • 이 메타데이터 덕분에, 작업이 중간에 실패했을 때 어디서부터 재시작해야 할지를 정확히 알 수 있습니다.

➕ 간단한 Spring Batch 설정 예시 (Java Configuration)

@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 설정 ...
}

📌 요약

  • Flyway는 SQL 스크립트 기반으로 데이터베이스 스키마의 변경 이력을 자동으로 관리해주어, 여러 환경에서 DB 스키마의 일관성을 보장하는 필수적인 마이그레이션 도구입니다.
  • 배치 처리는 대용량의 데이터를 사용자와의 상호작용 없이 일괄적으로 처리하는 작업입니다.
  • Spring Batch는 이러한 배치 처리를 위한 표준 프레임워크로, Job, Step 구조와 ItemReader, ItemProcessor, ItemWriter라는 명확한 역할 분리를 통해 안정적이고 확장성 있는 대용량 데이터 처리 애플리케이션을 구축할 수 있게 해줍니다.
  • 특히, Chunk 기반 처리JobRepository를 통한 재시작 기능은 Spring Batch의 핵심적인 장점입니다.

0개의 댓글