[Spring] 네이버 API 데이터 연동 방법
인트로
최근, Spring 공부를 시작하며 네이버 영화 API를 받아 날씨에 따른 영화 추천 서비스를 웹으로 만들어보려 합니다.
본 글은 영화 API 데이터를 연동하여 처리하는 방법에 대해서만 나와있습니다.
아래 네이버 Develops 사이트에 API에 대한 사용 방법이 자세히 나와있어 참고했습니다.
developers.naver.com/docs/search/blog/
네이버 API 사용 방법
1. JSON 파싱 환경 세팅
[의존성 주입] JSON을 파싱하기 위해 pom.xml에 json 파싱 dependency를 추가합니다.
<dependency>
<!-- json 파싱 -->
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
2. 네이버 API 등록하기
API 이용을 위해 API 이용 신청을 합니다.
API 이용 신청 사이트
developers.naver.com/apps/#/register?defaultScope=search
3. 네이버 API와 연동
Spring의 코드 단에서 JSON형식으로 된 API 데이터를 받아옵니다.
String clientID = "write your clinetID";
String clientSecret = "write your clinetSecret";
String text = null;
try {
text = URLEncoder.encode(" 검색어 ", "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패", e);
}
String apiURL = "https://openapi.naver.com/v1/search/movie?query=" + text;
4. API데이터로부터 얻은 JSON을 파싱하기
json이란? JavaScript Object Notation 으로 데이터를 주고 받을 때 사용하는 포맷 중 하나입니다.
Spring환경에서는 JSONParser 라이브러리를 통해 데이터를 파싱할 수 있습니다.
JsonParse로 파싱한 데이터를 JSONObject 로 변환하여 사용합니다.
String responseBody = get(apiURL, requestHeaders);
String json = responseBody;
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject)parser.parse(json);
JSONArray item = (JSONArray)obj.get("items");
5. 파싱한 데이터를 정의한 클래스 객체를 통해 리스트로 담기
영화 API 데이터를 미리 정의한 Movie 객체(title, image, description, link 정보) 에 담아 ArrayList 에 추가합니다.
List < Movie > list = null;
list = new ArrayList<Movie>();
for (int i = 0; i < item.size(); i ++) {
Movie m = new Movie();
JSONObject tmp = (JSONObject)item.get(i);
String title = (String)tmp.get("title");
String image = (String)tmp.get("image");
String description = (String)tmp.get("description");
String link = (String)tmp.get("link");
String subtitle = (String)tmp.get("subtitle");
m.setTitle(title);
m.setImage(image);
m.setDescription(description);
m.setLink(link);
m.setSubtitle(subtitle);
if (m != null) list.add(m);
}
for (Movie movie : list) {
System.out.println(movie.getTitle());
}
Movie 클래스의 데이터에 대하여 API 데이터가 다음과 같은 인덱스를 가지고 있으므로, 이에 따라 데이터를 객체에 담는 것이 필요합니다. 필드: title, link, image, subtitle, pubDate 등
5. 전체 코드
String clientID = "write your clinetID";
String clientSecret = "write your clinetSecret";
String text = null;
try {
text = URLEncoder.encode(" 검색어 ", "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패", e);
}
String apiURL = "https://openapi.naver.com/v1/search/movie?query=" + text;
Map < String,String > requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", clientID);
requestHeaders.put("X-Naver-Client-Secret", clientSecret);
String responseBody = get(apiURL, requestHeaders);
String json = responseBody;
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject)parser.parse(json);
JSONArray item = (JSONArray)obj.get("items");
List < Movie > list = null;
list = new ArrayList<Movie>();
for (int i = 0; i < item.size(); i ++) {
Movie m = new Movie();
JSONObject tmp = (JSONObject)item.get(i);
String title = (String)tmp.get("title");
String image = (String)tmp.get("image");
String description = (String)tmp.get("description");
String link = (String)tmp.get("link");
String subtitle = (String)tmp.get("subtitle");
m.setTitle(title);
m.setImage(image);
m.setDescription(description);
m.setLink(link);
m.setSubtitle(subtitle);
if (m != null) list.add(m);
}
for (Movie movie : list) {
System.out.println(movie.getTitle());
}