메서드 활용 패턴 (배치 유틸)
메서드 활용 패턴 (배치 실무)
배치 코드는 "파일 열고, 줄 읽고, 청크로 처리하고, 실패하면 재시도하거나 건너뛰고, 결과를 기록하고, 뒷정리"의 반복입니다. 이 반복을 잡마다 복사하면 잡 10개에 같은
try-with-resources가 10번 나옵니다. 이 레슨은 그 반복을 재사용 가능한 메서드로 뽑아내는 25개 패턴을 모았습니다.withReader/withWriter람다 헬퍼,forEachChunk,timed,retry,processWithSkip,args → record파라미터 파싱, 리포트 빌더, 원자적 쓰기, shutdown hook까지, 끝내면 새 잡은 "다른 부분"만 람다로 넘기는 20줄이 됩니다.
1. 왜 배우는가
배치 01~05 레슨에서 Reader/Processor/Writer 구조, 파일 I/O, 청크, 트랜잭션, 스킵/재시도를 각각 배웠습니다. 그런데 실제 프로젝트에는 잡이 수십 개 있습니다.
"일자별 주문 파일 집계", "월별 정산", "고객 데이터 정제"는 읽는 파일과 변환 규칙만 다르고 뼈대는 같습니다. 뼈대를 잡마다 다시 쓰면 파일을 닫지 않는 잡, 청크 경계를 잘못 자르는 잡, 실패 시 임시 파일을 남기는 잡이 하나씩 생깁니다. 버그는 복사한 횟수만큼 늘어납니다.
해결책은 고급 06 레슨의 고차 함수입니다. "파일을 열고 닫는 것"은 withReader(path, reader -> ...)가 맡고, 잡은 reader -> ... 안에 "무엇을 읽을지"만 씁니다. "n건씩 자르는 것"은 forEachChunk가 맡고, 잡은 "한 청크로 무엇을 할지"만 씁니다.
"실패하면 세 번 다시"는 retry(3, () -> ...)가 맡습니다. 헬퍼는 한 번 검증하면 모든 잡이 그 안전성을 공유합니다.
또 하나, 배치는 실행 환경이 사람이 아니라 스케줄러입니다. 파라미터는 args로 오고, 결과는 로그와 리포트로 남고, 새벽 3시에 죽어도 임시 파일이 정리되어야 하며, 같은 날짜로 다시 돌려도 결과가 두 번 쌓이면 안 됩니다.
이 요구를 메서드 하나씩(JobParams.parse, BatchReport, shutdown hook, writeAtomically, "이미 처리됨" 검사)으로 대응하는 것이 이 레슨의 후반부입니다.