LabHub
배우기 러닝패스 코스

은행 현장의 언어 · 수신 파일의 형식 계약 · 실습

받은 파일을 적재하기 전에 돌려보내기

LabHub 에서 이어서 보기

목표

상대 기관이 보내온 고정폭·CSV 수신 파일을 적재하기 전에 검사하고, 어긋나면 파일 전체를 거절하는 문지기 filegate.py 를 만든다. 판정은 기계가 읽는 보고서와 종료 코드, 그리고 상대에게 돌려줄 거절 파일로 남긴다.

왜 중요한가

적재한 뒤에 틀린 줄을 찾는 일은 문 앞에서 거절하는 일보다 언제나 비싸다. 이미 들어간 줄은 다른 배치가 물고 갔고, 되돌리려면 정정 전표와 사과 전화가 따라온다. 998건이 멀쩡해도 2건이 규격에서 어긋나면 그 파일은 한 줄도 넣지 않는다. 절반만 넣으면 상대의 트레일러와 우리 원장이 영영 맞지 않는다.
고정폭 파일의 폭은 글자 수가 아니라 바이트다. 한글 한 글자는 CP949 에서 2바이트, UTF-8 에서 3바이트라서, 인코딩이 바뀌면 줄 길이 자체가 달라진다. CSV 는 인용 안의 쉼표와 줄바꿈을 구분자로 세지 않아야 한다.
채점기는 여러분의 문구를 믿지 않는다. 임시 디렉터리에 자기가 만든 수신 파일을 차려 놓고 여러분의 스크립트를 실행해 판정과 오류 코드를 대조한다. 기관 코드와 건수, 금액은 실행마다 바뀐다.

단계

1. /root/bankfile/gen_inbound.py 를 만들어 실행해 /root/bankfile/inbound/ 에 상대 기관 네 곳의 하루치 파일 5개를 만든다.
2. /root/bankfile/filegate.py 가 CSV 수신 파일의 뼈대와 트레일러 건수·합계를 대조하고 보고서와 종료 코드를 내게 한다.
3. filegate.py 에 고정폭(.txt) 처리를 넣는다. 한 줄이 정확히 80바이트인지 글자 수가 아니라 바이트로 잰다.
4. filegate.py 가 규격과 다른 인코딩으로 온 파일을 ENC 로 거절하게 한다. 파일마다 읽은 인코딩을 보고서에 적는다.
5. filegate.py 의 CSV 파싱을 RFC 4180 대로 고친다. 인용된 쉼표와 줄바꿈은 필드 구분자가 아니다.
6. filegate.py 에 필드 단위 검증을 넣고, 거절한 파일마다 거절 파일을 남긴다. 오류가 하나라도 있으면 그 파일은 한 줄도 적재하지 않는다.
7. filegate.py 가 같은 기관·같은 일련번호의 재전송을 DUP 로 거절하게 한다. 해시가 같으면 resend, 다르면 conflict 다.
8. 자기 수신함을 처리해 /root/bankfile/gate_report.json/root/bankfile/rejected/, /root/bankfile/receipt.md 를 남긴다.

참고

단계 8개

  1. 하루치 수신함 만들기
  2. 명세의 건수와 합계부터 맞춰 보기
  3. 고정폭의 폭은 글자가 아니라 바이트다
  4. 규격과 다른 인코딩으로 온 파일 막기
  5. 인용 안의 쉼표는 구분자가 아니다
  6. 필드 검증과 거절 파일, 그리고 부분 적재 금지
  7. 다시 온 파일과 충돌한 파일 가르기
  8. 자기 수신함을 처리하고 수신 보고서 내기