Back

저수율 위젯 만들기

날씨가 따뜻해지면 친구들과 나는 쉬는 날을 앞둘 때마다 저수율을 확인한다. 낚시를 하러 가기 위해서다.

배스 낚시는 보팅이나 워킹인데, 우리는 거지라 워킹 낚시를 한다.

워킹 낚시는 만수가 되거나, 저수율이 높으면 워킹 구간이 나오지 않아 힘들다. 무시하고 그냥 가게 된다면 그날은 낚시하는 것이 아니라 나무와 풀들과 싸워야 한다.

그래서 저수율을 확인해야 한다.

일단 위 사진은 저수율을 확인할 수 있는 웹 사이트다.
한국 농어촌공사 농업기반시설관리에서 제공하는 정보라고 한다.
하지만 이 화면을 보기까지는 험난한 과정을 거쳐야 한다.

구글에 저수율을 검색한 후 농어촌알리미 사이트로 들어간다.
물론 반응형도 아닌 레트로 감성 물씬 느껴지는 웹사이트에 겁도 없이 스마트폰으로 들어간다.
이제부터는 화면 좌우로 옮겨가며 엄지 검지 접었다 폈다 줌인 줌아웃 아주 난리가 나버린다.

그렇게 찾은 저수율 현황을 누르고 오랜 시간을 기다린다.
기본 선택조건에서 검색이 완료된 화면이 뜬다.
하지만 우리의 나와바리 고풍저수지는 없다.
이후 시도선택에서 충청북도로 변경 후 저수지명에 고풍이라고 넣고 다시 검색을 누른다.
이제 금회라는 글씨 밑에 위치한 숫자를 통해 저수율을 확인할 수 있다.

그렇게 고풍저수지 저수율을 확인한다. 무려 1분의 시간이 걸린다.

예상은 했지만, 역시나 만수다.
하지만 이게 끝이 아니다.
미련을 버리지 못하고 고삼저수지, 송전저수지까지 볼 것이다.
두 개의 저수지가 추가되었으니 나머지 검색을 위해 더 많은 시간이 소요된다.


시간을 줄일 수 있도록 해봐야겠다는 생각이 들었다.

핸드폰으로 더 빠르게 확인할 방법이 없을까 생각을 했다.

웹앱을 만들던, 푸쉬 알림이 가능한 앱으로 만들던 아무튼 일단은 저수율을 가져와야 했다.

위 사진의 사이트도 한국농어촌공사에서 제공하는 정보를 받는다고 쓰여 있어서 나도 공공데이터포털 사이트를 통해 저수지수위 정보 API 활용신청을 하게 되었다.

활용신청 이후 부여받은 고유의 인증키를 받아 HTTP 파라미터에 잘 담아 원하는 서비스 요청을 보내면 된다.

난 분명 잘 넣은 것 같은데 오류를 만난다.

구글링을 해보니 나와 같은 증상을 겪은 사람들이 많다.
해결한 사람들의 글들을 읽어보았다.
인증키에는 특수문자들이 있어서 그대로 요청을 보낼 수 없다고 한다.
그래서 오픈 API에서 보여줄 때는 URL 인코딩을 해놓았으니 이를 디코딩 하라고 한다.

인코딩하지 않으면 못 보내서 인코딩을 먼저 해준 것이 아닐까? 잘 모르겠다.
뭐 아무튼 하라는 대로 다 따라 해봤는데 안되길래 아직 인증키 등록이 충분한 시간이 되지 않아서인가 싶었다.
하루를 기다리고 다음 날이 돼서야 다시 시도해보게 되었다.
또 안돼서 인증키 재발급도 해서 해봤는데 그래도 안 된다.

포기했다.

다른 사이트에서 저수지 수위를 보여주는 곳을 찾았다.
국가기관에서 운영하는 사이트다.

어떤 요청에서 저수율과 저수지 정보가 들어 있는 json형태의 응답 오는 것을 확인했다.

이래도 되는지 모르겠지만, 나는 이제 성실한 납세자니, 이것을 그냥 가져다가 쓰기로 했다.

전에 사업자 등록번호조회도 쓰라고 제공해주는 API 안 쓰고 국세청 홈택스 웹페이지에서 요청하는 주소를 통해 XML 응답 받아오는 것도 막가져다가 써본 경험이 있는데, 이 경험을 떠올려보면 아마 상관이 없을 것 같다.

요청 파라미터에 equip_no: 1039를 보아하니 이게 저수지 번호고, 저수지 구분하는 파라미터구나!
바로 느껴졌다.

역시 숫자 바꿔보면서 해보니 다른 저수지들이 나왔다.

모든 숫자에 해당하는 저수지 이름과 주소를 얻고 싶었다.
또 이래도 되는지 모르겠지만, 요청을 여러 번 보내 모든 저수지 정보를 가져와야겠다고 생각했다.

파이썬으로 깔짝거려보다가 어려워서 자바로 사용했다.

결국 여러 번 보낸 요청을 통해 json으로 응답 받아온 것을 파싱해서 엑셀에 넣었다.

이것을 하려고 json관련 라이브러리도 받고 구글링도 했다.

대충 넘겨지는 equip_no 파라미터는 800 이상부터 한 2500 아래 정도까지만 제대로 된 응답이 오길래 넉넉하게 넣어 반복문 돌려버렸다.

나온 결과는 858 ~ 2382까지 존재한다.
중간에 조회되지 않는 번호도 있다.
그렇게 총 1216개의 저수지 번호와 이름, 위치를 알았다.

thread sleep도 없이 연속적으로 천 번이 넘는 요청을 냅다 꼽아버렸다.
그래서 중간에 조회가 안 된 것이 서버에서 디도스 공격 감지 같은 것을 했나 이런 생각도 했었다.

하지만, 실제로 postman으로 확인해보니 없는 번호가 맞다.

역시 국가기관에서 운영하는 서버라 튼튼하다.
되지도 않는 오픈 API도 국가기관에서 운영하는데 참 이상하다.


바쁘게 살다 보니 2주 3주가 지났다.

갑자기 생각이 나서 다시 이것에 집중하게 되었다.

처음 계획은 이것을 앱 형태로 만들어야겠다고 생각을 했으나, 미세먼지 확인 위젯, 날씨 확인 위젯 같이 이것을 위젯으로 만들면 어떨까 생각을 했다.

그러던 중 scriptable이라는 것을 통해 쉽게 ios 위젯을 만들 수 있는 것을 알게 되었다.

참고로 나는 현명한 소비자답게 아이폰이 없다.
자기 전에 영상을 보기 위해 가끔 들여다보는 아이패드에 위젯으로 만들 생각을 했다.
(아이패드는 돈주고 산게 아니라, 어떤 행사에 참여해서 받았다.)

처음에 테스트는 xcode의 ios simuator 로 진행하려고 했다.
그런데 이 시뮬레이터로 ios를 막상 구동해보니 app store도 존재하지 않았다.
시뮬레이터는 개발자 도구일 뿐, 다른 app을 다운받는 것은 불가능하다고 한다.

그래서 코드는 직접 컴퓨터로 작성하고, 카카오톡을 통해 아이패드로 전송하며 테스트를 했다.

아이패드를 통해 앱 스토어에서 Scriptable을 다운로드받는다.

이것저것 공식문서도 보고, 어떻게 만드는지 알아본다.

코드를 작성하고, 카카오톡을 통해 보내며, 아이패드 터치 가지고 힘들게 테스트를 한다.

그렇게 scriptable앱을 통해 보낸 저수율 http 요청을 json 형태로 받아 파싱하고 로그도 찍어본다.

위젯을 추가해본다

짜잔!

낚시왕 현우가 추천하는 삼대장 저수지들의 저수율이 보인다.

업데이트해온 시간도 넣고, 글씨 정렬, 글씨 색깔, 배경 색깔도 넣고 꾸며본다.

결국 이렇게 만들었다.

이 위젯의 refresh는 시스템이 정한다고 한다.

해외 사용자들이 올린 게시글을 통해 확인해보니 따로 설정하지 않으면 6분에서 11분에 한 번씩 요청을 다시 보내 위젯을 업데이트하는 것 같다.

또한, 아마 위젯이 보이는 사이드바 화면으로 넘어가지 않으면 굳이 요청을 보내지 않을 것 같다.
우리 시총 1위 킹갓 애플에서 효율적으로 OS를 설계했을 것으로 믿는다.

그래서 서버에 무리가 가지도 않을 것이다.
이 국가기관에서 운영하는 서버를 담당하시는 분이 내가 이렇게 사용한다는 것을 알아차리지도 못할 것이고, 이 저수율 위젯을 오래오래 사용할 수 있을 것이다.