공공데이터포털의 api 를 가지고 javascript로 데이터를 긁어왔다

도모_땃쥐·2021년 9월 24일
0

발단

나는... 문서가 시키는 대로 했을 뿐이다. ja_val. 왜 또 안되는데

후배가 공공데이터포털의 api를 활용하여 데이터 몇 개 긁어볼 수 없냐고 물어봐서, 파이썬으로 스크랩핑 코드만 오지게 짜서 자신감에 차있던 나는 금방이지 하고 덥썩 받아물었다. 그리고 5시간동안 죽치고 붙잡고 난 뒤에, 이 글을 쓰고 있다. 공공데이터포털 api 하나 때문에. 분명 나는 문서가 시키는대로 했는데 왜 안되는지 기절할 노릇으로 5시간을 보냈다. 이게 말이 되냐...

전개

원래는 파이썬으로 짜고 있었지만, 답답해진 나머지 '이게 다 파이썬 때문이다! 무튼 파이썬 때문이다!' 정신승리를 선언하고 언어를 javascript로 옮겼다. '그래... 자바스크립트에는 axios도 있고 json처리도 훨씬 편할테니까...' 거기에는 꿀과 낭만이 가득찬 api의 세계가 있을 것이라 생각했다.

물론 파이썬에서 하던 식대로 하니 어림도 없다고 결과창이 말해줬다. 그래도 파이썬처럼 시작도 못하지는 않았고, 대신 에러를 뿜고 죽어주셨을 뿐이다. 죽으면서 에러 코드라도 던져주는 게 어디냐.. '공공데이터 API javascript' 로 검색했다.

검색결과: 우효~ 겟또다아제!

encodeURIComponent를 쓰면 되는 것이었다. ServiceKey 와 query의 특정 부분에 encodeURIComponent 를 넣어주면 된다 이거지. api 딱대! 스크래핑 마스터 아닌 내가 간다! 모르면 부딛히면 되지!

위기


이거 백앤드 짠 X끼는 상상 이상의 변태임이 틀림없다. 상태로 200을 뱉고 에러코드를 data에 집어넣는 건 상상도 못 해봤다.

모르면....모른다! 나는 인터넷 서핑으로 알아낸 것을 그대로 적용했는데 무튼 안된다고 하는 순간 모르는 것은 모른다는 사실을 깨달을 수 있었다. 그래도 친절하게 api는 너의 서비스 키가 잘못되었다고, SERVICE_KEY_IS_NOT_REGISTERED_ERROR라고 알려주었다. 내가 발급받은 인증키가 잘못되었다고? 그럴리가 없는데????

절정

여기서 킹리적 갓심을 해본다. 가장 유의미한 건... 문서가 잘못되었다는 것이다. 코드 조금 고친다고 돈드는 거 아니니, EncodingKey를 씌운 encodeURIComponent를 지우고 다시 실행해본다.


고렇지! 이거지!

진짜 어이가 아리마셍한 순간이었다. 공식 문서에서는 encode 하라면서요 ㅋㅋㅋ 아니 왜 다른 건 encode 하는데 serviceKey는 또 encode 안 하냐고요. 아니 그나저나 ascii 만 쓰는 url에 utf-8로 인코드 때리는 게 되기는 하는건가.. 오만생각이 다 들었다. 설마 javascript는 encode 다 안해도 알아서 처리해주니까 노상관인거 아닌가..?! 그리고 맞았다.

결말

그... ja_val... 잘 모르겠다. string 으로 출발하는 언어였던 걸 생각하면 java 기준이었던 것 같은데, java는 뭔짓을 하길래 url 짜는데 encode를 해줘야 하는 건가 싶기도 하고, encode 할 수는 있는데 그게 왜 utf-8 이어야하는건지 모르겠고... 그것보다 멀쩡히 인증키 발급해놓고 인증키에 encode 한 번 더하라는 그 기획이 어떻게 통과되었는지 정말 모르겠다. 무튼 나는 여러 삽질과 회피기동을 통해 오늘도 한 건을 끝내고,,, '한글'을 url 에 적용하러 나간다. 또 npm 탐방 해야겠구만. 이라고 했지만 예전에 python 에서 한 번 된통 데여준 덕분에 금방 풀었다. (핵심은 한글! 만 encode 해 주는 것이다.)

그러면 끝난 기념으로 완성된 코드를 놓고 가겠습니다. (이정도 뻘글 읽었으면 구현코드 정도는 드리는 게 예의겠지요.)

import axios from "axios"
import readline from "readline"

const serviceUrl = "http://apis.data.go.kr/B551182/hospInfoService1/getHospBasisList1"
const EncodingKey = "인증키입니다. 공공데이터포털에서 요청받아 쓰도록 하세요."
const DecodingKey = "인증키입니다. 공공데이터포털에서 요청받아 쓰도록 하세요."
const ServiceKey = EncodingKey

const clCd = "상급종합"
const yadmNm = "가톨릭대학교인천성모병원"

let query = "?"
query += 'ServiceKey' + '=' + ServiceKey;
query += "&" + 'clCd' + '=' + '01';
query += "&" + 'type' + '=' + 'json'


if (clCd == "상급종합") {
    query += "&" + 'clCd' + '=' + '01';
} else if(clcd == "종합") {
    query += "&" + 'clCd' + '=' + '11'
}
if (yadmNm != false) {
    query += "&" + 'yadmNm' + '=' + `${encodeURIComponent(yadmNm)}`
}


let requestUrl = `${serviceUrl}${query}`;
let data = await axios.get(requestUrl)

// console.log(data)
console.log(query)
console.log(data.data.response.body.items)
profile
이것저것하는 사람. 주로 python과 야바스크립트.

0개의 댓글