정산 파일 연동 채널이 여섯이었는데 새 채널을 붙일 때마다 여러 파일을 고쳐야 했다. 경로와 형식과 인코딩을 채널별로 가르는 같은 switch ($channel) 이 파일마다 반복되고 있었다.
Table of contents
Open Table of contents
원인 — 열네 곳에 흩어진 분기
grep -rn "switch (\$channel)" 으로 세어 보니 열네 곳이었다. 새 채널을 붙이면 그 열네 곳을 전부 찾아 넣어야 했다.
그중 하나를 빠뜨려서 문제가 난 적도 있었다. 같은 축으로 가르는 분기가 여러 곳에 있으면 하나가 빠지는 것은 시간문제다.
조치 — 한 줄에 모은 규격
두 가지 방법이 있었는데 열네 곳을 공통 헬퍼 함수로 묶는 것과 채널의 모든 속성을 담는 ChannelSpec 을 만들어 채널별로 한 줄씩 정의하는 것이다. 뒤쪽을 골랐다. 이유는 헬퍼로 묶어도 새 채널의 속성이 여러 함수에 흩어지는 것은 그대로라서다. 대신 여섯 채널의 속성을 한 번에 다 옮기는 작업을 감수했다. path_pattern 과 format 과 delimiter 와 encoding 과 date_format 과 has_header 가 한 줄에 있다.
읽는 쪽은 채널 코드로 규격을 가져와 경로를 만들고 파서를 얻어 처리한다. 분기가 열네 곳에서 한 곳으로 줄었다.
검증 — 붙여 보며 확인한 빈 자리
새 채널을 한 줄 추가해 봤더니 xlsx 파서가 없어서 예외가 났다. ParserFactory 에서 모르는 형식이면 InvalidArgumentException 을 던지게 해 뒀기 때문이다.
그 자리에서 예외가 나므로 조용히 넘어가 실제 처리 시점에 드러나는 일이 없다. 파서 하나만 만들고 다른 파일은 안 고쳤다.
주의 — 표를 검사하는 시험
규격 표 자체가 맞는지를 확인하는 ChannelSpecTest 도 만들었다. 형식이 허용 목록에 있는지와 경로 패턴이 비어 있지 않은지와 날짜 자리가 들어 있는지와 파서가 존재하는지를 본다.
{date} 자리가 없는 항목을 하나 잡았는데 매일 같은 파일을 읽고 있었다. s3:// 와 sftp:// 같은 자리 종류는 경로 앞부분으로 갈라 흡수해서 표에 따로 안 적어도 되게 했고 채널별 자잘한 예외도 표의 항목으로 넣어 파서 안의 조건문을 없앴다.
배경 — 종료된 채널의 자리
표를 화면에서 볼 수 있게 하니 운영하는 쪽이 인코딩이나 구분자를 물어보지 않게 됐다. 코드를 보고 답하던 것이 표를 보고 답하는 것으로 바뀌었다.
채널 하나가 계약 종료로 없어졌을 때는 표에서 지우지 않고 retired 목록으로 옮겼다. 옛 자료에 그 채널 코드가 남아 있어서 규격이 필요하므로 조회는 되되 새 처리는 안 하게 했고 지웠으면 옛 자료를 못 읽었을 것이다.
정리
- 대상마다 다른 것이 흩어져 있으면 새 대상을 붙일 때 전부 고친다
- 한 대상의 모든 것을 한 줄에 모은다
- 새 대상을 붙여 보고 빠진 것이 예외로 나오게 한다
- 표가 맞는지 확인하는 시험을 만든다
- 저장 자리 종류는 경로에서 갈라 흡수한다
- 대상별 자잘한 예외도 표에 담고 코드에 조건으로 넣지 않는다
- 표를 화면에서 보게 하면 물어보지 않게 된다
- 종료된 대상은 지우지 말고 조회 전용으로 남긴다