1. JobRepository란?
스프링 배치에서는 JobRepository 인터페이스 그 자체를 의미하거나, JobRepository 인터페이스를 구현해 데이터를 저장하는 데 사용되는 데이터 저장소를 의미한다. 개발자가 직접 JobRepository 인터페이스를 직접 다룰 일은 거의 없으므로 본문은 후자를 지칭한다. 이러한 JobRepository는 잡이나 스텝 등의 상태를 저장하는 데 사용되며, 실행 추세와 횟수 등을 담고 있으므로 모니터링 영역 등에서 유용하게 사용된다.
2. JobRepository 내 메타 테이블 살펴보기
RDB는 스프링 배치에서 기본적으로 사용되는 JobRepository이며, RDB를 사용할 경우 스프링 배치가 제공하는 여러 테이블을 이용해 배치 메타 데이터를 저장한다. 스키마 내에는 아래의 여섯 개의 테이블이 존재한다. 하나하나 천천히 살펴보자.
- BATCH_JOB_INSTANCE
- BATCH_JOB_EXECUTION
- BATCH_JOB_EXECUTION_PARAMS
- BATCH_JOB_EXECUTION_CONTEXT
- BATCH_STEP_EXECUTION
- BATCH_STEP_EXECUTION_CONTEXT
1) BATCH_JOB_INSTANCE 테이블
필드 | 설명 |
JOB_EXECUTION_ID | PK |
VERSION | 낙관적인 락(optimistic locking)에 사용되는 레코드 버전 |
JOB_NAME | 실행된 잡의 이름 |
JOB_KEY | 잡 이름과 잡 파라미터의 해시 값으로, JobInstance를 고유하게 식별하는 데 사용되는 값 |
이 테이블은 스키마의 실제 시작점이 되는 테이블이다. 단일 JobInstance 레코드가 테이블에 등록되며, 레코드 하나하나가 잡의 논리적 실행을 나타낸다.
2) BATCH_JOB_EXECUTION 테이블
필드 | 설명 |
JOB_EXECUTION_ID | PK |
VERSION | 낙관적인 락(optimistic locking)에 사용되는 레코드 버전 |
JOB_INSATNCE_ID | BATCH_JOB_INSTANCE 테이블을 참조하는 FK |
CREATE_TIME | 레코드가 생성된 시간 |
START_TIME | 잡 실행이 시작된 시간 |
END_TIME | 잡 실행이 완료된 시간 |
STATUS | 잡 실행의 배치 상태 |
EXIT_CODE | 잡 실행의 종료 코드 |
EXIT_MESSAGE | EXIT_CODE와 관련된 메시지나 스택 트레이스 |
LAST_UPDATED | 레코드가 마지막으로 갱신된 시간 |
이 테이블은 배치 잡의 실제 실행 기록을 나타낸다. 즉, 해당 테이블의 레코드는 잡의 물리적 실행을 나타낸다. 잡이 실행될 때마다 새 레코드가 해당 테이블에 생성되고, 잡이 진행되는 동안 주기적으로 업데이트된다.
3) BATCH_JOB_EXECUTION_CONTEXT 테이블
필드 | 설명 |
JOB_EXECUTION_ID | PK |
SHORT_CONTEXT | 트림(trim) 처리된 SERIALIZED_CONTEXT |
SERIALIZED_CONTEXT | 직렬화된 ExecutionContext |
이 테이블은 JobExecution의 ExecutionContext를 저장하는 곳이다. 잡 실행마다 상태가 이 테이블에 저장된다고 할 수 있다.
4) BATCH_JOB_EXECUTION_PARAMS 테이블
필드 | 설명 |
JOB_EXECUTION_ID | PK |
TYPE_CODE | 파라미터 값의 타입을 나타내는 문자열 |
KEY_NAME | 파라미터 이름 |
STRING_VAL | 타입이 String인 경우 파라미터의 값 |
DATE_VAL | 타입이 Date인 경우 파라미터의 값 |
LONG_VAL | 타입이 Long인 경우 파라미터의 값 |
DOUBLE_VAL | 타입이 Double인 경우 파라미터의 값 |
IDENTIFYING | 파라미터가 식별되는지 여부를 나타내는 플래그 |
이 테이블엔 잡이 매번 실행될 때마다 사용된 잡 파라미터가 저장된다. 이때, 식별 파라미터 외에도 잡에 전달된 모든 파라미터가 테이블에 저장된다. 그리고 재시작시에는 잡의 식별 파라미터만 자동으로 전달된다.
5) BATCH_STEP_EXECUTION 테이블
필드 | 설명 |
STEP_EXECUTION_ID | PK |
VERSION | 낙관적인 락(optimistic locking)에 사용되는 레코드 버전 |
STEP_NAME | 스텝의 이름 |
JOB_EXECUTION_ID | BATCH_JOB_EXECUTION 테이블을 참조하는 FK |
START_TIME | 스텝 실행이 시작된 시간 |
END_TIME | 스텝 실행이 완료된 시간 |
STATUS | 스텝의 배치 상태 |
COMMIT_COUNT | 스텝 실행 중에 커밋된 트랜잭션 수 |
READ_COUNT | 읽은 아이템 수 |
FILTER_COUNT | 아이템 프로세서가 null을 반환해 필터링된 아이템 수 |
WRITE_COUNT | 기록된 아이템 수 |
READ_SKIP_COUNT | ItemReader 내에서 예외가 던져졌을 때 건너뛴 아이템 수 |
PROCESS_SKIP_COUNT | ItemProcessor 내에서 예외가 던져졌을 때 건너뛴 아이템 수 |
WRITE_SKIP_COUNT | ItemWriter 내에서 예외가 던져졌을 때 건너뛴 아이템 수 |
ROLLBACK_COUNT | 스텝 실행에서 롤백된 트랜잭션 수 |
EXIT_CODE | 스텝의 종료 코드 |
EXIT_MESSAGE | 스텝 실행에서 반환된 메시지나 스택 트레이스 |
LAST_UPDATED | 레코드가 마지막으로 업데이트된 시간 |
이 테이블은 스텝의 실행 정보를 담고 있다. 이러한 메타 데이터 외에도 스텝 분석을 위한 READ_COUNT, FILTER_COUNT, WRITE_COUNT 등의 다양한 데이터를 제공한다.
6) BATCH_STEP_EXECUTION_CONTEXT 테이블
필드 | 설명 |
STEP_EXECUTION_ID | PK |
SHORT_CONTEXT | 트림 처리된 SERIALIZED_CONTEXT |
SERIALIZED_CONTEXST | 직렬화된 ExecutionContext |
이 테이블은 StepExecution의 ExecutionContext를 저장하는 곳이다.
3. 참고
- 스프링 배치 완벽 가이드 2/e
'Spring Batch' 카테고리의 다른 글
[Spring Batch] 스프링 배치3 - 스텝(Step) (0) | 2023.04.10 |
---|---|
[Spring Batch] 스프링 배치2 - 잡(Job) (0) | 2023.04.07 |
[Spring Batch] 스프링 배치1 - 기본 구조 및 도메인 (0) | 2023.03.31 |