공공데이터포털 OPEN API 사용하는 방법 (API키 발급 과정부터 개발 문서 확인, 자바코드로 Response 받아보기까지 example)
OPEN API 사용하는 방법 (OPEN API 사용해본적 있나요?)
공공데이터 포털에서 제공하는 OPEN API 사용하는 방법에 대해서 간단히 공부해보았다.
(원래는 자바에서 XML 파싱 라이브러리를 테스트해보려고 적당한 XML 파일을 찾다가 OPEN API가 JSON 형식 말고도 XML형식으로 제공한다는 것이 생각나서 테스트해봤다.)
신입 개발자로 취업할 때 가끔씩 OPEN API 사용 경험을 물어보는 곳도 있었다.
이미 많은 신입 개발자들이 포트폴리오를 만들면서 어떤 프로젝트에서는 OPEN API를 사용해봤을거라 생각되지만 정리하는 겸, 사용해보지 않은 분들도 가볍게 경험할 겸해서 OPEN API를 사용하는 방법에 대해 정리한다.
(2020.06.03 - 페이지 화면도 많이 바뀌었지만 검색창이나 신청버튼 등이 그대로 있으므로 참고해도 무방하다.)
공공데이터 포털 OPEN API 사용 프로세스
1. 공공데이터 포털에 접속, 로그인한다. (https://www.data.go.kr/)
2. 원하는 자료를 검색한다.
여기서는 오늘날 제일 핫(?)한 미세먼지 데이터를 가져와서 대기오염 정보를 받아 볼 예정이다.
[미세먼지 검색화면]
[미세먼지 검색결과]
검색결과를 보면 파일데이터 9건, 오픈API 5건이 있다. 그 중 내가 원하는 API를 선택하면된다. 여기서는 한국환경공단_대기오염정보 조회 서비스를 사용할 것이다.
3. 활용 신청하기, 사용 문서 다운로드하기
위에 보이는 사진에서 "활용신청" 버튼을 눌러서 활용을 신청하면 된다.
그 전에 참고문서 부분에 있는 문서 파일을 다운로드하는 것이 좋다. 이 문서에 API에 대한 자세한 내용이 있다.
그리고 간단하게 다른 내용을 보는 것도 좋다.
End Point는 저 URL로 request를 보내라는 것으로 이해하면되고 API 유형은 REST, 데이터 기본 포맷은 XML이다 정도 확인하고 넘어간다. (XML만 제공되는 것은 아니다. 밑에서 JSON으로도 받음)
4. 개발 계정 신청하기
[개발 계정 신청화면]
( *** 이미 대기오염정보조회 API는 신청을 해놔서 화면을 보여줄 수 없으므로 대기 중금속 정보 API를 신청하는 화면으로 대체했다. 상세기능정보만 다르기 때문에 똑같이 확인만하면 된다.)
"심의 여부"가 "자동 승인"이므로 신청완료만하면 바로 API를 사용할 수 있다.
단, 아래에 상세기능 정보에서 일일 트래픽이 1000(대기오염정보API에서는 500)이므로 1000회 조회를 하면 더 오늘은 더 이상 사용할 수 없다.
더 많은 트래픽이 필요하다면 추가 신청과 승인절차를 기다리면 사용할 수 있게 된다.
승인일로부터 24개월이 가능한 점 확인을 하고, 시스템 유형은 일반적으로 일반으로 두면 된다.
그리고 상세기능정보에서 자신이 원하는 API 자료를 선택해서 필요한 것만 받을 수 있다.
위에서는 그냥 다 체크한다.
5. 마이페이지> 오픈API > 개발계정 API키 받기
마이페이지에 오픈 API에 개발계정이라는 탭으로 가면 활용에 1건이 되어있을 것이다. (이전에 사용하던 API가 있다면 더 있을 수 있음)
거기서 "대기오염정보 조회 서비스API"를 눌러보면 키 받는 버튼이 있다.
이 버튼을 눌러서 키를 받는다.
위 사진에서는 일반 인증키 재발급이라고 나와있지만 처음할 때는 일반키 발급(?) 이라고 써있을 것이다.
그것을 눌러 키를 받으면 검은색으로 칠해진 부분인 일반 인증키부분에 키 값이 발급될 것이다.
그러면 해당키를 사용해서 API서버에 요청하면 결과값을 받을 수 있다.
또한 3번에서 받은 참고문서를 여기서도 받을 수 있다.
6. 어떻게 사용하는지 문서 확인하기
이제 사용에 필요한 API key는 얻었으니 어디에 어떻게 보내는지만 알면 된다.
그 방법은 문서에 잘 나와있다.
[목차화면]
목차에서 사용가능한 서비스 목록을 확인한다.
위 사진에서는 2.2. 대기오염정보조회 서비스를 이용할 예정이니 해당 페이지로 가서 확인해보면된다.
해당 페이지로가면 서비스 인증방법이 서비스 key만 있으면 된다고 동그라미 표시가 되어있고 교환 데이터표준으로 XML과 JSON을 제공한다고 되어있다.
그 위에 밑줄을 못 쳤는데 제일 중요한 것인 인터페이스 표준으로 REST의 GET 방식으로 요청하라고 나와있다.
또한 메시지 교환 유형이 Request-Response이라는 것을 알 수 있고 실시간 정보지만 매 초당이 아니라 10분마다 측정된 값이 반영되는 것을 알 수 있다.
끝으로 JSON방식으로 응답을 받고 싶으면 &_returnType=json 을 추가하면 된다고 한다.
(밑에서 테스트할 때 해당 파라미터값을 넣어서 json으로 받아 본다.)
[요청/응답 메시지]
중간에 이렇게 메시지 sample이 있다.
저 메시지 부분에서 서비스키만 내가 아까 받은 api키를 넣고 해당 URL로 요청하면 응답을 받을 수 있다.
각 파라미터에 대한 이해도 아래 사진처럼 문서에서 알 수 있다.
[파라미터 확인]
파라미터에 대한 설명이 나와있다. 일단 우리가 관심있는 것은 stationName으로 측정소명을 내가 알고싶어하는 위치의 측정소로 변경하는 것이고 dataTerm도 최근 1일간의 데이턴지, 1개월간의 데이턴지, 3개월간의 데이턴지 정하는 것이다.
측정소는 해당 API에서도 알 수 있지만 에어코리아의 측정소 정보에서 간단히 파악할 수도 있다.
[에어코리아 미세먼지 측정소정보]
지도에서 원하는 지역(ex 인천, 경기, 서울, ...)을 클릭하고 옆에 나오는 측정소 명으로 입력해서 테스트해보면 된다.
7. 브라우저를 이용한 테스트
이제 보낼 메시지도 알았고 메시지의 의미(파라미터)도 알았고 api key 까지 얻었으니 모든 준비가 되었다.
이제 어떤 프로그래밍 언어로 짠 프로그램이든 그냥 브라우저에서 테스트만 해보든 요청할 것만 남았다.
[브라우저 테스트 json, 브라우저 테스트 xml]
[자바 소스 json, 자바 소스 xml]
보다시피 브라우저의 URL창에다가 직접 메시지(GET방식)를 날려도 응답이 오는 것을 확인할 수 있고, 자바로 간단하게 소스를 만들어서 요청해도 받아지는 것을 확인할 수 있다.
자바 뿐만아니라 다양한 프로그래밍 언어에서 혹은 프레임워크에서 위와 유사한 방식으로 API를 호출하고 결과를 리턴할 수 있을 것이다.
끝으로 API호출하는 샘플 자바소스를 제공한다. (요새는 심지어 OPEN API 페이지에서 공식적으로 여러 언어로 지원한다... 내 원래 샘플코드를 삭제하고 가이드에 있는 코드를 가져왔다. 심지어 여러 언러(java, javascript, c++, php, curl object-c, python, nodejs)로도 샘플 코드를 지원한다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /* Java 샘플 코드 */ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.io.BufferedReader; import java.io.IOException; public class ApiExplorer { public static void main(String[] args) throws IOException { StringBuilder urlBuilder = new StringBuilder("http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty"); /*URL*/ urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=서비스키"); /*Service Key*/ urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/ urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지 번호*/ urlBuilder.append("&" + URLEncoder.encode("stationName","UTF-8") + "=" + URLEncoder.encode("수내동", "UTF-8")); /*측정소 이름*/ urlBuilder.append("&" + URLEncoder.encode("dataTerm","UTF-8") + "=" + URLEncoder.encode("DAILY", "UTF-8")); /*요청 데이터기간 (하루 : DAILY, 한달 : MONTH, 3달 : 3MONTH)*/ urlBuilder.append("&" + URLEncoder.encode("ver","UTF-8") + "=" + URLEncoder.encode("1.3", "UTF-8")); /*버전별 상세 결과 참고문서 참조*/ URL url = new URL(urlBuilder.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-type", "application/json"); System.out.println("Response code: " + conn.getResponseCode()); BufferedReader rd; if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) { rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); } else { rd = new BufferedReader(new InputStreamReader(conn.getErrorStream())); } StringBuilder sb = new StringBuilder(); String line; while ((line = rd.readLine()) != null) { sb.append(line); } rd.close(); conn.disconnect(); System.out.println(sb.toString()); } } | cs |
파라미터에서 "ServiceKey=~" 부분만 자신의 api key로 고치면 아주 잘 동작한다.
* 2020.06.03 -> 요새는 ServiceKey값 자체가 URL인코딩이 된 상태로 제공하게 되어있는 것 같다.
그래서 위 코드도 serviceKey값만 UTF-8로 인코딩하지 않고 연결하는 것을 볼 수 있다. (나머지 파라미터들은 인코딩 함)