기술/Java & Spring

[Java] 공공데이터 포털 오픈 API 사용 방법.

반응형

✏️개요

  오랜만에 작성하는 이번 글의 주제는 공공데이터 포털의 오픈 API 사용방법이다. 공공데이터 포털은 정부에서 운영하는 오픈 API 서비스로 정부의 공공기관들이 운영되는 과정에서 수집한 다양한 종류의 데이터를 일반 기업들 및 국민 모두가 무료로 자유롭게 사용할 수 있도록 하나의 포털에서 제공하는 서비스이다. 

 

  필자가 공공데이터 포털의 오픈 API 서비스를 처음 접하게 된 것은 대학교 시절이었는데, 그 당시 졸업 작품을 위한 아이디어를 도출하는 과정에서 도저히 일반 대학생들이 수집할 수 없는 방대한 양의 데이터가 필요했어서 관련 정보를 찾는 과정을 통해 접할 수 있었다. 그러나 다른 아이디어가 채택되면서 사용해 보지는 못하게 되었다.

 

  이와 같은 서비스에 대한 흥미를 느껴 한 번쯤 사용해보고 싶다는 생각이 있었지만, 졸업 및 취업을 준비하느라 바빠서 시도해보지 못하고 있다가 현재 일이 한가하여 사용해보고자 했다.

 

❗ 본 게시글은 필자 개인적인 의견이므로 틀린 부분이 있을 수 있습니다. 댓글을 통해 지적해주시면 감사하겠습니다.

 

✏️오픈 API란?

  앞서 공공데이터 포털을 소개하면서 오픈 API에 대해 언급하였는데, 개발자라면 대부분 알고 있는 개념이긴 하지만 간단하게 설명해보고자 한다. 

 

  오픈 API라는 단어만 보더라도 오픈 즉, 공개된 API라는 점을 알 수 있는데 이 오픈의 특징은 누구나 무료로 사용할 수 있고 마음대로 활용할 수 있다는 것이다. 벌써 오픈 API의 절반인 '오픈'의 개념을 알아보았다. 다음으로 나오는 'API'는 무엇일까?

 

  우리 모두의 백과사전, 위키백과에 따르면 API는 Application Programming Interface의 약자로 애플리케이션에서 사용할 수 있는 프로그래밍 인터페이스라는 소리다. 솔직히 이러한 정의는 어느 블로그를 가던 널리고 널렸기 때문에 필자가 이해한 대로 이야기하면, 어떠한 기능을 수행함에 있어서 필요한 것들을 어떻게 작동하는지 알지 못해도 정해진 규칙에 따라서 원하는 결과를 얻을 수 있는 것을 의미한다고 생각한다.

 

  예를 들어보자. 

  1. 우리는 자바에서 Console창에 원하는 것을 출력하고 싶다.
  2. 일반적이라면 이를 위해선 System.out.print() 메서드를 사용한다고 알고 있다.
  3. 어떻게 굴러가는지는 모르지만, 우리는 인자로 문자열을 넘겨주면 Console창에 해당 값이 찍히는 걸 확인할 수 있다.

  이 예에서 우리가 원하는 것은 Console창에 출력이며, 이를 위한 자바 API인 System.out.print()의 존재와 사용방법을 알고 있으며 사용방법만 따라 하면 Console창에 출력 결과가 찍힌 것을 확인할 수 있다. 단, 여기서 중요한 점은 이것이 어떤 로직을 가지고 기능을 수행하는지 우리는 알 필요가 없다.

 

  지도 서비스를 제공하는 네이버 지도 API, 구글맵 API 등도 우리가 지도를 이용한 서비스가 필요하다면 어떻게 굴러가는지 몰라도 API와 사용방법에 대해 알고 있다면 원하는 결과를 얻을 수 있는 것이다. 여기까지가 필자가 이해한 오픈 API의 개념 끝이다. 

이와 같은 수많은 API들도 결국 사람이 만들었다. 이 말인즉슨 우리도 어떻게 비벼보면 구현할 수는 있다는 것인데 거기에 투자되는 시간, 노력이 만만치가 않다는 것이다. 그러니 적당한 타협을 통한 API의 사용은 개발과정에서 필수적이라고 생각한다.

✏️공공데이터 포털 오픈 API

  간단하게 오픈 API에 대해서 알아보았으니 공공데이터 포털에서 제공하는 오픈 API 서비스의 이용 방법에 대해서도 알아보자. 서비스 자체는 정부에서 운영하는 것이어서 모든 게 한 번 보면 알아보기 쉽기 때문에 사진은 없고 글로만 작성하고자 한다. (사실 캡쳐하기 귀찮다)

  1. 공공데이터 포털 접속(https://www.data.go.kr/index.do)
  2. 회원가입 및 로그인
  3. 자신이 원하는 데이터 검색. (필자는 외교부_국가·지역별 최신 안전소식(코로나 관련) 데이터를 사용한다.)
  4. 해당 데이터의 상세 기능 > 출력 결과 항목에서 꼭! 자기가 원하는 데이터를 반환해주는지 확인. (간혹, 제목만 보고 그거겠거니 했다가 원하는 데이터를 못 얻을 수 있다!!)
  5. 활용신청의 아무것도 건들 필요가 없고 사용 목적만 간단하게 작성한다.
  6. 보통은 활용신청이 바로 허락되며 인코딩, 디코딩 인증키가 제공되며, 마이페이지 > 오픈 API > 개발계정에서 요청 데이터 상세보기 페이지에서 확인이 가능하다.
  7. 마이페이지 > 오픈 API > 개발계정에서 요청 데이터에 첨부된 참고 문서를 다운로드하고 읽어보며 인증키가 등록될 때까지 기다리기. (인증키 자체는 발급되지만 공공데이터 포털 쪽에 등록이 되어야만 사용이 가능하며 보통 1시간이 걸린다. 더 걸릴 수도 있다.)
  8. 일정 시간이 지난 뒤 마이페이지 > 오픈 API > 개발계정의 요청 데이터 상세보기 페이지에서 활용신청 상세 기능정보에 인코딩 된 서비스 키를 넣어 등록 여부를 확인할 수 있다. (serviceKey is not registered error가 나오면 아직 등록 안된 거다 기다려라.)

  여기까지 마치면 이제 공공데이터 포털에서 제공하는 데이터를 사용할 수 있다. 

✏️Java에서의 사용.

  공공데이터에 대한 활용신청을 했던 페이지의 가장 아래에 보면 다양한 언어의 샘플 코드가 존재한다. 그중 자바의 코드는 아래와 같다. 간단하게 코드 분석을 해보자.

 

❗ 주의해야 할 것이, urlBuilder 부분을 잘 보면 Servicekey의 파라마 티 설정이 2개인 것을 볼 수 있는데 2번째 건 지워주자.

❗ 또한 ServiceKey 부분의 "=서비스 키"에는 인코딩 된 인증키를 넣자 '='이건 지우면 안 된다.

 

/* 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 {
    	// 1. URL을 만들기 위한 StringBuilder.
        StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1262000/CountryCovid19SafetyServiceNew/getCountrySafetyNewsListNew"); /*URL*/
        // 2. 오픈 API의요청 규격에 맞는 파라미터 생성, 발급받은 인증키.
        urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=인코딩된 서비스키"); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode("JSON", "UTF-8")); /*XML 또는 JSON*/
        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("cond[country_nm::EQ]","UTF-8") + "=" + URLEncoder.encode("가나", "UTF-8")); /*한글 국가명*/
        urlBuilder.append("&" + URLEncoder.encode("cond[country_iso_alp2::EQ]","UTF-8") + "=" + URLEncoder.encode("GH", "UTF-8")); /*ISO 2자리코드*/
        // 3. URL 객체 생성.
        URL url = new URL(urlBuilder.toString());
        // 4. 요청하고자 하는 URL과 통신하기 위한 Connection 객체 생성.
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 5. 통신을 위한 메소드 SET.
        conn.setRequestMethod("GET");
        // 6. 통신을 위한 Content-type SET. 
        conn.setRequestProperty("Content-type", "application/json");
        // 7. 통신 응답 코드 확인.
        System.out.println("Response code: " + conn.getResponseCode());
        // 8. 전달받은 데이터를 BufferedReader 객체로 저장.
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        // 9. 저장된 데이터를 라인별로 읽어 StringBuilder 객체로 저장.
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        // 10. 객체 해제.
        rd.close();
        conn.disconnect();
        // 11. 전달받은 데이터 확인.
        System.out.println(sb.toString());
    }
}

  여기까지 자바를 이용해 공공데이터를 받아오는 방법이다. 여기서 자신이 필요한 목적에 맞게 최종적인 문자열 데이터를 가공하면 되는데, 필자는 Spring에서 Model에 데이터를 set 해주어 JSP로 넘기기 위한 과정이 필요했다. 

 

  필자가 사용한 오픈 API는 결과값이 리스트 형태로 전달되기 때문에 이를 적절히 사용하기 위해선 적절한 자료구조에 담아주는 과정이 필요했는데, API문서에 교환 데이터의 표준이 JSON으로 되어있었기 때문에 JSON 형태로 변환하고자 했다. 아래가 그 코드이다.

 

... 생략 ...

	rd.close();
        conn.disconnect();
        
        // 1. 문자열 형태의 JSON을 파싱하기 위한 JSONParser 객체 생성.
        JSONParser parser = new JSONParser();
        // 2. 문자열을 JSON 형태로 JSONObject 객체에 저장. 	
        JSONObject obj = (JSONObject)parser.parse(sb.toString());
        // 3. 필요한 리스트 데이터 부분만 가져와 JSONArray로 저장.
        JSONArray dataArr = (JSONArray) obj.get("data");
	// 4. model에 담아준다.
        model.addAttribute("data",dataArr);

  이와 같은 방식을 사용해 JSP에서 data를 참조할 수 있고, jstl의 c:if태그를 사용해 리스트의 각 요소들을 참조하여 사용할 수 있게 된다. 

 

✏️마치며

  처음 사용해본 공공데이터 포털의 오픈 API는 방대한 양의 데이터뿐만 아니라 정부 중심의 공공기관 데이터가 제공되기 때문에 높은 신뢰성을 보장할 수 있다는 장점이 있는 것 같아 기회가 된다면 자주 사용하고 싶다. 또한 적절한 변환을 거친다면 놀라운 확장성을 가진 API라고 생각한다.

 

반응형