프로젝트를 진행하다보면, 방대한 양의 데이터베이스를 구축해야 하는데 스스로 일일이 만들기에는 복잡하고 너무 어렵다.
이때 open api를 사용하면 많은 데이터를 읽고 쓸 수 있는데, 이때 api의 뜻과 공공데이터 포털에서 사용하는 오픈 api 사용법을 알아보도록 하자.
API == Aplication Programing Interface이다.
해석을 하자면, 응용프로그램에서 데이터를 읽고 쓰기 위해 사용하는 일종의 소통창구라고 할 수 있다. 하지만 이렇게 표현하자면 이해하기가 어려워서 간단히 생각해보면, 구현내부의 동작은 모르지만, 사용법만 알면 서비스를 이용할 수 있게 하는 것이라고 할 수 있다.
가령, C++언어에서 System.out.println(); 함수를 사용할 때, 해당 함수의 정의와 구현방법은 모르지만, String을 input값으로 넣으면 콘솔창에 출력한다는 사용법은 알고 있기에 간편하게 사용할 수 있다. 이 경우에는 System.out.println()함수를 API라고 할 수 있다.
API는 크게 2가지 종류가 있다. 회사에서만 사용할 수 있는 공개되지 않는 private API와, 공공에서 사용할 수 있는 public API가 있다. public API는 open API라고도 불린다.
공공데이터를 사용하는 사이트는 다양하게 존재한다.
공공데이터 포털
서울 열린데이터 광장
둘 중, 서울 열린데이터 광장을 이용해보도록 하겠다.
공공데이터 중에 흥미있어 보이는 "서울시 동상 현황"을 선택했다.

해당 사이트에서 회원가입 - 로그인을 한 후, 인증키를 신청해야 한다.

개인 인증키가 있어야 api를 사용할 수 있기에, 정보를 입력하고 인증키를 발급하자.

참고로, 현재 api는 개인적인 학습에 이용할 것이기에 사용URL이 없다. 이처럼 사용 URL이 없는 경우에는 localhost를 작성해주면 된다.

샘플 URL코드에 발급받은 개인 인증키를 넣고, 본인이 원하는 확장자(xml 또는 json)을 입력해주면, 해당 링크에서 데이터를 바로 볼 수 있다.


[open api 이용방법] 탭에 들어가면, open API 셈플코드가 존재한다.

이클립스에 해당 코드를 복사하고, 해당 코드에서 인증키, 요청파일타입만 적고 실행해주면 된다.
근데 에러가 났다.
Error: Could not find or load main class ApiExplorer
Caused by: java.lang.NoClassDefFoundError: ApiExplorer (wrong name: testcode/ApiExplorer/ApiExplorer)
에러 원인은 클래스 경로와 패키지 구조의 불일치로 인해 발생한 것이었다. 클래스 로더가 코드에 지정된 곳에서 해당 패키지 경로에 존재하는 클래스를 찾아야 하는데, 일치하기 않아서 못 찾은 경우이다.
해결법은 간단했다. 뇌를 비우고 만들어서 그랬다.. 🤯
이클립스에서 java project를 만든 후, 패키지를 만들 때 클래스명을 APiExplorer, 패키지명을 test라고 정확히 명시해 해당 샘플코드와 맞춰주면 된다.
/* Java 1.8 샘플 코드 */
package test;
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.seoul.go.kr:8088"); /*URL*/
urlBuilder.append("/" + URLEncoder.encode("65526b696f6f6c693833424b6f586c","UTF-8") ); /*인증키 (sample사용시에는 호출시 제한됩니다.)*/
urlBuilder.append("/" + URLEncoder.encode("xml","UTF-8") ); /*요청파일타입 (xml,xmlf,xls,json) */
urlBuilder.append("/" + URLEncoder.encode("CardSubwayStatsNew","UTF-8")); /*서비스명 (대소문자 구분 필수입니다.)*/
urlBuilder.append("/" + URLEncoder.encode("1","UTF-8")); /*요청시작위치 (sample인증키 사용시 5이내 숫자)*/
urlBuilder.append("/" + URLEncoder.encode("5","UTF-8")); /*요청종료위치(sample인증키 사용시 5이상 숫자 선택 안 됨)*/
// 상위 5개는 필수적으로 순서바꾸지 않고 호출해야 합니다.
// 서비스별 추가 요청 인자이며 자세한 내용은 각 서비스별 '요청인자'부분에 자세히 나와 있습니다.
urlBuilder.append("/" + URLEncoder.encode("20220301","UTF-8")); /* 서비스별 추가 요청인자들*/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/xml");
System.out.println("Response code: " + conn.getResponseCode()); /* 연결 자체에 대한 확인이 필요하므로 추가합니다.*/
BufferedReader rd;
// 서비스코드가 정상이면 200~300사이의 숫자가 나옵니다.
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());
}
}

실행결과, 콘솔창을 보면 맞게 입력되었다는 Response code : 200과 함께 데이터를 xml형태로 가져온 것을 확인할 수 있다.
근데 해당 샘플코드에 대한 이해없이 그냥 넘어가면 심심하니깐.. 다음 포스팅에서는 예제코드를 공부하며 얻은 공부결과를 기록해보겠다~