본문 바로가기

BE/Spring

[Spring] 네이버 API 데이터 연동 방법

트로 

최근, Spring 공부를 시작하며 네이버 영화 API를 받아 날씨에 따른 영화 추천 서비스를 웹으로 만들어보려 합니다.

본 글은 영화 API 데이터를 연동하여 처리하는 방법에 대해서만 나와있습니다. 

아래 네이버 Develops 사이트에 API에 대한 사용 방법이 자세히 나와있어 참고했습니다.

developers.naver.com/docs/search/blog/

 

검색 API 블로그 검색 개발가이드

NAVER Developers - 검색 API 블로그 검색 개발가이드

developers.naver.com

 

네이버 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

 

애플리케이션 - NAVER Developers

 

developers.naver.com

 

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 등

출처 : 네이버 API 개발 사이트

 

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());
}