brunch

You can make anything
by writing

C.S.Lewis

by 혜림 Apr 04. 2024

자연어기반 초보 개발자 VS 기상청 날씨 API

플랜트샤워 오픈 후 날씨 API 때문에 반 년이나 삽질한 기록

ChatGPT로 90%정도 서버 코드를 만든 웹서비스를 공개할 수 있을 거라고는 생각을 못 했는데, 그래도 우여곡절 끝에 플랜트샤워를 오픈할 수 있었다. 작년 이맘때쯤 구상을 시작해서 반 년도 안 걸린 셈이다. 

물론 나의 꿈(?)이었던 블로그 + 플랜트샤워 (1+1 플랜) 20명 유료구독... 같은 건 달성하지 못 했다. 

원래 신규 서비스 - 심지어 개인이 만든 서비스니 방문의 허들이 높고, 회원가입의 허들은 더 높고, 유료 도네이션의 허들은 더욱더 높다는 점을 잘 알고 있기 때문에 실망하지 않았다. 하지만 포스타입의 세계는 생각보다 더욱 자영업이라서 트래픽 및 뷰 수를 100% 개인 SNS로 적극 영업해야 한다는 부분은 생각하지 못했다. 기존에 운영하던 다른 채널 - 미디엄이나 브런치, 하다못해 신생 SNS인 블루스카이에도 플랫폼으로 인한 유입이 아예 없지는 않은데 포스타입은 정말 0이었다.... 그것이 제일 예상치 못한 부분이었다.

그래서 트위터(현재는 X라는 이름으로 영업하고 있지만)에서 RT가 터지면 그렇게... 포스타입 링크를 들이대는 것이었군요? 그래도 컨텐츠에 돈을 받아볼 수 있다는 건 정말로 용기가 됐다. 후원해주신 모두에게 감사드린다. 정말 500번 말해도 부족하지 않다.

나의 목표는 노션에 의지하여 너무 많아진 식물을 불편하게 기록해야 했던 것을 자체 시스템으로 전환한 뒤, 이걸 들고 지속 가능한 형태로 유지보수를 해나가는 것이었다. 식물 호더인 나... 이제 유튜버 부럽지 않은 수의 식물 개체들을 데리고 있다. 식물 쇼핑 한 번만 더 하면 100개라서 뇌에 힘주고 참는 중이다. 

또, 이런 거 내가 만들었다고 가좍들에게 자랑하면서 한 번 써보라고 들이대며 너무 크지 않은 비용으로 삶의 활력을 얻고자 하는 부수적인 목적이 있었다. 

하지만 막상 ChatGPT로 서비스를 만들었다고 글을 쓰면서 회고해 보니 AI의 비중이 턱없이 낮았다.

왜냐면 플랜트샤워를 만드는 전체 과정에서 생성형 AI가 차지하는 비중이 적었기 때문이다.  

서비스 구조 설계하기 - 수제

서비스 UI 디자인하기 - 수제

코드 만들기          서버 사이드 (파이썬, 플라스크) - ChatGPT 

프론트(웹) 사이드 - 수제 70 ChatGPT 30

서버 배포하기 - 수제

네, 생성형 AI보다 사람이 수제로 작업한 비중이 더 높습니다. 심지어 ChatGPT가 한 부분도 내가 잘게 떠먹여준 다음에 버그가 안나는지 테스트하는 것은 내 몫이었다. 그래서 서비스 제작 후기가 예상했던 것보다 굉장히 다른 결이 되었고, 글을 쓰기도 쉽지 않았다. ChatGPT와 했던 수많은 대화도... 거의 쓰이지 않았다. 그래서 ChatGPT와 했던 대화에 대해서는 뭔가 부록에 해당하는 성격의 글을 따로 써야겠다는 계획을 갖고 있었다.(아, 쓰고 싶지만 쓰기 싫다.)

아무튼 플랜트샤워를 오픈하고 난 후 이거 한답시고 개인적으로 못했던 일들을 정리한 뒤 한 달이 지나서야 첫 업데이트 기능으로 별 생각 없이... 목록 위에 작은 날씨 창을 넣기로 했다. 일단 베란다 가드닝에서는 꽤 중요한 정보이기도 하고, 회사에 다니던 시절에는 제법 간단한 일에 속했기 때문이다. API라는 외부에 오픈된 다른 기업 또는 공공 서버에 정보를 요청해서 받아온 뒤 그걸 뿌려주기만 하면 된다.

현재 플랜트샤워에 구현된 날씨 정보의 형태

하지만 놀랍게도 그 일은 아직도 끝나지 않았다. 뭔가 계속해서 문제가 생겼으므로, 꼬리에 꼬리를 물고 자그마한 개선 태스크가 잡히는 그런 식이었다. 그래서 아예 시리즈로 새로 잡기로 했다. 나 자신을 포함한 구독자 여러분께... 작은 읽을 거리를 만들 겸.

일단 ChatGPT를 켜고 물어봤다.

한국 기상청에서 제공하는 API 정보를 받아와서 현재 날씨를 표시하고 싶어. 어떻게 해야 할까?
ChatGPT : 한국 기상청에서 제공하는 API를 이용하여 현재 날씨 정보를 가져오려면 몇 가지 단계를 거쳐야 합니다. 아래는 간략한 방법을 설명하는데, 기본적인 Python 프로그래밍 지식과 API 사용 경험이 필요합니다.
API Key 획득: 먼저, 한국 기상청의 API 서비스를 사용하기 위해 API 키를 발급받아야 합니다. 기상청 웹사이트를 방문하여 계정을 생성하고 API 서비스에 가입하여 키를 획득합니다.
API 문서 확인: API를 사용하기 전에 어떤 데이터를 가져올 수 있는지, 어떻게 요청해야 하는지 등을 확인합니다. 문서를 통해 필요한 endpoint와 요청 방식, 반환되는 데이터 형식 등을 파악합니다.
Python을 사용한 API 요청:
데이터 처리: 받아온 JSON 혹은 XML 데이터를 파싱하여 필요한 날씨 정보만을 추출합니다. 기상청 API 문서를 참고하여 어떻게 데이터가 구성되어 있는지 확인하고, 원하는 데이터만 선택적으로 사용합니다.
이렇게 간단하게 Python을 통해 기상청 API로부터 날씨 정보를 받아올 수 있습니다. 다만, 실제로 API를 활용할 때는 rate limit, 데이터의 정확성, 예외 처리 등 여러 가지 사항을 고려해야 합니다.

구글에도 '기상청 날씨 api'라고 검색해본다.

다른 개발자 여러분들이 한땀한땀 쓴 글을 헨젤과 그레텔 빵가루처럼 주워먹는 게 정말 도움이 많이 된다.

공공 데이터 포털 이용하기

공공 데이터 포털 https://www.data.go.kr/

개발자 선생님들이 쓴 글을 읽어본 결과... 공공 데이터포털이라는 곳에 가입해서 API 사용 신청이라는 것을 해야 한단다. 일단 가입까지는 그럭저럭 해 볼 수 있었다. 그런데 API 종류가... 네 가지야? 

기상청에서 제공하는 오픈API는 네 가지로, 중기예보, 초단기예보, 초단기실황, 단기예보이다.

그리고 실제로 활용신청을 해야 하는 API URL은 다음과 같다. 활용신청이라는 것을 해야 API Key를 내려준다. 여기서 초단기실황, 초단기예보, 단기예보 세 가지가 제공된다. 따로 심사하지 않고 자동승인 되기 때문에 처음에는 localhost:8888 이런 걸로 신청해도 되고, 운영계정으로 신청하면 하루에 10만 콜까지 가능하다.

https://www.data.go.kr/data/15084084/openapi.do

난해함의 시작 : 기상청의 초단기실황 API를 사용할 수 없는 이유

내가 제공하고 싶은 건 현재 날씨였기 때문에 초단기실황을 사용하면 될 것 같았다. 하지만 사실은 초단기실황을 단독으로는 쓸 수 없다. 기상청 공식 날씨누리에 접속해보면, 초단기실황에서 제공하는 정보들을 볼 수 있다.(왜냐면, 이 시점에서는 내가 API 문서를 봐야 잘 모르니까....)

뭔가... 중요한 것이 빠져있지 않은가?

뭔가 중요한 것이 하나 빠져 있다. '맑음' '구름조금' '눈' '비'같은 형태의 기본 하늘 상태에 대한 정보가 빠져 있다. 그래서 실황이 아닌 '예보' 데이터를 사용해야 한다. 기상청 날씨누리의 하단 이 부분에 해당하는 데이터이다.

여기에는 날씨, 기온, 습도가 다 나오니 OK구만!

기상청의 예보 API는 두 가지 형태가 있다. 호출하는 API 주소 및 규격이 달라진다.  

초단기예보 - 30분마다 한 번 발표 (언제까지 : 지금부터 6시간 후까지 / 예보단위 : 30분 단위)

단기예보 - 하루에 8번 발표 (언제까지 : 글피까지 / 예보단위 : 1시간 단위)

둘 다 시도해보니, 사실상 서비스에 쓸 수 있는 예보는 단기예보였다. 사용해 봤을 때, 초단기예보는 서버요청에 너무 느리고 실패가 잦았다. 실황이 아니라 예보에서 가져오는 것이기 때문에, 가장 최근에 발표한 현재 시간과 제일 가까운 시간의 예보 데이터를 들고와야 한다.

그러면 서버 개발에 다음의 태스크가 추가된다.  

현재 시간과 가장 가까운 발표 시간 구하기

현재 시간과 가장 가까운 예보 시간 구하기 (첫 구현에는 이게 빠져 있었음)

기상청에서는 다음과 같은 파이썬 샘플 코드를 제공하고 있다.            

그러니까 다음과 같은 항목을 서버에 요청할 때 입력해주면 데이터를 뽑아주겠다는 말이다.  

서비스키 ServiceKey

페이지 번호 pageNo

데이터 결과 수 numOfRows

응답자료형식 dataType

발표일자 base_date - 프로그래밍해서 결과값을 넣어야 한다.

발표시각 base_time - 프로그래밍해서 결과값을 넣어야 한다.

예보지점 X 좌표 nx - 기상청 고유값. 위도를 브라우저에서 받아와서 변환이 필요하다.

예보지점 Y 좌표 ny - 기상청 고유값. 경도를 브라우저에서 받아와서 변환이 필요하다.

단기예보 API가 뽑아주는 데이터 형태를 알아보자

도대체 뭘 뽑아주는 지 알아야 가공 및 활용이 가능할 것 아닌가... 공공데이터 포털에 로그인을 한 후, 마이페이지 > 데이터 활용 > Open API > 활용신청 현황이라는 데 들어가보면 맨 밑에 내가 신청한 동네예보 조회서비스가 뜬다. 여기서 미리보기라는 것을 활용하면 프로그래밍을 해보지 않고도 단기예보조회 API에서 어떤 응답을 해주는 지 확인해볼 수 있다.

코드를 사용하지 않고 공공데이터포털에서 미리 요청을 해 볼 수 있다.
우리동네 위치와 최신 예보발표, 최근 시간을 입력해봤더니 대략 정신이 멍해지는 화면이 나왔다.

대체 UUU는 뭐고 VVV는 뭐고 VEC는 뭐여....... nx와 ny는.... 어떻게 계산하라는 것이여......

그것은 기상청 오픈API 페이지의!!!! 

기상청41_단기예보 조회서비스_오픈API활용가이드_최종.zip

이라는 파일을 다운받아!!!!

압축을 풀면 워드 파일과 엑셀 파일이 나온다.

워드 파일은 도대체 저 의문의 데이터 형식은 무엇인가? 에 대해 자세하게 공무원체로 기술되어 있고, 엑셀 파일은 각 행정구역 격자를 리스트 형태로 만들어 위도와 경도를 nx와 ny라는 기상청 독자 규격으로 변환하면 어떻게 되는지를 나타내고 있다. 와 진짜 머리아파....

원래 API란 이렇게까지 복잡한가?

그건 아니다. OpenWeathermap이라는 날씨 전문 사이트의 경우, 위도와 경도, API 키만 입력하면 된다. 왜냐면 실황이라 다른 복잡한 정보가 필요 없다. 그리고... 뭔가 내려주는 정보의 형태가 기상청 것보다 알아보기 쉽지 않은가? 온도가 화씨가 기본값인데 units=metric을 옵션으로 입력해주면 특별히 뭘 가공할 것도 없다.

그럼에도 기상청 데이터를 아등바등 쓴 이유는?

날씨는 원래 자국 기상청이 갖고 있는 데이터가 제일 정확하다.

아이폰 날씨앱은 한국 기상청이 아니라 theweatherchannel 기반 데이터를 사용하므로 좀 정확도가 떨어지긴 한다. 일본은 기상청 데이터 받아와서 눈물나게 정확하고 많은 정보를 제공한다. 이 내용은 다음의... 애플 서포트 페이지에서 확인해볼 수 있다....

https://support.apple.com/ko-kr/105038

Q : 뭐야 그냥 아침에 일어나서 날씨앱 켜기 싫어서 만든 기능이라며...

A : 그래도 정확하지 않은 것은 싫다.


* 이 기능을 구현하기 위한 ChatGPT와의 대화 기록은 포스타입 시리즈에서 연재하고 있습니다.

https://plantshower.postype.com/series/1245074/%EC%9E%90%EC%97%B0%EC%96%B4%EA%B8%B0%EB%B0%98%EC%B4%88%EB%B3%B4%EA%B0%9C%EB%B0%9C%EC%9E%90vs%EA%B8%B0%EC%83%81%EC%B2%AD%EB%82%A0%EC%94%A8api

브런치에서는 코드를 별도로 표현하거나 복사가 되지 않아 이미지로 올렸는데, 같은 내용의 포스타입 포스트에서 복사할 수 있습니다. https://plantshower.postype.com/post/16510406

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari