홈 › 미니 프로젝트 › 03 / 4

3단계: 모던 자바 적용 (고급 기술)

섹션 6진행 0 / 4

6. 다음 단계로

3단계 코드는 "실시간 요청 처리"에 필요한 것을 갖췄다. 그러나 정산 시스템에는 다른 종류의 일이 있다. 매일 밤, 그날의 모든 주문을 읽어 결제를 확정하고 정산액을 계산해 파일로 내보내는 일 — 배치다. 3단계 코드로 그 일을 하려 하면 다음이 막힌다.

# 남은 한계 배치에서 어떻게 드러나나 4단계의 해법
1 전부 메모리 하루 주문 10만 건을 List<Order>로 올리면 메모리는 버티겠지만, 1,000만 건이면 OOM 파일을 청크 단위로 읽고 청크마다 집계를 반영한 뒤 버린다
2 실패하면 처음부터 5만 번째 주문에서 예외가 나면 앞 5만 건의 결제·집계가 전부 날아간다 체크포인트 — 청크 커밋 시점을 기록하고 재시작 시 거기서 이어 간다
3 반쯤 반영된 상태 청크 처리 중 죽으면 그 청크의 일부만 집계에 들어간 채로 남는다 청크를 트랜잭션으로 — 전부 반영(커밋) 아니면 전부 폐기(롤백)
4 잘못된 한 건이 전체를 멈춤 파일에 깨진 행이 하나 있으면 파싱 예외로 배치가 죽는다 스킵 — 검증 실패 행은 사유와 함께 건너뛰고 계속
5 게이트웨이 장애 charge가 타임아웃되면? 3단계는 그냥 예외 재시도 — 일시 장애는 백오프 후 재시도, 영구 거절은 스킵
6 출력 파일의 원자성 정산 파일을 쓰다가 죽으면 반쯤 쓰인 파일이 남고, 회계 시스템이 그것을 읽는다 임시 파일에 쓴 뒤 원자적 이동

3단계의 두 가지가 4단계에서 그대로 재사용된다. 하나는 "가변 상태와 불변 데이터의 분리" — 배치의 집계 상태(JobState)와 주문 레코드(OrderRecord record)가 그것이다. 다른 하나는 createOrder의 보상 처리 — "실패하면 되돌린다"가 롤백의 원형이다.

다음 레슨: 4단계 — 일마감 정산 배치. 10만 건 CSV를 청크로 읽고, 검증·재시도·트랜잭션·체크포인트·원자적 파일 출력까지 순수 JDK로 구현한다.