연동 채널이 여섯이었는데 새 채널을 붙일 때마다 여러 파일을 고쳐야 했다. 경로와 형식과 인코딩을 채널별로 가르는 같은 분기가 파일마다 반복되고 있었다.
Table of contents
Open Table of contents
열네 곳에 흩어진 분기
채널로 가르는 분기를 세어 보니 열네 곳이었다. 새 채널을 붙이면 그 열네 곳을 전부 찾아 넣어야 했다.
그중 하나를 빠뜨려서 문제가 난 적도 있었다. 같은 축으로 가르는 분기가 여러 곳에 있으면 하나가 빠지는 것은 시간문제다.
한 줄에 모은 규격
채널의 모든 속성을 담는 규격 객체를 만들고 채널별로 한 줄씩 정의했다. 경로 패턴과 형식과 구분자와 인코딩과 날짜 형식과 헤더 유무가 한 줄에 있다.
읽는 쪽은 채널 코드로 규격을 가져와 경로를 만들고 파서를 얻어 처리한다. 분기가 열네 곳에서 한 곳으로 줄었다.
붙여 보며 확인한 빈 자리
새 채널을 한 줄 추가해 봤더니 그 형식의 파서가 없어서 예외가 났다. 파서를 만드는 자리에서 모르는 형식이면 예외를 던지게 해 뒀기 때문이다.
그 자리에서 예외가 나므로 조용히 넘어가 실제 처리 시점에 드러나는 일이 없다. 파서 하나만 만들고 다른 파일은 안 고쳤다.
표를 검사하는 시험
규격 표 자체가 맞는지를 확인하는 시험도 만들었다. 형식이 허용 목록에 있는지와 경로 패턴이 비어 있지 않은지와 날짜 자리가 들어 있는지와 파서가 존재하는지를 본다.
날짜 자리가 없는 항목을 하나 잡았는데 매일 같은 파일을 읽고 있었다. 자리 종류는 경로 앞부분으로 갈라 흡수해서 표에 따로 안 적어도 되게 했고 채널별 자잘한 예외도 표의 항목으로 넣어 파서 안의 조건문을 없앴다.
종료된 채널의 자리
표를 화면에서 볼 수 있게 하니 운영하는 쪽이 인코딩이나 구분자를 물어보지 않게 됐다. 코드를 보고 답하던 것이 표를 보고 답하는 것으로 바뀌었다.
채널 하나가 계약 종료로 없어졌을 때는 표에서 지우지 않고 종료 목록으로 옮겼다. 옛 자료에 그 채널 코드가 남아 있어서 규격이 필요하므로 조회는 되되 새 처리는 안 하게 했고 지웠으면 옛 자료를 못 읽었을 것이다.
정리
- 대상마다 다른 것이 흩어져 있으면 새 대상을 붙일 때 전부 고친다
- 한 대상의 모든 것을 한 줄에 모은다
- 새 대상을 붙여 보고 빠진 것이 예외로 나오게 한다
- 표가 맞는지 확인하는 시험을 만든다
- 저장 자리 종류는 경로에서 갈라 흡수한다
- 대상별 자잘한 예외도 표에 담고 코드에 조건으로 넣지 않는다
- 표를 화면에서 보게 하면 물어보지 않게 된다
- 종료된 대상은 지우지 말고 조회 전용으로 남긴다