1. 배치 어플리케이션 ?
배치(Batch) - 일괄처리
매일 전날의 데이터를 집계해야 하는 상황을 가정합니다. 해당 기능은 하루에 1번 수행 > 이러한 기능을 위하여 API를 구성한다면
- 방대한 양의 데이터를 읽고 가공한다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다 소비하여 Request를 받지 못하는 현상이 발생
- 5만번째에서 실패했다면 처음부터 다시 시작
- 누군가 이미 집계함수를 실행하여 집계함수를 2번 실행
위와 같은 문제 해결을 위하여 단발성으로 대용량의 데이터를 처리하는 어플리케이션을 배치 어플리케이션 이라고 합니다.
정해진 시간마다 데이터 가공이 필요한 경우에 Spring Batch가 사용될 수 있습니다.
배치 어플리케이션의 조건
- 대용량 데이터 - 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
- 자동화 - 배치 어플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
- 견고성 - 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
- 신뢰성 - 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
- 성능 - 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.
2. Spring Batch ?
Spring Batch는 Accenture와 Spring Source의 공동 작업으로 2007년에 탄생하였습니다. Accenture의 배치 노하우 & 기술력과 Spring 프레임워크가 합쳐져 만들어진 것이 Spring Batch 입니다.
DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용 가능합니다.
Accenture의 Batch 노하우가 담긴 아키텍처 사용 가능합니다.
3. Annotation 및 Method
- @Configuration
- Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용합니다.
- jobBuilderFactory.get(“jobName”)
- jobName 이란 이름의 Batch Job을 생성합니다.
- job의 이름은 별도로 지정하지 않고 Builder를 통해 지정합니다.
- stepBuilderFactory.get(“stepName”)
- stepName 이란 이름의 Batch Step을 생성합니다.
- jobBuilderFactory.get(“stepName”)와 마찬가지로 Builder를 통해 이름을 지정합니다.
- .tasklet((contribution, chunkContext)) -> { 수행 기능; return RepeatStatus }
- Step 안에서 수행될 기능들을 명시합니다.
- Tasklet은 Step안에서 단일로 수행될 커스텀한 기능들을 선언할때 사용합니다.
Spring Batch에서
- Job은 하나의 배치 작업 단위
- Job 안에는 아래처럼 여러 Step이 존재하고
- Step 안에 Tasklet 혹은 Reader & Processor & Writer 묶음이 존재합니다.
Tasklet 하나와 Reader & Processor & Writer 한 묶음이 같은 레벨
Tasklet과 Reader & Processor & Writer 를 분리할 수 없습니다.
4. Spring Batch Meta Data ?
- 이전에 실행한 Job이 어떤 것들이 있는지
- 최근 실패한 Batch Parameter가 어떤것들이 있고, 성공한 Job은 어떤것들이 있는지
- 다시 실행한다면 어디서 부터 시작하면 될지
- 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤것들이 있는지
등등 Batch 어플리케이션을 운영하기 위한 메타데이터가 여러 테이블에 나눠져 있습니다.
4-1 MySQL에서 Spring Batch 실행
- MySQL 에서 Meta Data Table 생성
- Spring Batch Application 프로젝트 생성 후 IDE에서 file search - schema-mysql.sql 검색 후 쿼리문을 MySQL에서 실행합니다.
- Spring boot DB 연결
- Mybatis 연결 및 properties 파일 추가
- active profile 에 mysql 추가 후 실행
4-2 Maven project active profile 설정
- 추가 예정