Skip to content

feat: 배치 Job·Step 식별자를 MDC 에 싣는 리스너와 실행 요약 로그 리스너 추가 - #433

Open
comghost wants to merge 1 commit into
eGovFramework:mainfrom
comghost:feat/bat-core-mdc-summary-listeners
Open

feat: 배치 Job·Step 식별자를 MDC 에 싣는 리스너와 실행 요약 로그 리스너 추가#433
comghost wants to merge 1 commit into
eGovFramework:mainfrom
comghost:feat/bat-core-mdc-summary-listeners

Conversation

@comghost

Copy link
Copy Markdown

수정 사유 Reason for modification

  • 버그수정 Bug fixes
  • 기능개선 Enhancements
  • 기능추가 Adding features
  • 기타 Others

수정된 소스 내용 Modified source

배경

배치 로그는 여러 Job 이 한 파일에 섞여 Job 별로 나누거나 실행 단위(JobExecution)로 추적하기 어렵습니다. 실행이 끝났을 때
읽기·쓰기·건너뜀 건수를 한 줄로 남기는 표준 지점도 없어 관제·수집 시스템이 상세 로그를 파싱해야 합니다.

추가한 것

1. operation/EgovBatchMdcListenerJobExecutionListener + StepExecutionListener

Job 이름·JobExecution ID·Step 이름을 SLF4J MDC 에 넣고 종료 시 지웁니다.

MDC 키 주입/제거
batchJobName Job 이름 beforeJob / afterJob
batchJobExecutionId JobExecution ID beforeJob / afterJob
batchStepName Step 이름 beforeStep / afterStep

Log4j2 RoutingAppender 와 조합하면 Job 별 로그 파일 분리를 재기동 없이 구성할 수 있습니다.

<Routing name="batchRouting">
    <Routes pattern="$${ctx:batchJobName}">
        <Route>
            <File name="job-${ctx:batchJobName}" fileName="logs/batch/${ctx:batchJobName}.log">...</File>
        </Route>
    </Routes>
</Routing>

2. operation/EgovBatchSummaryListenerJobExecutionListener

Job 종료 시 전용 로거 EGOV_BATCH_SUMMARY(INFO)에 실행 결과를 key=value 한 줄로 남깁니다. 값은 Step 실행 결과를 합산합니다.

job=dailyStatsJob executionId=42 status=COMPLETED exitCode=COMPLETED durationMs=15320 steps=2 read=10000 written=9987 skipped=13 filtered=0

설계 메모

  • 기존 클래스는 수정하지 않았고 의존도 추가하지 않았습니다. 두 리스너 모두 빈으로 등록해 Job 에 붙이는 방식이라
    등록하지 않은 애플리케이션에는 영향이 없습니다.
  • 멀티스레드 Step(taskExecutor)에서는 MDC 가 워커 스레드로 자동 전파되지 않는 점을 javadoc 에 명시했습니다.
  • 상세 시계열 지표는 Spring Batch 5 에 내장된 Micrometer 관측(spring.batch.job / spring.batch.step)을 쓰고, 이 리스너는
    실행 단위 요약 한 줄만 담당합니다.

JUnit 테스트 JUnit tests

  • JUnit 테스트 JUnit tests
  • 수동 테스트 Manual testing

EgovBatchListenersTest 3건 신규, bat.core 모듈은 Linux 전건 통과, Windows 는 기존 테스트 1건이 main 에서도 실패(아래 표).

환경 기본 로케일(Locale) 모듈 실행 건수 결과
Windows ko_KR 104 Tests run: 104, Failures: 1, Errors: 0, Skipped: 0 — 실패 1건은 이 PR 과 무관한 기존 테스트 DefaultItemGuidanceKeyTest.writerDelimitedFileGuidance 로, 변경 없는 main(cc2b332) 에서도 Windows 에서만 같은 실패가 납니다(Linux 는 통과). 신규 3건은 통과
Linux (Ubuntu 22.04 / OpenJDK 17) C.UTF-8 104 Tests run: 104, Failures: 0, Errors: 0, Skipped: 0
구분 건수 내용
MDC 1 beforeJob·beforeStep 에서 키가 들어가고 afterStep 은 Step 키만, afterJob 은 전부 지운다
요약 1 Step 2개의 read·written·skipped·filtered 합산과 job·executionId·status·steps·durationMs 항목
경계 1 시작·종료 시각이 없으면 durationMs=-1, JobInstance 가 없으면 job=?

수동 확인: 현재 main(cc2b332) 위에서 bat.core 모듈 빌드·테스트가 Linux 에서 전건 통과함을 확인했습니다. Windows 에서 실패하는 DefaultItemGuidanceKeyTest.writerDelimitedFileGuidance 1건은 변경 전 main 에서도 같은 방식으로 실패해 이 PR 과 무관합니다.

테스트 브라우저 Test Browser

  • Chrome
  • Firefox
  • Edge
  • Safari
  • Opera
  • Internet Explorer
  • 기타 Others

해당 없음 — 배치 라이브러리 클래스 추가입니다.

테스트 스크린샷 또는 캡처 영상 Test screenshots or captured video

해당 없음 — 위 JUnit 테스트 결과로 갈음합니다.


base: eGovFramework:main @ cc2b332 (2026-09-10 fetch 기준, #366~#379 머지 후) · 단일 커밋

배치 로그는 여러 Job 이 한 파일에 섞여 Job 별로 나누거나 실행 단위로 추적하기
어렵고, 실행이 끝났을 때 읽기·쓰기·건너뜀 건수를 한 줄로 남기는 표준 지점이
없어 관제 시스템이 상세 로그를 파싱해야 한다.

- EgovBatchMdcListener(JobExecutionListener + StepExecutionListener): Job 이름·
  JobExecution ID·Step 이름을 SLF4J MDC(batchJobName·batchJobExecutionId·
  batchStepName)에 넣고 종료 시 지운다. Log4j2 RoutingAppender 와 조합하면 Job 별
  로그 파일 분리를 재기동 없이 구성할 수 있다
- EgovBatchSummaryListener(JobExecutionListener): Job 종료 시 전용 로거
  EGOV_BATCH_SUMMARY 에 job= executionId= status= exitCode= durationMs= steps=
  read= written= skipped= filtered= 형식의 한 줄을 남긴다. 값은 Step 실행 결과를
  합산한다
- 두 리스너 모두 빈으로 등록해 Job 에 붙이며 기존 클래스 수정·의존 추가 없음.
  멀티스레드 Step 에서 MDC 가 워커 스레드로 전파되지 않는 점은 javadoc 에 명시

EgovBatchListenersTest 3건 추가 — MDC 키 주입과 Step·Job 종료 시 제거, 실행 요약의
Step 건수 합산과 형식, 시작·종료 시각이 없을 때 durationMs=-1 과 JobInstance
없을 때 job=?.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant