본문 바로가기

삽질

공공 데이터 API는 왜 이렇게 자주 실패하는 걸까?에 대한 해결책 (feat. 대기 오염 정보(미세먼지), 기상청 단기 예보)

배경

취미로 만들었던 서비스인 '데일리비서'를 운영하며 겪었던 문제이다.
데일리비서는 내가 아침마다 확인하던 날씨, 운세, 뉴스에 대한 데일리 정보를 한 곳에 모아서 볼 수 있게 한 서비스인데, 여기서 날씨 정보는 공공 데이터 포털에서 제공하는 오픈 API에서 가져온다. (데일리비서가 궁금하신 분들은 스토어에서 '데일리비서'를 검색해 주세요!)

서비스를 구현하는 단계에서는 문제점이 대두되지 않았는데, 서비스를 운영하는 단계에선 에러 알림이 너무 자주 왔고 대부분 이 오픈 API가 실패한다는 문제가 발생했다.
내가 사용한 API 목록은 아래와 같다.

  1. 기상청_단기예보 ((구)_동네예보) 조회서비스
  2. 한국환경공단_에어코리아_대기오염정보
  3. 한국환경공단_에어코리아_측정소정보

 

물론 오픈 API이다 보니 퀄리티는 기대하면 안 되는 거지만, 흐린눈으로 넘어갈 수 없을 정도 빈도로 실패했고, 사용자 경험에 악영향을 끼친다고 판단했다.

해결법을 고민했을 때 제일 먼저 다른 퀄리티 좋은 날씨 API를 사용하는 방법이 생각났다. 그런데 찾아보니 오픈 API를 제외한 날씨 API는 전부 유료였다.
API가 실패했을 때만 유료 API로 fallback하는 방법도 고민했으나, 취미로 만든 서비스는 최대한 돈이 안 들게 지속 가능한 방향으로 만들어야 한다는 생각이 강해서 패스했다.

내가 해결한 방법

결국 위 3개 오픈 API를 15분마다 스케줄러가 호출해서 캐시해 두는 방향으로 문제를 해결했다. 생각해 보면 날씨나 미세먼지 정보는 실시간성이 아주 강하지 않기 때문에 마지막으로 캐시한 데이터를 보여주는 것이 해결책이 될 것이라고 생각했다.

또, API 실패 로그를 살펴보면 API가 timeout으로 굉장히 자주 실패했지만, 그 장애 상황이 오래 지속되지는 않는 듯 보였기 때문에 위 방법으로 날씨 기능 자체가 마비되는 케이스는 없앨 수 있을 것이라고 생각했다.

프로세스를 간단히 말해보면

  1. 사용자 중 날씨 서비스를 이용하는 사용자를 전부 불러온다.
  2. 불러온 사용자의 설정된 위치 정보를 기반으로 날씨 / 미세먼지 데이터를 캐시 or 캐시된 데이터를 업데이트 한다.

간단히 위 두 단계 프로세스를 15분 마다 반복한다.

이렇게 해서 3개월간 운영했을 때 날씨 기능이 마비된 적은 한 번도 없었으니 효과는 굉장히 좋았다고 볼 수 있다. 물론 API 실패 시 이전에 마지막으로 캐시한 데이터를 보여주니, 장마철에 날씨 예보가 자주 변동되는 상황에서 데이터 정확도가 조금 낮아지는 케이스는 있었다. (원래도 예보는 자주 틀리니, 사용자는 그러려니 했을 것 같긴 하다..ㅎ)

이 해결 방법이 정답은 아니지만, 내가 생각한 최선의 방법이다. (더 좋은 의견이 생각나신 분은 댓글로 남겨주세요!)