최신 게시글(JAVA)
2019.05.29 / 24:25

[파싱] 4. API키 발급 및 JSON을 이용한 웹 파싱

탁돌이개발자
추천 수 51

이전번까지해서 기초적인 JSON 오브젝트, JSONArray등의 사용법을 알아보았다. 이제는 본격적으로 API키를 발급받아서 웹에서 제공하는 JSON을 이용하여 파싱을 받아보도록 하자

먼저 해야할 것은 API키를 발급받는 것이다. API키란 사이트에서 JSON등 데이터를 제공할때 이를 받기 위해 필요한 인증키이다.

다음에서 API키를 발급받아 파싱을 해보도록 하자

우선 다음 개발자센터에 접속하여 API키 발급 신청을 하도록 한다.
 https://developers.daum.net/console

로그인을 한 뒤 좌측 상단에 앱 만들기 버튼을 누르고 이름을 정해준다.

이후 1~4번 순서대로 진행하면 API키가 발급된다.

발급된 API키는 잘 보관하도록 한다.


여기까지 했으면 다음 API키 발급이 모두 완료된 것이다.

이제 발급받은 키로 어떤 데이터를 파싱할 수 있는가 목록을 살펴보면 다양한 서비스들이 제공되는 것을 확인할 수 있다.

여기서 우리는 책 검색 서비스를 가지고 연습해보도록 하겠다.
https://developers.daum.net/services/apis/search/book


설명을 살펴보면 아래와 같다. 페이지를 전부 찾아보면 파싱 시 리턴 타입이라던지, 검색어 확장 방식이라던지 상당히 자세하게 잘 나와있다.

우리가 필요한 부분은 이 부분이다.

https://apis.daum.net/search/book?apikey={apikey}&q=다음카카오&output=json

여기의 {apikey}부분을 통째로 지우고 아까 발급받았던 본인의 API키를 붙여넣기 하면 된다. 그리고 q=다음의 내용은 검색어 부분이라는 것을 기억해 놓자.

이제 여태까지 배웠던 웹 연결 방법과 JSON파싱 방법을 이용해 JAVA라고 검색한 결과의 타이틀, 저자, 가격을 출력해보자.

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.json.simple.JSONObject; import org.json.simple.JSONArray; import org.json.simple.parser.JSONParser; class WebConnection{ String json; WebConnection() throws Exception{ String address = "https://apis.daum.net/search/book?apikey=본인의API키&q=java&output=json"; BufferedReader br; URL url; HttpURLConnection conn; String protocol = "GET"; url = new URL(address); conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod(protocol); br = new BufferedReader(new InputStreamReader(conn.getInputStream())); json = br.readLine(); //테스트출력 //System.out.println(json); } } public class Main { public static void main(String[] args) throws Exception { new WebConnection(); } }

역시 저번과 마찬가지로 생성자를 이용해 웹과 연결을 해 주었다. 다만 address에 아까보았던 JSON 주소에 자신의 API키를 입력해주고, q=다음에 java를 넣어주어야 본인의 API키로 java라는 검색 결과를 JSON형태로 받겠다는 주소를 만들 수 있다.

테스트 출력 결과는 아래와 같다.

{"channel":{"result":"10","title":"Search Daum Open API","totalCount":"13729","description":"Daum Open API search result","item":[{"author_t":"남궁성","sale_price":"27000","cover_s_url":"http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788994492032%3Fmoddttm=20160825060444","sale_yn":"Y","pub_date":"20160127","link":"http://book.daum.net/detail/book.do?bookid=KOR9788994492032","barcode":"KOR9788994492032","etc_author":"","status_des":"정상판매","author":"남궁성","title":"<b>Java</b>의 정석","category":"컴퓨터/IT ","translator":"","pub_nm":"도우출판","description":"자바의 기초부터 실전활용까지 모두 담다! 자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한『Java의 정석』. 저자의 오랜 실무경험과 강의한 내용으로 구성되어 자바를 처음...","isbn":"8994492038","ebook_barcode":"","isbn13":"9788994492032","cover_l_url":"https://t1.search.daumcdn.net/thumb/R110x160/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788994492032%3Fmoddttm=20160825060444","list_price":"30000"},{"author_t":"신용권","sale_price":"27000","cover_s_url":"http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788968481475%3Fmoddttm=20160826060247","sale_yn":"Y","pub_date":"20150105","link":"http://book.daum.net/detail/book.do?bookid=KOR9788968481475","barcode":"KOR9788968481475","etc_author":"","status_des":"정상판매","author":"신용권","title":"이것이 <b>자바</b>다","category":"컴퓨터/IT ","translator":"","pub_nm":"한빛미디어","description":"『이것이 자바다』은 15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서이다. 자바 입문자를 배려한 친절한 설명과 배려로 1장에 풀인원 설치...","isbn":"8968481474","ebook_barcode":"","isbn13":"9788968481475","cover_l_url":"https://t1.search.daumcdn.net/thumb/R110x160/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788968481475%3Fmoddttm=20160826060247","list_price":"30000"},{"author_t":"데이비드 플래너건","sale_price":"48600","cover_s_url":"http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788966261796%3Fmoddttm=20160825060444","sale_yn":"Y","pub_date":"20160314","link":"http://book.daum.net/detail/book.do?bookid=KOR9788966261796","barcode":"KOR9788966261796","etc_author":"구경택 박경욱","status_des":"정상판매","author":"데이비드 플래너건","title":"<b>자바</b>스크립트 완벽 가이드","category":"컴퓨터/IT ","translator":"구경택","pub_nm":"인사이트","description":"개발자를 위해 세심하게 구성된 자바스크립트! 『자바스크립트 완벽 가이드』는 HTML5로 촉발된 자바스크립트 관련 표준안들과 관련 API들을 대거 포함한 자바스크립트 가이드북이다...","isbn":"8966261795","ebook_barcode":"","isbn13":"9788966261796","cover_l_url":"https://t1.search.daumcdn.net/thumb/R110x160/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788966261796%3Fmoddttm=20160825060444","list_price":"54000"},{"author_t":"김춘경","sale_price":"28800","cover_s_url":"http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9791158390143%3Fmoddttm=20160826060247","sale_yn":"Y","pub_date":"20151016","link":"http://book.daum.net/detail/book.do?bookid=KOR9791158390143","barcode":"KOR9791158390143","etc_author":"","status_des":"정상판매","author":"김춘경","title":"<b>자바</b>스크립트+jQuery 완전정복 스터디 3 - 중급/고급...","category":"컴퓨터/IT ","translator":"","pub_nm":"위키북스","description":"이제 막 시작하는 초급자를 위한 초급 단계와 일반 실무자의 실력 향상을 위한 중급/고급/실무 단계로 구성돼 있으며 개인의 실력과 목적에 맞게 선택해서 스터디를 진행할 수 있도록...","isbn":"1158390149","ebook_barcode":"","isbn13":"9791158390143","cover_l_url":"https://t1.search.daumcdn.net/thumb/R110x160/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9791158390143%3Fmoddttm=20160826060247","list_price":"32000"},{"author_t":"김춘경","sale_price":"21600","cover_s_url":"http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9791158390136%3Fmoddttm=20160825060444","sale_yn":"Y","pub_date":"20151016","link":"http://book.daum.net/detail/book.do?bookid=KOR9791158390136","barcode":"KOR9791158390136","etc_author":"","status_des":"정상판매","author":"김춘경","title":"<b>자바</b>스크립트+jQuery 완전정복 스터디. 2: jQuery편","category":"컴퓨터/IT ","translator":"","pub_nm":"위키북스","description":"『자바스크립트+jQuery 완전정복 스터디. 2: jQuery편』에서는 웹프로그래밍 초보자와 개발 실무자라면 반드시 알아야 할 jQuery 기초 문법과 노드, 스타일, 속성, 이벤트, 효과 등...","isbn":"1158390130","ebook_barcode":"","isbn13":"9791158390136","cover_l_url":"https://t1.search.daumcdn.net/thumb%2Fbook%2FKOR9788996094029%3Fmoddttm=20160825060444","list_price":"28000"},{"author_t":"임동혁","sale_price":"22500","cover_s_url":"http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FBOK00010566405IN%3Fmoddttm=20150529083918","sale_yn":"N","pub_date":"20100625","link":"http://book.daum.net/category/series.do?seriesID=BG52017017","barcode":"BG52017017","etc_author":"","status_des":"","author":"임동혁","title":"실무자를 위한 IT 전문서 IT HOLIC","category":"컴퓨터/IT ","translator":"","pub_nm":"북스홀릭","description":"","isbn":"8994393048","ebook_barcode":"","isbn13":"9788994393049","cover_l_url":"https://t1.search.daumcdn.net/thumb/R110x160/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FBOK00010566405IN%3Fmoddttm=20150529083918","list_price":"25000"}],"lastBuildDate":"Mon, 29 Aug 2016 11:15:54 +0900","link":"http://dna.daum.net/apis","generator":"Daum Open API"}}

역시 실전으로 들어오니 파싱 결과가 가차없이 길어진다. 이걸 원래 보기 쉽게 정리해보려고 했는데 너무 길어서 무리였다. 어차피 검색 결과만 다르고 형식은 같기 때문에 페이지에서 준 예제를 참고해서 파싱해보도록 한다

형식은 동일하다

예제 사진을 보면 channel이라는 가장 바깥고리 안에 result, totalCount등이 있고, JSONArray형태의 item이 있는것이 보인다. 우리가 필요한 것은 이 item이라는 JSON배열이고 내부에 author_t, sale_price,title이다.

우선 파싱하기 전 미리 어떻게 접근할 것인지 개요를 짜보면
"Channel"을 Object형태로 파싱 -> "item"을 Array 형태로 파싱->for문을 사용해 author_t, sale_price,title를 Object형태로 파싱한 뒤 출력
이렇게 된다.

이제 코드를 짜보자

public class Main { public static void main(String[] args) throws Exception { WebConnection wc = new WebConnection(); String json = wc.json; JSONParser parser = new JSONParser(); JSONObject obj = (JSONObject)parser.parse(json); JSONObject channel = (JSONObject)obj.get("channel"); JSONArray item = (JSONArray)channel.get("item"); for(int i=0;i<item.size();i++){ JSONObject tmp = (JSONObject)item.get(i); String title = (String)tmp.get("title"); String author = (String)tmp.get("author_t"); String price = (String)tmp.get("sale_price"); System.out.println("----- "+(i+1)+"번째 검색 결과 -----"); System.out.println("제목 : "+title); System.out.println("저자 : "+author); System.out.println("가격 : "+price+"원"); } } }

역시 언제나 parser를 먼저 선언 후 받아온 다음 아까 세운 개요에 맞춰 순서대로 파싱을 진행한다.
그런데 결과를 확인하면 이렇게 제목부분에 이상한 글자들이 포함되서 나온다.

이는 해당 검색 키워드를 포함하는 검색 결과를 보여주기 위한 코드로 *(애스터리스크)를 이용한 검색식이나 SQL에서 %이용한 LIKE검색식의 역할과 비슷하다고 보면 된다.
즉, 우리의 파싱결과 출력에는 필요 없는 문자이므로 예전에 배웠던 replace()를 이용하여 제거하도록 한다.

String title = ((String)tmp.get("title")).replace("&lt;b&gt;", "").replace("&lt;/b&gt;", "");

이제 이 내용들을 반영하여 코드를 완성시키면 아래와 같다.
코드 구성 : 

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.json.simple.JSONObject; import org.json.simple.JSONArray; import org.json.simple.parser.JSONParser; class WebConnection{ String json; WebConnection() throws Exception{ String address = "https://apis.daum.net/search/book?apikey=본인의API키&q=java&output=json"; BufferedReader br; URL url; HttpURLConnection conn; String protocol = "GET"; url = new URL(address); conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod(protocol); br = new BufferedReader(new InputStreamReader(conn.getInputStream())); json = br.readLine(); //System.out.println(json); } } public class Main { public static void main(String[] args) throws Exception { WebConnection wc = new WebConnection(); String json = wc.json; JSONParser parser = new JSONParser(); JSONObject obj = (JSONObject)parser.parse(json); JSONObject channel = (JSONObject)obj.get("channel"); JSONArray item = (JSONArray)channel.get("item"); for(int i=0;i<item.size();i++){ JSONObject tmp = (JSONObject)item.get(i); String title = ((String)tmp.get("title")).replace("&lt;b&gt;", "").replace("&lt;/b&gt;", ""); String author = (String)tmp.get("author_t"); String price = (String)tmp.get("sale_price"); System.out.println("----- "+(i+1)+"번째 검색 결과 -----"); System.out.println("제목 : "+title); System.out.println("저자 : "+author); System.out.println("가격 : "+price+"원"); } } }

출력 결과는 다음과 같이 정상적으로 나오는 것을 확인할 수 있다.


여기까지해서 API키를 이용하여 웹 JSON 파싱에 대해 알아보았다. 이전 과정을 잘 소화하였다면 그리 어렵지 않게 따라올 수 있었을 것이다. 여기서 검색 식을 Scanner를 이용하여 입력받는다던지 등의 다양한 응용이 가능하므로 이것저것 해서 다양한 기능들을 써보길 바란다.