스프링 배치 (Spring Batch)
스프링 배치는 대량의 데이터 처리를 위한 프레임워크로,
대량의 데이터베이스 작업이나 배치 처리를 쉽게 관리하고 실행할 수 있도록 돕는다.
주로 데이터 마이그레이션, ETL 작업 등에 사용되면, 대규모 작업에서 유용하다.
** 배치
사용자와의 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것
→ 일괄 처리
- 정기 배치: 일, 주, 월과 같이 정해진 기간에 정기적으로 수행
- 이벤트성 배치: 특정 조건을 설정해두고 조건이 충족될 때만 수행
- On-Demand 배치: 사용자 요청 시 수행
스프링 배치는 배치 작업을 관리하지만, 이 작업(Job)을 구동하거나 실행시키는 기능은 지원하지 않는다. 스프링에서 작업을 실행시키려면 Quartz, Scheduler, Jenkins 등 전용 스케줄러를 사용해야 한다.
→ 스케줄링 작업의 효율적인 관리를 위해서 Spring Batch를 사용할 수 있다.
chunk 지향 프로세스
1. JobRepository
다양한 배치 수행과 관련된 수치 데이터와 Job의 상태를 유지 및 관리한다.
일반적으로 관계형 데이터베이스를 사용하며 스프링 배치 내의 대부분의 주요 컴포넌트가 공유한다.
실행된 step, 현재 상태, 읽은 아이템 및 처리된 아이템 수 등의 모두 JobRepository에 저장된다.
2. Job
Job은 배치 처리 과정을 하나의 단위로 만들어 표현한 객체이고 여러 step 인스턴스를 포함하는 컨테이너
Job이 실행될 때 스프링 배치의 많은 컴포넌트는 탄력성을 제공하기 위해 서로 상호작용을 한다.
3. JobLauncher
Job을 실행하는 역할을 담당한다. Job.execute을 호출하는 역할
Job의 재실행 가능 여부 검증, 잡의 실행 방법, 파라미터 유효성 검증 등을 수행한다. 스프링 부트의 환경에서는 부트가 Job을 시작하는 기능을 제공하므로, 일반적으로 직접 다룰 필요가 없는 컴포넌트이다. Job을 실행하면 해당 잡은 각 step을 실행한다. 각 스텝이 실행되면 JobRepository는 현재 상태로 갱신된다.
4. Step
스프링 배치에서 가장 일반적으로 상태를 보여주는 단위
각 Step은 잡을 구성하는 독립된 작업의 단위
장점
- 대량 데이터 처리 최적화: 청크 단위로 데이터 처리하여 메모리 사용 최적화
- 재시작 기능: 실패한 배치 작업을 재시도할 수 있도록 checkpoint 기능을 제공하여, 이전에 실패한 지점부터 다시 시작할 수 있습니다.
- 스텝과 잡 구분: 작업을 여러 단계로 나눠서 관리할 수 있기 때문에 복잡한 흐름을 간단하게 정의
- Job: 자동이체 작업 전체
- Step: 각 단계별 작업 (ex. 계좌 조회, 이체 처리, 결과 저장 등)
- 트랜잭션 관리: 작업 실패 시 롤백 가능
단점
- 복잡성: 설정과 개발이 다소 복잡, 단순한 스케줄링 작업을 위해 사용하기에는 무거움
- 운영 환경 필요
스케쥴러 (Scheduler)
스케쥴러는 특정 작업을 일정 주기마다 실행하도록 설정하는 방식
Spring에서는 주로 @Scheduled 어노테이션을 사용하여 작업을 간단하게 예약할 수 있다.
ex. @Scheduled(cron = "* * * * * *")
→ 6자리 설정만 허용하며, 연도 설정을 할 수 있다.
- 초(0-59), 분(0-59), 시간(0-23), 일(1-31), 월(1-12), 요일(1-7, 1:일, 7:토)
기호 의미
* | 모든 값을 의미 |
? | 해당 항목을 사용하지 않음 |
- | 기간 설정 |
, | 여러 값을 지정해 나열 시 사용 |
/ | 시작과 반복간격을 지정 |
zone - 시간대 설정 (디폴트: 로컬 시간대)
ex. @Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
@Scheduled 규칙
- Application 클래스에 @EnabledScheduling 추가
- 실제 스케줄링 작업할 클래스가 스프링 빈에 등록된 클래스여야 함
- Scheduler에 등록할 클래스는 IoC 컨테이너에 등록되어 있어야 한다. → @Service로 등록해줌
- 스케줄러 메소드는 void 타입으로 지정 & 매개변수 사용 X
+) 비동기 방식으로 실행시키고 싶다면, @EnableAsync 어노테이션을 이용할 수 있다
장점
- 간단함: 설정이 매우 간단하여, 빠르게 특정 작업을 예약하고 주기적으로 실행할 수 있다.
- 적은 리소스 사용
- 다양한 스케줄링 방식: 크론 표현식(Cron Expression) 또는 Fixed Delay를 통해 작업 스케줄을 설정할 수 있다.
- 실시간 처리 가능
단점
- 재시작 기능 없음: 실패한 작업에 대한 재시작 기능이 기본적으로 제공되지 않는다.
- 복잡한 배치 흐름 지원 부족: 여러 단계의 배치 작업을 체계적으로 관리하거나, 대규모 데이터를 청크 단위로 처리하는 데는 적합하지 않다.
'Web Programming' 카테고리의 다른 글
[JUnit] assertThat(AssertJ), assertEquals(JUnit) 비교 (0) | 2025.01.10 |
---|---|
JWT(JSON Web Token)란? (0) | 2024.11.25 |
[Spring] DI 의존성 주입 | Field 주입, Setter 주입, 생성자 주입 (1) | 2024.09.04 |
[Java] HikariCP | Database Connection Pool (0) | 2024.08.27 |
CORS의 모든 것 | CORS란? | CORS 시나리오와 대응 방법 (1) | 2024.08.06 |