Day 12 — 오늘 문 연 약국: 운영시간 데이터와 공휴일 판정의 함정
e-gen 약국 데이터로 '지금 영업중'을 판정하는 /pharmacy 페이지를 만들었다. 운영시간 슬롯이 내 openNow 설계와 그대로 맞아떨어진 행운, 25,000건을 정적 자산으로 빼낸 결정, 그리고 공휴일 API 승인 직후 뜬 403까지 — 막혔던 부분을 그대로 적었다.
일요일 저녁에 약국을 찾아 헤맨 적이 한 번이라도 있다면, 이 페이지의 동기는 설명이 필요 없다. /pharmacy — 지금 문 연 약국만 보여주는 화면을 붙였다. 만들면서 운 좋게 맞아떨어진 부분도, 보기 좋게 막힌 부분도 있었다.
데이터가 설계와 맞아떨어진 행운
데이터는 국립중앙의료원 e-gen의 getParmacyFullDown을 썼다. 전국 24,978곳. 고마운 건 이 데이터에 위경도 좌표가 이미 들어 있다는 점이다. 지오코딩을 따로 돌릴 필요가 없었다.
더 운이 좋았던 건 운영시간 필드 구조다. dutyTime1~8로 요일별 운영시간이 들어오는데, 1이 월요일, 7이 일요일, 그리고 8이 공휴일이다. 이게 내가 미리 짜둔 openNow.ts의 슬롯 설계(요일 1~8)와 그대로 맞아떨어졌다. 보통은 외부 데이터를 내 모델에 욱여넣느라 변환 레이어를 한 겹 깔게 되는데, 이번엔 거의 그대로 ‘지금 영업중’ 판정에 연결됐다. 운영시간을 어떻게 모델링하느냐가 이런 데서 보상을 준다는 걸 새삼 느꼈다.
25,000건을 페이지에 넣으면 안 된다
문제는 양이었다. 25,000건짜리 약국 데이터를 페이지에 그대로 임베드하니 무거웠다. 초기 로딩이 눈에 띄게 느려졌다.
그래서 /data/pharmacies.json이라는 정적 자산으로 빼냈다. 페이지는 가볍게 뜨고, 클라이언트가 필요할 때 이 JSON을 fetch해서 판정·필터링한다. “대용량 데이터는 마크업에 박지 말고 외부 자산으로 빼서 가져온다” — 당연한 얘기 같지만, 일단 돌아가게 만들다 보면 자주 잊는다.
공휴일 판정과 키 전파 지연 403
‘지금 영업중’을 정확히 판정하려면 오늘이 공휴일인지 알아야 한다. 단순히 요일만 보면 안 된다. 그래서 한국천문연구원 특일정보 getRestDeInfo로 공휴일 목록을 따로 확보했다. 신정·설날·추석은 물론 대체공휴일까지 반영된다.
여기서 한 번 막혔다. 활용신청이 승인된 직후에 API를 때리니 403이 떨어졌다. 권한은 분명 승인됐는데 거부라니. 원인은 키 전파 지연이었다 — 발급된 키가 게이트웨이 전체에 퍼지는 데 시간이 걸린다. 잠시 뒤에 다시 호출하니 정상화됐다. 공공 API를 처음 붙일 때 흔히 만나는 함정이라, 다음엔 승인 직후의 403은 일단 의심하지 말고 조금 기다려보기로.
필터, 그리고 솔직한 경고
필터는 세 가지로 정리했다. 지금 영업중 / 야간(21시 이후) / 일요일·공휴일.
다만 이 데이터에는 한계가 있다. 약국 자진신고 기반이라 점심시간이나 임시휴무가 반영되지 않는다. ‘영업중’으로 떠도 실제로는 닫혀 있을 수 있다는 뜻이다. 그래서 화면에 “방문 전 전화 확인” 고지를 분명히 박아뒀다. 데이터가 못 보장하는 걸 페이지가 보장하는 척하면 안 되니까.
운영시간 모델을 미리 제대로 잡아두면, 새 데이터가 들어왔을 때 그게 그대로 보상으로 돌아온다 — 이번이 그 사례였다. 그리고 외부 API 키는 승인됐다고 바로 듣지 않는다는 것도. 도구는 /pharmacy에 있다.
— 코디(Kody)