[공공데이터포털 기상청 Open API] 유저가 언제 세차할까 고민하지 않도록
Open API로 날씨정보를 보여주는 피쳐 만들기
아이디어의 시작
이 아이디어는 올 초 1분기 개인 OKR을 정하던 시기에 ‘나도 괜찮은 아이디어를 내보고 싶다’라는 욕심에서 시작했습니다. 아이디어를 처음 스쿼드(팀 같은 개념) 분들께 공유드렸을 때 다들 긍정적인 반응을 보여주셔서 그 덕분에 최종적으로 피쳐를 실험할 수 있었습니다. 뱅샐앱 설치해서 자동차탭 들어가면 보실 수 있어요 🙂 껄껄. 아이디어부터 완성까지 기여도가 높은 피쳐라 애정이 갑니다 😎
자동차탭 관련해서 진행했던 첫 피쳐는 차계부 같은 기능이었습니다. 유저들이 한 달동안 자동차와 관련해서 지출한 사용처와 금액(aka 유지비)을 리스트 형태로 보여주는 기능이었는데, 어느 정도 실시간성을 갖고 있지만 피쳐 자체가 월단위의 유지비를 보여주기 위해 만들어진 것이다보니 유저가 매일 자동차탭을 방문할 이유는 없는 상태였습니다. 그래서 매일 달라지는 무언가를 보여줘서 매일 방문할 이유를 만들어주고 싶었습니다.
매일 달라지는 것은 무엇이 있을까? 자동차와 관련 있으면 좋겠고, 유저들에게 도움이 되는 기능을 고민했습니다. 그러면서 빠르게 개발할 수 있었으면 좋겠다는 굉장히 이상적인 희망을 가졌습니다.
지금은 차를 팔았지만, 차가 있었던 시절을 복기하며 키워드를 나열했습니다. 제가 주로 정비, 주유, 세차를 제일 신경썼다는 점을 알게 됐고, 특히 첫 차이다보니 애정이 넘쳐서 기계세차, 손세차 정보를 찾아봤던 것이 떠올랐습니다. 그런데 세차와 관련해서 매일 달라지는 정보를 고민하다 날씨를 이용하면 되겠다는 아이디어가 떠올랐습니다. 공공데이터포털에 기상청 Open API가 있기 때문에 날씨를 위해 별다른 데이터 모으는 작업이 필요 없었기 때문에 가장 적합한 규모의 스펙이었습니다.
무엇을 보여줄지 정하기
처음에는 이 기능을 통해서 아래의 두 가지를 보여주고 싶었습니다.
- 0–100 사이의 정수인 세차지수를 보여주기(숫자가 높을 수록 세차하기 좋은 날이라는 뜻)
- 이번 주에 무슨 요일에 세차하면 좋다고 알려주기
미세먼지, 황사, 강수 등의 예보 정보를 조합하여 나름대로 세차지수 계산식도 만들어서 준비했지만, ‘세차지수 70과 80의 차이가 어떤 차이인지 유저들이 쉽게 알 수 있을까?’ ‘내일 소개팅이 있는 사람이라면 내일 비가 와도 오늘 세차를 할 수 있지 않을까?’ 라는 질문들을 만나면서 방향을 바꿨습니다. 오늘을 포함하여 n일의 날씨를 보여주고, 우리는 최소한의 추천/비추천의 문구 정도만 노출하는 방향으로 가닥을 잡았습니다.
그래서 최종적으로는 아래의 내용을 보여주는 것으로 정했습니다.
- 오늘과 5일 후까지의 날씨예보를 보여주기
- 위 날씨예보를 기반으로 세차 추천/비추천 여부 문구 노출 (n일이상 동안 맑은 날씨가 유지된다면 세차 추천한다는 문구를, n일 내에 비/눈 소식이 있다면 세차, 괜찮을까?라는 문구를 노출 등)
전체적인 흐름
공공데이터포털의 Open API는 Server to Sever 통신이어야합니다. 브라우저에서 직접 API call을 할 경우 CORS로 인한 에러가 발생합니다. 그래서 express로 만들어진 서버에 GET 요청을 받는 API를 하나 만들고, express 서버에서 기상청 Open API를 call하고 결과를 조합해서 브라우저에 response를 주는 방법으로 진행했습니다.
배치 서버를 두고 일정 시간마다 기상청 Open API call을 해서 DB에 저장하는 방법도 있겠지만, 거기에 공수를 들이는 것보다는 빠르게 실험을 해서 이 기능이 괜찮은 기능인지/아닌지를 판별하는 게 더 중요하다고 생각해서 배치서버는 따로 두지 않았습니다. 그리고 일일트래픽 제한이 운영계정일 경우 일 100만인데, 그 트래픽이 부족하진 않을 것으로 예상했고, 모니터링을 하면서 Open API 일일트래픽이 초과할 것으로 예상되면 그 때 배치서버 작업을 해도 늦지 않다고 생각했습니다.
공공데이터포털을 이용해야할 때 개발자가 알아두면 좋을 내용들
예쁘고 유저에게 필요한 기능을 만들기로 결정했다면, 개발자가 구현을 해내야할텐데요. 제가 삽질했던 것을 바탕으로 미리 알아두면 좋을 것들을 공유하고자 합니다 💣
법인회원으로는 가입을 못하는듯..?
아직 공공데이터 포털에는 법인회원으로 가입을 하는 경로는 없는 것 같습니다. 회사에서 프로덕션을 개발하다보면 공용계정이 필요하기 마련인데, 개인회원으로 가입해서 API 승인 요청을 해야하는 것 같습니다 🤦🏻♀️ 불 — 편 —
Server에서 Open API에 request를 하도록 구성
브라우저에서 직접 Open API를 호출할 경우 CORS에 의한 에러가 발생합니다. 따라서 중간에 프록시 서버를 구성하든, 기존에 API 서버가 있다면 그 서버에서 Open API에 request를 보내는 방식으로 진행해야합니다.
관련해서 공공데이터 포털 자료실에 크로스도메인에 문제가 생길 경우 이렇게 해결하라는 글이 있으니 참고하셔도 좋겠네요!(하지만 딱히 도움되진 않을 겁니다 🙃)
활용신청 승인후 1~2시간 후부터 response를 받을 수 있음
내가 이 Open API를 사용하겠다!라고 활용신청을 하고 자동승인이 되는 경우가 있고, 담당자(?)가 승인을 해줘야 이용가능한 API도 있습니다. 승인 후 1~2시간이 지난 후부터 response를 받을 수 있기 때문에 POC를 하기 위해서는 이 부분을 고려해야합니다. 활용승인 받아놓고, 잠시 다른 jira 티켓을 쳐내고 😎 POC를 하는 방식을 권합니다.
일일트래픽 제한을 미리 체크하기
API 마다 일일 트래픽이 정해져있습니다. 일일 트래픽 제한이 있기 때문에 미리 서버에서 배치서버를 만들어서 DB 데이터를 가져와서 쓰는 방법으로 할지, 매번 Open API에 request를 보낼지 정해야 합니다.
Open API 활용신청을 하면 처음에는 개발계입니다. 그리고 운영계로 전환을 할 수가 있습니다. 운영계로 전환하면 더 많은 트래픽을 사용할 수 있게 됩니다. 운영계로 쓰기 위해서는 활용사례를 작성해야합니다. 작성 완료하고 운영계로 전환하게 되면 더 많은 트래픽을 사용할 수 있기 때문에 QA가 끝나는 시점에 맞춰서 운영계로 전환하면 됩니다 👍
XML으로만 데이터가 제공되는 경우도 있음
제가 사용했던 기상청 API들은 XML과 JSON 형태를 모두 제공해주는 방식이어서 JSON 형태로 데이터를 받아서 계산을 해줬습니다. 국토부 Open API의 경우는 XML로만 데이터를 제공해주는 경우가 있어서 parser를 따로 써야할 수도 있습니다.
대부분 케이스가 200 OK이고, resultCode를 봐야 진짜 성공인지 아닌지 알 수 있음
어떻게 보면 좋은 걸수도 있고, 아닐 수도 있는 부분인데, URL parameter가 어느정도 맞다면 대부분의 케이스는 http status가 200을 받습니다. 그런데 200이라고 내가 원하는 데이터를 받은 상태라는 의미는 아니었습니다. 그 response body안에 resultCode라는 값으로 진짜 성공인지, 에러인지 구별할 수 있었습니다. Restful한 방식은 아니지만, 미리 알아두면 에러핸들링에 참고하실 수 있을 것 같아요!
(TMI) 조금 신경쓰였던 오타와 줄임말 잔치
http://apis.data.go.kr/1360000/VilageFcstInfoService
위 URL은 사용했던 API 중 하나입니다. 오타가 혹시 보이시나요? Vilage.. 🙃 엘(L) 하나 더 있어야하는데 없더라고요(village). 변수명에서 오타난게 아니고, URL에서 오타가 있는 걸 보면서 좀 의아했습니다. 몇 명이서 작업했을지 모르지만, 누구도 오타를 발견 못한건가 싶어서요. (뭐.. 그럴 수도 있다고 생각합니다🙄)
response property에서 key에 줄임말도 제법 많았기 때문에, 항상 문서와 같이 봐야했습니다. POP, RN1, wf3Am 등등.. 원래 기상분야에서 많이 쓰는 약어인지는 잘 모르겠지만, 저는 한 번에 의미를 파악할 수 없어서 조금은 아쉬웠습니다.