|
· 01장: 배치 개발의 난관과 적절한 기술의 선택
1.1 _ 배치 개발이 어려운 이유와 극복 방안 __1.1.1 _ 배치 작업의 특성 __1.1.2 _ AI 에이전트와 배치 개발 __1.1.3 _ 테스트 코드의 가치 __1.1.4 _ 대용량 배치의 필수 기술 요건 1.2 _ 기술 스택의 선택 __1.2.1 _ 배치 처리 외의 대안 __1.2.2 _ JVM의 선택 __1.2.3 _ 스프링의 선택 __1.2.4 _ 스프링 배치의 선택 __1.2.5 _ 퍼시스턴스 레이어 프레임워크의 선택 1.3 _ 모듈 구조와 실행, 모니터링 방식의 선택 __1.3.1 _ 배치 모듈의 분리 __1.3.2 _ 배치 잡의 실행과 스케줄링 __1.3.3 _ 배치 잡의 모니터링 1.4 _ 이 책의 구성 1.5 _ 정리 · 02장: AI 에이전트와 함께하는 개발 환경 준비 2.1 _ 대표적인 코딩 에이전트 2.2 _ 클로드 코드와 코덱스 2.3 _ 예제 프로젝트 초기 설정 __2.3.1 _ JDK 설치 __2.3.2 _ 통합 개발 환경 준비 __2.3.3 _ 그레이들 프로젝트 만들기 __2.3.4 _ 디스크 용량 검사 기능 __2.3.5 _ 테스트 작성 2.4 _ 모든 세션에 적용할 공통 지침: AGENTS.md __2.4.1 _ 지침 파일이 길어지지 않게 관리하기 __2.4.2 _ 클로드 코드와 코덱스를 동시에 지원하는 파일 구조 2.5 _ 반복 작업을 맡기는 기능: 스킬, 서브 에이전트, 훅 __2.5.1 _ 필요할 때 불러오는 작업 절차: 스킬 __2.5.2 _ 서브 에이전트와 훅으로 검증 자동화하기 2.6 _ 사람 없이 실행하는 에이전트: 비대화형 모드와 CI 2.7 _ 비용 절감 기법 __2.7.1 _ 작업에 맞는 모델 선택 __2.7.2 _ 프롬프트 캐시 의식하기 __2.7.3 _ 계획을 먼저 검토하는 플랜 모드 __2.7.4 _ 세션과 컨텍스트 관리 2.8 _ 정리 · 03장: 스프링 부트를 이용한 CLI 애플리케이션 3.1 _ 개발할 CLI 애플리케이션의 기능 3.2 _ 빌드 설정 __3.2.1 _ 에이전트에게 프로젝트 생성 맡기기 __3.2.2 _ start.spring.io에서 프로젝트 생성하기 __3.2.3 _ 그레이들의 버전 __3.2.4 _ 자동 생성된 파일 확인 3.3 _ CommandLineRunner 3.4 _ 디스크 용량 검사 태스크 3.5 _ @Bean의 사용과 생성자 주입 3.6 _ 설정 외부화와 환경별 프로파일 __3.6.1 _ @Value로 속성 주입받기 __3.6.2 _ 프로파일별 설정 파일 __3.6.3 _ 프로파일별로 빈 교체하기 3.7 _ AI 에이전트와 함께 CLI 애플리케이션 만들기 __3.7.1 _ 코딩 관례를 AGENTS.md에 적어 두기 __3.7.2 _ 새 태스크를 추가하는 프롬프트 __3.7.3 _ 같은 프롬프트라도 명시하지 않은 부분은 에이전트마다 달라진다 __3.7.4 _ 검증 훅에 스프링 규약 추가하기 3.8 _ 정리 · 04장: 대용량을 의식한 파일과 DB 처리 4.1 _ 프로그램 명세 4.2 _ CSV 한 줄을 해석하기 4.3 _ CSV 파일 전체 읽기 4.4 _ DB 스키마 생성과 확인 __4.4.1 _ H2 DB 의존성과 데이터베이스 접속 정보 __4.4.2 _ 스키마 선언 추가 __4.4.3 _ DB 접속 도구 4.5 _ SQL 실행 태스크 4.6 _ DB 연동 테스트 코드 4.7 _ DB에 쓰기 4.8 _ 애플리케이션 컨텍스트를 올리는 테스트 __4.8.1 _ 애플리케이션 컨텍스트 캐싱과 빈 등록 대상 __4.8.2 _ 트랜잭션 롤백 __4.8.3 _ 테스트에서 객체를 주입받는 여러 가지 방법 4.9 _ CSV 파일을 읽어서 DB에 쓰기 4.10 _ DB에서 읽기 4.11 _ CSV 파일로 쓰기 4.12 _ DB를 읽어서 CSV 파일로 쓰기 4.13 _ 통합 구성 4.14 _ AI 에이전트와 함께 대용량 처리 태스크 만들기 __4.14.1 _ 대용량 처리 규칙을 AGENTS.md에 적어 두기 __4.14.2 _ 새 태스크를 추가하는 프롬프트 4.15 _ 정리 · 05장: 잡, 스텝, 태스클릿 5.1 _ 스프링 부트를 활용한 스프링 배치 잡 구성과 실행 __5.1.1 _ 스프링 배치 모듈 추가하기 __5.1.2 _ 잡과 스텝 구성하기 __5.1.3 _ 잡 실행하기 __5.1.4 _ 스프링 부트의 배치 관련 클래스 5.2 _ 잡의 종단간 테스트 __5.2.1 _ JobOperatorTestUtils __5.2.2 _ @SpringBatchTest __5.2.3 _ @ConditionalOnProperty를 활용한 잡 선언 5.3 _ Tasklet 인터페이스와 구현체 __5.3.1 _ Tasklet.execute() 메서드의 파라미터와 반환값 __5.3.2 _ SystemCommandTasklet __5.3.3 _ CallableTaskletAdapter 5.4 _ AI 에이전트와 함께 배치 잡 만들기 __5.4.1 _ LLM 학습 데이터 속 과거 버전에 맞춘 코드에 주의하기 __5.4.2 _ 잡 구성 관례를 AGENTS.md에 적어 두기 __5.4.3 _ 새 잡을 추가하는 프롬프트 5.5 _ 정리 · 06장: 잡 저장소와 잡 파라미터 6.1 _ 잡 실행 이력을 RDB에 저장하기 __6.1.1 _ ResourcelessJobRepository의 한계 __6.1.2 _ 메타데이터 테이블 구조 6.2 _ 잡 파라미터의 영향을 받는 구성 요소 __6.2.1 _ 잡 파라미터와 JobInstance의 관계 __6.2.2 _ JobInstance, JobExecution, StepExecution __6.2.3 _ JobInstance의 유일성 식별에 참여하지 않는 잡 파라미터 6.3 _ 잡 저장소와 트랜잭션 __6.3.1 _ 테스트 트랜잭션과 스프링 배치 트랜잭션의 충돌 문제 __6.3.2 _ 스텝의 트랜잭션 주기 6.4 _ 스프링 부트의 JDBC 잡 저장소 관련 속성 __6.4.1 _ 속성의 이름과 역할 __6.4.2 _ 스프링 부트의 관련 클래스 6.5 _ 더 다양한 JobRepository 활용 방식 __6.5.1 _ MongoDB를 활용하는 JobRepository __6.5.2 _ 테스트에서의 ResourcelessJobRepository 활용 6.6 _ AI 에이전트와 함께 잡 저장소와 잡 파라미터 다루기 __6.6.1 _ 재실행 제약을 임시방편으로 우회하지 않게 하기 __6.6.2 _ 잡 파라미터와 메타데이터 규칙을 AGENTS.md에 적어 두기 __6.6.3 _ 메타데이터 정리 잡을 추가하는 프롬프트 6.7 _ 정리 · 07장: 잡 파라미터 심화 활용과 ExecutionContext 7.1 _ 잡 파라미터의 심화 활용 __7.1.1 _ 잡 파라미터를 참조하는 두 가지 방법 __7.1.2 _ 테스트 코드에서 잡 파라미터 지정 __7.1.3 _ 잡 파라미터로 다양한 타입을 쓰고 싶을 경우 __7.1.4 _ JobParametersValidator __7.1.5 _ JobParametersIncrementer 7.2 _ ExecutionContext를 통한 데이터 저장과 참조 __7.2.1 _ StepExecution별로 저장되는 ExecutionContext 활용 __7.2.2 _ JobExecution별로 저장되는 ExecutionContext 활용 7.3 _ AI 에이전트와 함께 잡에 값 전달하기 __7.3.1 _ 컴파일 에러로 드러나지 않는 바인딩 실수 __7.3.2 _ 값 전달 규칙을 AGENTS.md에 적어 두기 __7.3.3 _ 잡 파라미터를 추가하는 프롬프트 7.4 _ 정리 · 08장: ItemReader, ItemProcessor, ItemWriter 8.1 _ ChunkOrientedStep과 Item, Chunk를 다루는 인터페이스 __8.1.1 _ ItemReader, ItemWriter __8.1.2 _ ItemProcessor __8.1.3 _ ItemStream 8.2 _ 청크 크기와 트랜잭션 __8.2.1 _ 청크 크기를 정하는 기준 8.3 _ 액세스 로그 처리 예제의 재구현 __8.3.1 _ AccessLogCsvToDbTask(CSV → DB) 구현 __8.3.2 _ @JobScope와 @StepScope를 통해 등록되는 객체의 타입 __8.3.3 _ UserAccessSummaryDbToCsvTask(DB → CSV) 구현 8.4 _ 기본 구현체 파악하기 __8.4.1 _ Iterator와 Collection을 참조하는 구현체 __8.4.2 _ 동일한 인터페이스로 조합/위임하는 구현체 __8.4.3 _ 다른 클래스/메서드와 연결하는 구현체 __8.4.4 _ 다양한 입출력 자원을 다루는 ItemReader, ItemWriter 8.5 _ AI 에이전트와 함께 청크 지향 스텝 만들기 __8.5.1 _ 청크 스텝 구성 규칙을 AGENTS.md에 적어 두기 __8.5.2 _ 아이템 필터링을 추가하는 프롬프트 8.6 _ 정리 · 09장: 파일 읽기와 쓰기 9.1 _ 공통 속성 9.2 _ 플랫파일 다루기 __9.2.1 _ FlatFileItemReader __9.2.2 _ FlatFileItemWriter 9.3 _ JSON 파일 다루기 __9.3.1 _ JsonItemReader __9.3.2 _ JsonFileItemWriter 9.4 _ XML 파일 다루기 __9.4.1 _ StaxEventItemReader __9.4.2 _ StaxEventItemWriter __9.4.3 _ ItemProcessor를 추가한 잡 구성 9.5 _ 여러 파일 다루기 __9.5.1 _ ResourcesItemReader __9.5.2 _ MultiResourceItemReader __9.5.3 _ MultiResourceItemWriter 9.6 _ 파일 쓰기와 트랜잭션 9.7 _ AI 에이전트와 함께 파일 입출력 구성하기 __9.7.1 _ 파일 형식의 세부 사항을 프롬프트에 명시하기 __9.7.2 _ 파일 입출력 규칙을 AGENTS.md에 적어 두기 __9.7.3 _ 고정 길이 파일 리더를 추가하는 프롬프트 9.8 _ 정리 · 10장: 스프링 JDBC로 DB 읽기와 쓰기 10.1 _ 대용량 데이터 조회하기 __10.1.1 _ JdbcCursorItemReader __10.1.2 _ JdbcPagingItemReader __10.1.3 _ 키만 먼저 읽는 드라이빙 쿼리 패턴 10.2 _ 대용량 데이터 쓰기 __10.2.1 _ JdbcBatchItemWriter __10.2.2 _ 태스클릿에서 트랜잭션을 끊어서 처리하기 __10.2.3 _ 갱신·삭제 구문의 WHERE 절과 인덱스 10.3 _ 여러 개의 데이터 소스를 사용하는 애플리케이션 구성 __10.3.1 _ 스프링 부트의 @BatchDataSource 활용하기 __10.3.2 _ @EnableBatchProcessing과 @EnableJdbcJobRepository 활용하기 __10.3.3 _ JdbcDefaultBatchConfiguration 클래스를 상속해서 직접 배치 기반 구성 요소 지정하기 10.4 _ MySQL 연결 설정 최적화 __10.4.1 _ 서버 측 PreparedStatement 활용 __10.4.2 _ 배치 업데이트 성능 높이기 __10.4.3 _ 대용량 데이터 조회를 위한 옵션 10.5 _ AI 에이전트와 함께 DB 읽기와 쓰기 구성하기 __10.5.1 _ 커서와 페이징 선택하기 __10.5.2 _ DB 읽기와 쓰기 규칙을 AGENTS.md에 적어 두기 __10.5.3 _ 집계 결과를 DB에 저장하는 스텝을 추가하는 프롬프트 10.6 _ 정리 · 11장: 잡 재시작과 실패한 아이템 처리 11.1 _ 예제 준비: URL 검사 잡 __11.1.1 _ 잡 명세 __11.1.2 _ 프로젝트 초기 구성 __11.1.3 _ 파일의 수정 시간을 로깅하기 __11.1.4 _ URL을 호출하는 ItemProcessor 작성 __11.1.5 _ 전체 Job 구성 11.2 _ 잡과 스텝의 재시작 __11.2.1 _ 잡을 재시작할 때 스텝, 청크의 흐름 __11.2.2 _ 완료된 스텝 다시 실행 __11.2.3 _ 메타데이터 테이블에 기록되는 정보 __11.2.4 _ 재시작의 적합성 11.3 _ 실패한 아이템 스킵 __11.3.1 _ 건너뛸 예외와 최대 허용 횟수 지정 __11.3.2 _ 스킵과 트랜잭션 롤백 __11.3.3 _ 트랜잭션 큐에서 읽을 때 __11.3.4 _ SkipPolicy 11.4 _ 실패한 아이템 재시도 __11.4.1 _ RetryPolicy 11.5 _ AI 에이전트와 함께 실패 처리 정책 정하기 __11.5.1 _ 스킵할 예외와 한도를 사람이 정하기 __11.5.2 _ 실패 처리 규칙을 AGENTS.md에 적어 두기 __11.5.3 _ 재시작 검증 테스트를 추가하는 프롬프트 11.6 _ 정리 · 12장: 이벤트 리스너 12.1 _ 리스너 인터페이스와 애너테이션 12.2 _ 잡의 리스너 __12.2.1 _ 잡 실행 결과를 로그로 남기는 리스너 __12.2.2 _ @BeforeJob 애너테이션으로 첫 번째 스텝 대체하기 __12.2.3 _ 잡 실행 결과를 이메일로 알리는 리스너 12.3 _ 스텝의 리스너 __12.3.1 _ 콜백 메서드의 실행 순서와 트랜잭션 __12.3.2 _ ItemProcessor와 ItemProcessListener를 함께 구현한 클래스 __12.3.3 _ @BeforeStep 애너테이션 활용 __12.3.4 _ @AfterStep으로 빈 입력을 실패로 처리하기 __12.3.5 _ SkipListener __12.3.6 _ RetryListener 12.4 _ 인터페이스 프락시로 인한 부작용 12.5 _ AI 에이전트와 함께 리스너 추가하기 __12.5.1 _ 리스너 호출 누락에 주의하기 __12.5.2 _ 리스너 규칙을 AGENTS.md에 적어 두기 __12.5.3 _ 새 리스너를 추가하는 프롬프트 12.6 _ 정리 · 13장: 스텝의 흐름 제어하기 13.1 _ 예제 준비: 로그 출력 태스클릿 13.2 _ 스텝을 병렬로 실행 __13.2.1 _ 여러 스텝을 동시에 실행 __13.2.2 _ 하나의 스텝을 파티션으로 나누어 실행 __13.2.3 _ 하나의 스텝 안에서 아이템 가공을 병렬로 처리 __13.2.4 _ 큐를 사이에 둔 두 스텝의 병렬 파이프라인 13.3 _ 스텝의 조건 분기 __13.3.1 _ 스텝의 실행 결과에 따라 다음 스텝 분기 __13.3.2 _ 리스너를 활용한 분기 __13.3.3 _ JobExecutionDecider를 활용한 분기 13.4 _ 잡 멈추기 __13.4.1 _ stopAndRestart()로 멈출 스텝 지정하기 __13.4.2 _ StepExecution.setTerminateOnly()를 호출하여 멈추기 13.5 _ 다른 잡을 스텝으로 실행 13.6 _ 디렉터리 백업 예제 __13.6.1 _ backupDailyJob 설계 __13.6.2 _ 디스크 용량 기록 __13.6.3 _ 남은 용량과 시도 횟수에 따라서 분기 __13.6.4 _ 백업 실행 __13.6.5 _ 오래된 백업 디렉터리 삭제 __13.6.6 _ backupDailyJob 조립하기 13.7 _ AI 에이전트와 함께 스텝 흐름 구성하기 __13.7.1 _ 비슷한 상태 클래스와 스텝 인스턴스에 주의하기 __13.7.2 _ 스텝 흐름 구성 규칙을 AGENTS.md에 적어 두기 __13.7.3 _ 보고서 형식을 추가하는 프롬프트 13.8 _ 정리 · 14장: 배치 모듈의 의존 관계와 실행 방식 14.1 _ 모듈의 구성과 의존 관계 __14.1.1 _ 멀티 모듈 배치 애플리케이션 예제 __14.1.2 _ 모듈의 공통 요소 선언 __14.1.3 _ 잡 그룹별로 애플리케이션 컨텍스트를 구성하기 14.2 _ 잡 실행 방식과 패키징 __14.2.1 _ 잡 실행과 제어의 진입점: JobOperator __14.2.2 _ 메인 메서드에서 잡 실행하기 __14.2.3 _ 명령행 도구로 잡 실행하기: CommandLineJobOperator __14.2.4 _ 스프링 부트의 ApplicationRunner 구현체로 잡 실행하기 __14.2.5 _ HTTP 호출을 통해 잡 실행하기 __14.2.6 _ 도커 이미지 빌드와 실행 14.3 _ 실행 중인 잡에 중단 신호 보내기 __14.3.1 _ JobOperator.stop(JobExecution)을 호출하는 외부 통신용 클래스 만들기 __14.3.2 _ BATCH_JOB_EXECUTION 테이블을 직접 업데이트하여 종료 14.4 _ 잡 실행 스케줄링 __14.4.1 _ 스프링의 @Scheduled __14.4.2 _ 쿼츠 __14.4.3 _ 쿠버네티스 크론잡 14.5 _ AI 에이전트와 함께 멀티 모듈 프로젝트 확장하기 __14.5.1 _ 에러 없이 일어나는 구조 훼손 __14.5.2 _ 모듈 사이의 의존 규칙을 AGENTS.md에 적어 두기 __14.5.3 _ 새 잡 그룹 모듈을 추가하는 프롬프트 14.6 _ 정리 · 15장: 잡 실행 모니터링 15.1 _ 메타데이터 테이블로 확인하는 잡의 실행 상태 15.2 _ 액추에이터를 통한 메트릭 수집 __15.2.1 _ 스프링 배치가 제공하는 기본 메트릭 __15.2.2 _ 메트릭을 HTTP로 노출하기 __15.2.3 _ 업무 지표를 위한 커스텀 메트릭 15.3 _ 프로메테우스와 그라파나로 수집·시각화 __15.3.1 _ 웹 모듈의 메트릭 수집 __15.3.2 _ CLI 모듈의 메트릭 수집 __15.3.3 _ 그라파나로 시각화 15.4 _ 잡 실패 경보 15.5 _ 자바 플라이트 레코더로 잡 실행 기록 __15.5.1 _ 스프링 배치가 기록하는 JFR 이벤트 __15.5.2 _ CLI 잡의 실행 기록 남기기 __15.5.3 _ 떠 있는 프로세스에서 기록 남기기 __15.5.4 _ 기록 파일 분석 15.6 _ 그 밖의 모니터링 수단 __15.6.1 _ 로그 기반 모니터링 __15.6.2 _ 분산 추적 15.7 _ AI 에이전트와 함께 모니터링 구성하기 __15.7.1 _ 모니터링을 처음 구성하는 프롬프트 __15.7.2 _ 경보 규칙을 추가하는 프롬프트 15.8 _ 정리 · 16장: 맺음말 16.1 _ 해결할 과제에서 구체적인 방법으로 16.2 _ AI 에이전트 감독 총정리 __16.2.1 _ 에이전트를 감독하는 수단 __16.2.2 _ 예제 프로젝트의 AGENTS.md 통합판 __16.2.3 _ 개발을 완료했다고 선언하기 전에 확인할 것들 16.3 _ 다루지 않은 주제와 더 파악해볼 주제 16.4 _ 오늘 밤도 안녕하기를 · 부록A A.1 _ 예제 프로젝트 초기 설정 A.2 _ RetryTemplate과 RetryPolicy A.3 _ 애너테이션과 AOP를 이용한 재시도 A.4 _ RetryListener A.5 _ AI 에이전트와 함께 재시도 적용하기 __A.5.1 _ 재시도 방식 선택을 지시에 담기 __A.5.2 _ 재시도 간격과 횟수를 사람이 검토하기 __A.5.3 _ 재시도 규칙을 AGENTS.md에 적어 두기 __A.5.4 _ 개별 기능에 재시도를 추가하는 프롬프트 A.6 _ 정리 · 부록B B.1 _ 이 부록의 대상 독자와 전제 B.2 _ 예제: 메모 잡(memoJob)의 버전별 진화 __B.2.1 _ 메모 잡이 하는 일 __B.2.2 _ 스프링 배치 4 버전 __B.2.3 _ 스프링 배치 5 버전 __B.2.4 _ 스프링 배치 6 버전 B.3 _ 스프링 배치 6으로 가는 주요 변경점 __B.3.1 _ [4→5 변경] Java·Boot 기준선 상승과 javax → jakarta __B.3.2 _ [4→5 변경] 메타 DB 스키마 변경과 마이그레이션 전략 __B.3.3 _ [5→6 변경] 메타 DB 시퀀스 이름 변경 __B.3.4 _ [4→5 변경] @EnableBatchProcessing의 역할 변화와 BatchConfigurer 제거 __B.3.5 _ [4→5 변경] JobBuilderFactory / StepBuilderFactory 제거 __B.3.6 _ [4→6 누적] 스텝 트랜잭션 관리자 지정 방식과 기본값 __B.3.7 _ [4→5 변경] ItemWriter 시그니처 List → Chunk __B.3.8 _ [4→6 누적] JobParameters가 타입 정보를 보존 __B.3.9 _ [5→6 변경] 패키지 재배치: 모듈 경계에 맞춘 패키지 이름 변경 __B.3.10 _ [5→6 변경] 청크 지향 스텝 재설계: ChunkOrientedStep __B.3.11 _ [5→6 변경] JobLauncher / JobLauncherTestUtils → JobOperator / JobOperatorTestUtils __B.3.12 _ [5→6 변경] modular=true / ApplicationContextFactory 패턴 지원 중단 __B.3.13 _ [5→6 변경] JobRepository가 JobExplorer를 흡수 __B.3.14 _ [5→6 변경] @EnableJdbcJobRepository / @EnableMongoJobRepository 도입 __B.3.15 _ [4→6 누적] 배치 관련 스프링 부트 속성명 변화 __B.3.16 _ [5→6 변경] Jackson 2 → Jackson 3 (tools.jackson) __B.3.17 _ [5→6 변경] 스프링 프레임워크 7의 표준 RetryPolicy로 통합 __B.3.18 _ [4→6 누적] 리스너 인터페이스 시그니처 변화 __B.3.19 _ [4→6 누적] 도메인 객체의 시간 타입과 생성자 정리 __B.3.20 _ [5→6 변경] JSpecify 애너테이션과 스프링 부트 4의 배치 스타터 재배치 __B.3.21 _ [4→5 변경] JSR-352 지원 중단 __B.3.22 _ [4→5 변경] JAXB 의존성 선언 간소화 B.4 _ AI 에이전트와 함께 업그레이드하기 __B.4.1 _ 준비물 __B.4.2 _ 권장 루프 __B.4.3 _ 에이전트에게 넘길 작업 지시서 B.5 _ 정리 |
|
* 이 책에서 다루는 내용 *
· 배치 개발이 어려운 이유와 스프링 배치 도입 여부를 판단하는 기준 · 클로드 코드와 코덱스의 지침 파일·스킬·서브 에이전트·훅 설정 · 배치 처리에 대한 테스트 기법, 개발 지침(AGENTS.md)과 프롬프트 · 스프링 부트 CLI 애플리케이션으로 익히는 대용량 파일·DB 처리 패턴과 테스트 기법 · 스프링 배치의 잡·스텝·태스클릿, 잡 저장소와 잡 파라미터, ExecutionContext · ItemReader, ItemProcessor, ItemWriter로 구성하는 청크 지향 처리 · CSV·JSON·XML 파일과 DB의 읽기와 쓰기 · 잡 재시작과 실패한 아이템의 스킵·재시도, 이벤트 리스너 · 스텝의 병렬 실행과 파티셔닝, 조건 분기 · 멀티 모듈 구성과 잡 실행·배포·스케줄링, 모니터링과 실패 경보 · 스프링 프레임워크의 재시도 기능, 스프링 배치 4·5에서 6으로 업그레이드 |