728x90
반응형
배치(스프링배치)란?
스프링 배치는 대용량 데이터 처리에 특화된 프레임워크이다. 배치작업은 데이터를 실시간으로 처리하는게 아니라, 일괄적으로 모아서 한번에 처리하는 작업이다.
예를 들어, 쇼핑몰(온라인 웹서비스)에서 매일 매출액에 대한 금액을 조회하는 배치가 있다고 가정해보자.
온라인에서 일어나는 데이터변화에 따라 배치주기(ex, 매일 오전 6시)에 의해 배치가 돌게 된다. 온라인에서 사용자나 개발자가 직접 실행하는게 아닌, 통계/SMS전송/대용량CUD 처리 등을 위해 특화된 작업이다.
스프링 배치 흐름 설명
기본 구성 요소
- Job: 배치 단위 작업. 여러 Step을 포함할 수 있음.
- Step: 실제 처리 단위. 일반적으로 Reader → Processor → Writer 구조로 구성됨.
- JobLauncher: Job 실행을 담당. 일반적으로 외부 트리거(@Scheduled, 컨트롤러 등)를 통해 호출됨.
- JobRepository: 실행 이력, 상태 등을 저장.
- JobBuilderFactory / StepBuilderFactory: Job/Step을 생성할 때 사용.
실행 흐름
- JobLauncher가 Job을 실행 (run(Job, JobParameters)).
- Job 내 정의된 여러 Step이 순차적으로 실행됨.
- 각 Step은 다음 흐름으로 동작:
- ItemReader: 데이터 읽기 (DB, 파일, API 등)
- ItemProcessor: 읽은 데이터 가공 (선택 사항)
- ItemWriter: 데이터를 저장하거나 처리
- JobRepository에 실행 상태 저장 (성공/실패/중단 등)
배치 작업은 트랜잭션 단위로 끊어 실행되며, chunk 사이즈만큼 반복 처리된다.
@Scheduled와 매개변수 사용 불가한 이유
@Scheduled는 단순히 정해진 시간에 메서드를 호출하는 어노테이션이다. 하지만 메서드에 파라미터가 있으면 실행되지 않는다.
예를 들어, 잘못된 예시 코드를 보자면
@Scheduled(cron = "0 0 * * * *")
public void scheduledJob(String input) {
System.out.println("실행됨: " + input);
}
- IllegalStateException: Only no-arg methods may be annotated with @Scheduled 예외 발생
- 이유: @Scheduled 메서드는 파라미터 없는(no-arg) 메서드만 허용
수정된 예시 코드
@Scheduled(cron = "0 0 * * * *") // 매 정각마다 실행
public void scheduledJob() {
System.out.println("정각마다 실행되는 작업");
}
반환값 void, 파라미터 없이 사용해야 된다.
만약 파라미터가 필요하다면 파라미터 없이 실행하되 내부에서 값을 가져오는 방식으로 구현해야 한다.
이유
- @Scheduled는 Spring의 TaskScheduler가 리플렉션을 통해 메서드를 호출함.
- 이 호출은 매개변수 없는 메서드만 지원한다.
- 따라서 @Scheduled 메서드는 public void method() 형식이어야 함.
해결 방법
- 파라미터가 필요한 경우, 내부에서 값을 조회하거나 JobParameter로 넘겨서 배치 실행.
- 또는 @Scheduled 메서드에서 JobLauncher.run()을 호출하고, 그 안에서 JobParameters를 전달.
728x90
반응형
'실무' 카테고리의 다른 글
jQuery 반복문($.each) 사용 시 주의점 | 민민의 하드디스크 - 티스토리 (0) | 2025.05.21 |
---|---|
[DB] CONNECT BY와 WITH RECURSIVE 계층형 데이터 조회 | 민민의 하드디스크 - 티스토리 (1) | 2025.03.23 |
[Spring] 데이터 전달하기: Model, Map, DTO 비교와 최적 활용 | 민민의 하드디스크 - 티스토리 (0) | 2025.03.14 |
[DB] 트랜잭션과 데이터베이스 락(Transction & DB Lock) | 민민의 하드디스크 - 티스토리 (0) | 2025.03.13 |
[DB] ROWNUMBER와 RANK의 차이 | 민민의 하드디스크 - 티스토리 (1) | 2025.03.09 |