공공 API를 request 해오고 이를 console에서 출력하는 간단한 프로그래밍을 연습하고 있다. 전 포스팅에서 인증키를 얻어오는 것까지 진행했다. 그렇다면 이를 이제 어떻게 활용할 것인가가 관건이다.
먼저 IDE를 실행하자. Eclipse oxygen 버젼을 사용했다.
(별다른 이유가 있는 것은 아니고 강사님께서 사용하셔서...)
일단 새 프로젝트를 만들자.
src 하위에 data.api.json
package를 생성한다. 그 후, package 하위에 ApiJson.class
를 생성한다.
ApiJson.java
에 들어갈 내용은 다음과 같다.
package data.api.json;
import java.io.BufferedReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class ApiJson {
public static void main(String[] args) {
BufferedReader br = null; // ---> 1.
try { // ---> 2.
String urlStr = "http://apis.data.go.kr/B552061/jaywalking/getRestJaywalking?serviceKey=3OV9AWAJeu0xZpMYtAEE4n9ALJxdXVbHzzrzdW1W%2BeQxc6O0nCihEK90fEg2%2BlBuLY%2BOwQQZTV6OXgFzcBKfFQ%3D%3D&searchYearCd=2017&siDo=11&guGun=680&type=json&numOfRows=10&pageNo=1";
// ---> 3.
URL url = new URL(urlStr); // ---> 4.
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
// ---> 5.
urlConn.setRequestMethod("GET");
urlConn.setRequestProperty("Content-type", "application/json");
System.out.print("Response code:" + urlConn.getResponseCode());
// ---> 6.
}
catch(Exception e) {
System.out.print(e.getMessage());
}
}
}
<코드 설명> (주석 처리된 번호 참조)
데이터를 읽고 쓰는데 버퍼를 사용하기 위해 BufferedReader
함수를 사용했다. 쓰면서도 버퍼의 정확한 의미를 몰랐던 나는 이 참에 용어정리를 하고 가기로 했다.
버퍼(Buffer)
입출력 속도 향상을 위해서 데이터를 임시로 메모리 영역의 한 곳에 모아두는 것을 말한다. 버퍼를 사용하게 되면 한 번에 모았다가 처리하기 때문에 입출력 관련 처리 작업을 매우 빠르게 할 수 있다는 장점이 있다.
try, catch
문으로 예외처리를 하였다.
공공데이터 포털에서 얻은 공공 API 인증키 및 전체 주소를 집어넣는다. 이 때, 변수에 여러 값을 넣어서 주소 체계를 만들어야 하므로 String
보다는 StringBuilder
를 사용했다.
String vs StringBuilder
자바에서 String 변수를 선언할 때 사용하는 메소드이다. 그러나, 쓰임새가 다르므로 상황에 따라 갖다 써야 하는 경우가 다르다. 먼저, String
은 불변(immutable)성을 가지기 때문에 매번 새로운 객체를 생성해서 참조하는 방식이다.
가령,
String str1 = "abc";
String str2 = "def";
라는 두 개의 String 객체가 있다고 가정했을 때, str1
+ str2
를 하게 되면 당연히 새로운 String 객체를 생성하고 그 객체에 값을 집어넣을 것이다. 이는 메모리를 새로 할당하고 해제하는 등의 메모리 연산이 필요하기 때문에 성능적으로 좋지 않다. 또한, 한번 할당하면 값을 변경할 수도 없다. 이러한 단점을 보완하기 위해 StringBuilder
를 사용한다.
StringBuilder
는 문자열을 더해 나갈 때 새로운 객체를 생성하는 것이 아니라 기존 데이터에 추가하는 방식을 사용한다. 당연히 불필요한 메모리 연산이 없기 때문에 속도도 빠르다. String
과 다르게 mutable 하고, append(), insert(), delete() 같은 함수를 통해 값을 변경한다.
이런 장점들을 보유하고 있기 때문에, 공공 API를 사용하여 가공할때는 보통 StringBuilder
메소드를 활용한다.
URL 클래스로 객체를 생성했다.
HttpURLConnection
라이브러리를 import하면 openConnection()
메소드를 사용할 수 있다. URL 주소의 원격 객체에 접속한 뒤 통신할 수 있는 URLConnection
객체를 리턴해주는 메소드이다. 이 외에도 Request 방식을 지정하거나 Property 값도 설정할 수 있다.
정상적으로 http통신이 세팅되었다면 200이 출력 될 것이다.
그렇다면 과연, 실제로 Responsecode가 200을 출력하는지 실행해보자.
(성공적으로 출력되는 모습)
만약, 위 공공 API 링크에서 철자하나라도 틀렸다면 통신이 제대로 이루어지지 않을 것이다. 철자를 일부러 다르게 입력하고 앱을 실행시킨다면..
흔히, 우리가 웹 사이트에 접속하려고 할 때 요청하는 페이지 또는 파일을 찾을 수 없을 경우 뜨는 404 Not found의 내용이 뜬다.
지금까지 공공 API의 내용을 실제로 http통신을 요청하고 콘솔에서 출력하는 것까지 해보았다.