Skip to content
isdnetworks
Go back

대상마다 다른 저장 자리와 형식

(수정됨)

정산 파일 연동 채널이 여섯이었는데 새 채널을 붙일 때마다 여러 파일을 고쳐야 했다. 경로와 형식과 인코딩을 채널별로 가르는 같은 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 목록으로 옮겼다. 옛 자료에 그 채널 코드가 남아 있어서 규격이 필요하므로 조회는 되되 새 처리는 안 하게 했고 지웠으면 옛 자료를 못 읽었을 것이다.

정리


Share this post on:

Previous Post
옮기기 직전 상태의 기록
Next Post
채널 이름 하나, 시스템 둘