반응형
- Spring Batch가 배치 작업의 실행 상태와 이력을 추적하기 위해 자동으로 생성하고 관리하는 테이블
- 사용자가 직접 조작하지 않고, Spring Batch가 내부적으로 모든 배치 실행 정보를 기록
- 해당 테이블을 사용해서 배치 작업 모니터링도 구현해볼 수 있다.
- 실행 이력, 성공/실패 결과 등 다양한 정보를 제공
필요한 테이블의 DDL은 Spring Batch Github에서 확인할 수 있다. 여러 종류의 데이터 베이스에 대한 SQL 파일이 있어서 자신이 사용중인 데이터베이스에 맞는 쿼리를 가져와 사용하면 된다.
메타 테이블 목록
- BATCH_JOB_INSTANCE : Job의 기본 정보(이름, hash key)
- BATCH_JOB_EXECUTION : Job의 실행 이력 : job id, 실행시간, 상태, 실행결과
- BATCH_JOB_EXECUTION_PARAMS : Job 실행 시 전달된 파라미터
- BATCH_JOB_EXECUTION_CONTEXT : Job 실행 중 사용되는 상태, 정보
- BATCH_STEP_EXECUTION : Step 실행 이력
- BATCH_STEP_EXECUTION_CONTEXT : Step 실행 중 사용되는 상태, 정보
주요 정보
batch_job_instance
- 등록된 Job을 식별하기 위한 정보를 저장한다.
- Job Parameter와 조합해서 고유한 실행 인스턴스를 구별하는데 사용된다.
{
"job_instance_id": 1,
"version": 0,
"job_name": "simpleProductUploadSkipJob",
"job_key": "d4704a08e833f417e316a39fc4bd5896"
}
batch_job_execution_params
- Job 실행 시 사용된 파라미터를 저장한다.
- Job 실행마다 전달된 파라미터 값을 기록하며 실행 이력과 함께 파라미터 정보를 확인할 수 있다.
- 실행 시 Job Instance와 조합해 중복 실행 여부를 판별한다.
- 주요칼럼
- 이름, 타입, 값 등 파라미터 정보
- identifying : Job을 식별하기위 사용할지 말지
[
{
"job_execution_id": 1,
"parameter_name": "chunkSize",
"parameter_type": "java.lang.String",
"parameter_value": "5",
"identifying": "Y"
},
{
"job_execution_id": 1,
"parameter_name": "startedAt",
"parameter_type": "java.time.LocalTime",
"parameter_value": "22:10:20.8447863",
"identifying": "Y"
},
{
"job_execution_id": 1,
"parameter_name": "maxSize",
"parameter_type": "java.lang.String",
"parameter_value": "20",
"identifying": "Y"
}
]
batch_job_execution
- 실제 실행된 Job의 이력(실행 정보, 상태, 시간 등)을 저장
- 한 Job 인스턴스가 여러 번 실행될 수 있으며 그때마다 execution이 만들어진다.
- 실패 후 재실행 가능
- 각각의 실행(예: 재시작, 실패 후 재실행) 정보를 관리
[
{
"job_execution_id": 1,
"version": 2,
"job_instance_id": 1,
"create_time": "2025-07-11 22:10:20.876453",
"start_time": "2025-07-11 22:10:20.906415",
"end_time": "2025-07-11 22:10:21.122292",
"status": "COMPLETED",
"exit_code": "COMPLETED",
"exit_message": "",
"last_updated": "2025-07-11 22:10:21.122292"
}
]
batch_job_execution_context
- Job 레벨에서 사용하는 Context 정보를 저장
- Job 전체에서 공유하거나 관리해야 할 임시 데이터, 상태 정보 등을 직렬화하여 저장
[
{
"job_execution_id": 1,
"short_context": "rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABdAANYmF0Y2gudmVyc2lvbnQABTUuMi4xeA==",
"serialized_context": null
}
]
batch_step_execution
- Job 내부의 각 Step 실행 정보를 저장
- Job을 구성하는 각 Step의 실행 이력, 처리 건수, 상태 등을 관리
- skip/retry 결과 추적 가능
- 주요 칼럼
- commit_count : Step 실행 중 트랜잭션이 커밋된 횟수
- 청크 단위로 데이터를 처리할 때마다 커밋이 발생
- read_count : ****읽은 ****총 아이템 개수
- 데이터 소스에서 실제로 읽은 레코드 수.
- filter_count : Processor에서 필터링된 아이템의 개수
- Processor에서 null을 반환하거나 특정 조건으로 걸러진 아이템 수
- write_count : Writer에서 처리한 아이템의 개수
- read_skip_count : Reader에서 스킵된 아이템 개수
- write_skip_count : Writer에서 스킵된 아이템 개수
- process_skip_count : Processor 단계에서 스킵된 아이템 개수
- rollback_count : Step 실행 중 트랜잭션이 롤백된 횟수
- commit_count : Step 실행 중 트랜잭션이 커밋된 횟수
[
{
"step_execution_id": 1,
"version": 10,
"step_name": "simpleProductUploadSkipJobStep",
"job_execution_id": 1,
"create_time": "2025-07-11 22:10:20.986432",
"start_time": "2025-07-11 22:10:20.999824",
"end_time": "2025-07-11 22:10:21.111868",
"status": "COMPLETED",
"commit_count": 8,
"read_count": 20,
"filter_count": 0,
"write_count": 18,
"read_skip_count": 0,
"write_skip_count": 1,
"process_skip_count": 1,
"rollback_count": 3,
"exit_code": "COMPLETED",
"exit_message": "",
"last_updated": "2025-07-11 22:10:21.115693"
}
]
batch_step_execution_context
- 각 Step에서 사용하는 Context(상태, 체크포인트 등) 정보를 저장
- Step 실행 중 유지해야 하는 데이터를 직렬화해서 저장
[
{
"step_execution_id": 1,
"short_context": "rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAADdAARYmF0Y2gudGFza2xldFR5cGV0AD1vcmcuc3ByaW5nZnJhbWV3b3JrLmJhdGNoLmNvcmUuc3RlcC5pdGVtLkNodW5rT3JpZW50ZWRUYXNrbGV0dAANYmF0Y2gudmVyc2lvbnQABTUuMi4xdAAOYmF0Y2guc3RlcFR5cGV0ADdvcmcuc3ByaW5nZnJhbWV3b3JrLmJhdGNoLmNvcmUuc3RlcC50YXNrbGV0LlRhc2tsZXRTdGVweA==",
"serialized_context": null
}
]
- 이 메타 데이터 테이블들은 단순히 배치 작업의 실행 결과만 저장하는 것이 아니라, 장애 발생 시 재시작, 이력 관리, 그리고 운영 중 모니터링까지 다양한 영역에서 핵심적인 역할을 수행한다. 앞으로 배치 관련 작업을 할 때 문제가 발생하더라도 이번에 공부한 내용을 바탕으로 빠르게 해결할 수 있을 것 같다.
- 본 포스팅에서는 생략했지만 각 테이블에 version 이라는 칼럼이 존재한다. 이는 낙관적 락을 위해 사용하는 칼럼인데, 이전에 공부했던 내용을 만나니 뭔가 반가운 기분이었다.
- 처음 Spring Batch를 공부할 때는 모르는 도메인 용어가 많아서 어려웠다. 하지만 하나씩 어떤 역할을 하는지 따라가보니 구조에 대해서 어느정도 이해하게 되는 것 같다.
반응형