[Open API] 네이버 Open API 사용하기

Jungwook·2023년 8월 15일

Open API

목록 보기
1/3

네이버 Open API 사용법

네이버 Open API를 사용하기 위해서는 네이버 개발자 센터에서 애플리케이션 등록을 해준다.

애플리케이션 이름과 사용 API를 선택하고 등록하기 클릭

등록하기 완료 후 내 애플리케이션에 가면 Client ID와 Client Secret가 생성된 것을 확인할 수 있다.

내 애플리케이션에서 사용API를 추가하거나 제거할 수 있다.
사용하고자 하는 Open API를 추가해준다.

네이버 오픈 API 목록을 보면 네이버에서 제공하는 다양한 Open API목록을 볼 수 있다.

검색 > 뉴스 API 사용해보기

네이버 검색 API를 사용해보자.
검색 API 중에서도 뉴스 검색 결과 조회를 해볼 것이다.

요청 URL에 따라 XML, JSON 형식으로 데이터를 반환받을 수 있다.


네이버 개발자 센터에 API별로 언어별 사용 예제가 있다. 이것을 참고해도 된다.

네이버 뉴스에서 '뉴진스'가 들어간 뉴스를 검색하고 이 결과를 JSON형태로 반환받아보자.

package com.example.openAPI;

// 네이버 개발자 센터에서 검색기능을 구현 

// 1.네이버 개발자 센터 회원가입
// 2. 어플리케이션 등록 
// Client ID :  
// Client Secret :   
// 3. 파일 우클릭 Run AS - Java application 
// 4. Console창에 결과 가로로 출력될 경우 복사 후 vscode가서 코드정렬 

// 네이버 검색 API 예제 - 블로그 검색
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.boot.jackson.JsonObjectDeserializer;

public class ApiExamSearchBlog {

	public static void main(String[] args) {
		String clientId = "애플리케이션 클라이언트 아이디"; // 애플리케이션 클라이언트 아이디
		String clientSecret = "애플리케이션 클라이언트 시크릿"; // 애플리케이션 클라이언트 시크릿

		//검색어
		String text = null;
		try {
			
			//검색어를 url 뒤에 붙여서 보낼 때 인코딩 
			text = URLEncoder.encode("뉴진스", "UTF-8");
			
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("검색어 인코딩 실패", e);
		}

		String apiURL = "https://openapi.naver.com/v1/search/news?query=" + text; // JSON 결과
		// String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text;  // XML 결과

		// 요청하기 전에 어떤 id로 접속할 지 헤더파일을 만들어서 저장한다. 
		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);

		//검색한 내용을 출력한다. 
		System.out.println(responseBody);
		
		//json 파싱
		//json-simple-1.1.1.jar필요 
		//JsonObject map형식으로 데이터가 감싸져 있을 경우 {}
		//JsonArray 배열 형식으로 데이터가 감싸져 있을 경우 [] 
		
		//가장 큰 JSONObject를 가져옵니다. 
		JSONObject jObject = new JSONObject(responseBody); 
		
		// 배열을 가져옴
		JSONArray jArray = jObject.getJSONArray("items");
		
		System.out.println(jArray);
		
		// 배열의 모든 아이템을 출력합니다. 
		// 반복문을 이용해서 for each문 작성
		// 반복문을 이용해서 인덱스 번호를 작성! 
		JSONObject obj = jArray.getJSONObject(0); 
		
		String title = obj.getString("title");
		String originallink = obj.getString("originallink");
		String link = obj.getString("link");
		String description = obj.getString("description");
		
		System.out.println("title:" + title);
		System.out.println("originallink:" + originallink);
		System.out.println("link:" + link);
		System.out.println("description:" + description);
	}

	private static String get(String apiUrl, Map<String, String> requestHeaders) {
		HttpURLConnection con = connect(apiUrl);
		try {
			con.setRequestMethod("GET"); // 전송방식을 설정하는 메서드 
			for (Map.Entry<String, String> header : requestHeaders.entrySet()) {
				con.setRequestProperty(header.getKey(), header.getValue());
			}

			//응답. 실제 전송이 잘 되어서 응답이 온다면 응답코드 200 
			int responseCode = con.getResponseCode();
			if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
				return readBody(con.getInputStream());
			} else { // 오류 발생
				return readBody(con.getErrorStream());
			}
		} catch (IOException e) {
			throw new RuntimeException("API 요청과 응답 실패", e);
		} finally {
			con.disconnect();
		}
	}

	private static HttpURLConnection connect(String apiUrl) {
		try {
			URL url = new URL(apiUrl);
			return (HttpURLConnection) url.openConnection();
		} catch (MalformedURLException e) {
			throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
		} catch (IOException e) {
			throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
		}
	}

	private static String readBody(InputStream body) {
		InputStreamReader streamReader = new InputStreamReader(body);

		try (BufferedReader lineReader = new BufferedReader(streamReader)) {
			//String str = "hello"
			//String str2 = "hello world" 불변
			
			//StringBuilder 변경가능한 객체. 한번 만들어놓으면 추가하거나 삭제하거나 수정이 가능하다. 
			// 응답받은 내용을 꺼내서 저장하기 위한 변수 
			StringBuilder responseBody = new StringBuilder();

			String line;
			while ((line = lineReader.readLine()) != null) {
				responseBody.append(line);
			}

			return responseBody.toString();
		} catch (IOException e) {
			throw new RuntimeException("API 응답을 읽는 데 실패했습니다.", e);
		}
	}
}

코드 작성 후 실행 시 콘솔창에 결과가 반환된 것을 확인할 수 있다.

하지만 이렇게 보면 가독성이 떨어지기 때문에 VS코드에 코드를 붙여넣고 코드정렬을 시켜주면 보다 정렬된 형태의 결과를 볼 수 있다.

검색 > 지식iN API 사용해보기

이번에는 지식iN의 검색 결과를 반환받아 보자.

마찬가지로 반환 형식은 XML, JSON으로 반환받을 수 있다.

네이버 지식iN에 '나들이' 가 포함된 지식iN 검색 결과를 반환받아 보자.

package com.example.openAPI;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;

// 네이버 지식in API 예제
public class NaverKnowledgeiNAPI {
	public static void main(String[] args) {
		String clientId = "애플리케이션 클라이언트 아이디"; // 애플리케이션 클라이언트 아이디
		String clientSecret = "애플리케이션 클라이언트 시크릿"; // 애플리케이션 클라이언트 시크릿

		// 검색어
		String text = null;
		try {

			// 검색어를 url 뒤에 붙여서 보낼 때 인코딩
			text = URLEncoder.encode("나들이", "UTF-8");

		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("검색어 인코딩 실패", e);
		}

		String apiURL = "https://openapi.naver.com/v1/search/kin?query=" + text; // JSON 결과
		// String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text;  // XML 결과

		// 요청하기 전에 어떤 id로 접속할 지 헤더파일을 만들어서 저장한다.
		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);

		// 검색한 내용을 출력한다.
		System.out.println(responseBody);

		// json 파싱
		// json-simple-1.1.1.jar필요
		// JsonObject map형식으로 데이터가 감싸져 있을 경우 {}
		// JsonArray 배열 형식으로 데이터가 감싸져 있을 경우 []

		// 가장 큰 JSONObject를 가져옵니다.
		JSONObject jObject = new JSONObject(responseBody);

		// 배열을 가져옴
		JSONArray jArray = jObject.getJSONArray("items");

		System.out.println(jArray);

		// 배열의 모든 아이템을 출력합니다.
		// 반복문을 이용해서 for each문 작성
		// 반복문을 이용해서 인덱스 번호를 작성!
		JSONObject obj = jArray.getJSONObject(0);

		String title = obj.getString("title");
		String description = obj.getString("description");

		System.out.println("title:" + title);
		System.out.println("description" + description);

	}

	private static String get(String apiUrl, Map<String, String> requestHeaders) {
		HttpURLConnection con = connect(apiUrl);
		try {
			con.setRequestMethod("GET"); // 전송방식을 설정하는 메서드
			for (Map.Entry<String, String> header : requestHeaders.entrySet()) {
				con.setRequestProperty(header.getKey(), header.getValue());
			}

			// 응답. 실제 전송이 잘 되어서 응답이 온다면 응답코드 200
			int responseCode = con.getResponseCode();
			if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
				return readBody(con.getInputStream());
			} else { // 오류 발생
				return readBody(con.getErrorStream());
			}
		} catch (IOException e) {
			throw new RuntimeException("API 요청과 응답 실패", e);
		} finally {
			con.disconnect();
		}
	}

	private static HttpURLConnection connect(String apiUrl) {
		try {
			URL url = new URL(apiUrl);
			return (HttpURLConnection) url.openConnection();
		} catch (MalformedURLException e) {
			throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
		} catch (IOException e) {
			throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
		}
	}

	private static String readBody(InputStream body) {
		InputStreamReader streamReader = new InputStreamReader(body);

		try (BufferedReader lineReader = new BufferedReader(streamReader)) {
			// String str = "hello"
			// String str2 = "hello world" 불변

			// StringBuilder 변경가능한 객체. 한번 만들어놓으면 추가하거나 삭제하거나 수정이 가능하다.
			// 응답받은 내용을 꺼내서 저장하기 위한 변수
			StringBuilder responseBody = new StringBuilder();

			String line;
			while ((line = lineReader.readLine()) != null) {
				responseBody.append(line);
			}

			return responseBody.toString();
		} catch (IOException e) {
			throw new RuntimeException("API 응답을 읽는 데 실패했습니다.", e);
		}
	}

}

결과(JSON)

{
    "lastBuildDate": "Tue, 15 Aug 2023 21:36:13 +0900",
    "total": 90541,
    "start": 1,
    "display": 10,
    "items": [
        {
            "title": "봄<b>나들이<\/b> 갈만한 곳 해주세요",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=9&dirId=90111&docId=442800004&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=1&search_sort=0&spq=0",
            "description": "... 봄<b>나들이<\/b> 가고 싶은데 봄<b>나들이<\/b> 갈만한 곳 추천 부탁드려요 ㅎㅎ  안녕하세요. 질문하신 [봄<b>나들이<\/b> 갈만한곳] 관련... 그 다음으로 갈만한 봄<b>나들이<\/b> 여행지를 찾고 계시나 보네요~ 봄<b>나들이<\/b> 갈만한곳 중에서는 여수 영취산, 응봉산... "
        },
        {
            "title": "서울 <b>나들이<\/b>ㅎㅎ",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=9&dirId=90106&docId=203025108&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=2&search_sort=0&spq=0",
            "description": "방학 맞아서 <b>나들이<\/b> 가구 싶은대요~ 인사동 쌈지길. 북촌... 연극까지 <b>나들이<\/b> 코스로 딱입니다! 대학로에 있는 맛집... 빠질 수 없는 연극인데요 &gt;_&lt; 제가 <b>나들이<\/b>하면서 보기 좋은... 인기죠 &gt;_&lt; <b>나들이<\/b>하실 때 꼭 한 번 관람하시기를... "
        },
        {
            "title": "임영웅 봄<b>나들이<\/b> 콜라주",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=3&dirId=3120101&docId=444171248&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=3&search_sort=0&spq=0",
            "description": "임영웅 시축 겸 봄<b>나들이<\/b> 멋진 모습의 콜라주 있음 부탁드려도 되나요 임영웅 가수의 상암월드컵경기장 시축과 공연 관련 봄<b>나들이<\/b> 콜라주 사진 올려드릴께요. 봄이 가기전에 다시 봄<b>나들이<\/b> 가고싶네요~~ "
        },
        {
            "title": "<b>나들이<\/b>옷 어근 접사 질문",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=11&dirId=11080103&docId=445030483&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=4&search_sort=0&spq=0",
            "description": "<b>나들이<\/b>옷 [(나다의 나+들다의 들)+이]+옷 어근 어근 접사 어근 -&gt; 합성어 라는데... 접사+어근, 어근+어근 이런 애들만 하다가 보니 모르겠어요 <b>나들이<\/b>옷... 그래서 최종적으로 &apos;<b>나들이<\/b>옷&apos;이 합성된 것만 설명을 드리겠습니다. <b>나들이<\/b>(명사... "
        },
        {
            "title": "임영웅 축구장 봄<b>나들이<\/b>",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=8&dirId=80603&docId=444156045&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=5&search_sort=0&spq=0",
            "description": "임영웅 축구장 봄<b>나들이<\/b> 비하인드 영상 있나요? 임영웅 공식유튜브채널에 영웅이랑 봄<b>나들이<\/b> 라는 제목의 축구시축 비하인드 스토리가 업로드 되어 있습니다 링크 드릴게요~ https:\/\/youtu.be\/1TGshLZ-zSI "
        },
        {
            "title": "서울 <b>나들이<\/b> 추천",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=12&dirId=120128&docId=451464484&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=6&search_sort=0&spq=0",
            "description": "... 원래의 제 성격상 서울의 문화적 인프라 자원(?)이랄까요 그런 곳을 돌아다니고 구경하는 것을 즐기지 않지만 이제 내려가면 아마 서울에 올 일이 거의 없지 않을까 싶어서 주말에 서울 <b>나들이<\/b>를 해보려구 합니다. 서울에 꼭 가보면... "
        },
        {
            "title": "남자 둘이서 서울 <b>나들이<\/b>",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=9&dirId=901&docId=450781468&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=7&search_sort=0&spq=0",
            "description": "남자 불이서 서울 <b>나들이<\/b> 할만한곳 추천좀요  서울은 다양한 놀거리와 관광명소가 많이 있어서 선택하기 어려울 정도로 다양합니다. 몇 가지 추천해드리겠습니다. ▶경복궁: 한국의 대표적인 궁궐로, 아름다운... "
        },
        {
            "title": "중학생 딸이랑 서울 <b>나들이<\/b> 전시 체험",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=12&dirId=1201&docId=443565149&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=8&search_sort=0&spq=0",
            "description": "주말에 딸이랑 1박 2일 서울 <b>나들이<\/b> 하기로 했는데요 ^^ 경복궁, 박물관... 중학생 따님 분과 서울 <b>나들이<\/b>를 오시는군요~! 주말에 어머님과 바람 쐬며... 도움이 되셨길 바랍니다. 따님 분과 즐거운 <b>나들이<\/b> 되시길 바라요~"
        },
        {
            "title": "<b>나들이<\/b>갈 때 간식(센스 있다고 할만한)",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=5&dirId=505&docId=442230158&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=9&search_sort=0&spq=0",
            "description": "날도 따뜻해져서 <b>나들이<\/b> 가려고 합니다. 여러 명이서 <b>나들이<\/b> 가서 먹기 좋은 간식이 뭐가 있을까요? 준비해갔을 때... <b>나들이<\/b> 간식으로 요즘 제철이라 인기 터지는 대저 달짝이토마토 추천! 즐거운 <b>나들이<\/b> 되시길 바라요~! 요 아래는 제가... "
        },
        {
            "title": "봄여행을 가려고하는데, 봄<b>나들이<\/b> 갈만한 장소 추천좀... ",
            "link": "https:\/\/kin.naver.com\/qna\/detail.naver?d1id=8&dirId=8&docId=128428714&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=10&search_sort=0&spq=0",
            "description": "이번에 봄여행을 가려고하는데, 봄<b>나들이<\/b> 갈만한 장소... 혹시 서울근교에 갈만한 봄<b>나들이<\/b>장소나 봄여행지... 봄<b>나들이<\/b>장소추천 완전 부탁드릴께요 서울에서 1~2시간... 혹시 꽃 향기로 가득한 봄<b>나들이<\/b> 어디 갈지 찾고 계신가요?... "
        }
    ]
}
[
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=9&dirId=90111&docId=442800004&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=1&search_sort=0&spq=0",
        "description": "... 봄<b>나들이<\/b> 가고 싶은데 봄<b>나들이<\/b> 갈만한 곳 추천 부탁드려요 ㅎㅎ  안녕하세요. 질문하신 [봄<b>나들이<\/b> 갈만한곳] 관련... 그 다음으로 갈만한 봄<b>나들이<\/b> 여행지를 찾고 계시나 보네요~ 봄<b>나들이<\/b> 갈만한곳 중에서는 여수 영취산, 응봉산... ",
        "title": "봄<b>나들이<\/b> 갈만한 곳 해주세요"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=9&dirId=90106&docId=203025108&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=2&search_sort=0&spq=0",
        "description": "방학 맞아서 <b>나들이<\/b> 가구 싶은대요~ 인사동 쌈지길. 북촌... 연극까지 <b>나들이<\/b> 코스로 딱입니다! 대학로에 있는 맛집... 빠질 수 없는 연극인데요 &gt;_&lt; 제가 <b>나들이<\/b>하면서 보기 좋은... 인기죠 &gt;_&lt; <b>나들이<\/b>하실 때 꼭 한 번 관람하시기를... ",
        "title": "서울 <b>나들이<\/b>ㅎㅎ"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=3&dirId=3120101&docId=444171248&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=3&search_sort=0&spq=0",
        "description": "임영웅 시축 겸 봄<b>나들이<\/b> 멋진 모습의 콜라주 있음 부탁드려도 되나요 임영웅 가수의 상암월드컵경기장 시축과 공연 관련 봄<b>나들이<\/b> 콜라주 사진 올려드릴께요. 봄이 가기전에 다시 봄<b>나들이<\/b> 가고싶네요~~ ",
        "title": "임영웅 봄<b>나들이<\/b> 콜라주"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=11&dirId=11080103&docId=445030483&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=4&search_sort=0&spq=0",
        "description": "<b>나들이<\/b>옷 [(나다의 나+들다의 들)+이]+옷 어근 어근 접사 어근 -&gt; 합성어 라는데... 접사+어근, 어근+어근 이런 애들만 하다가 보니 모르겠어요 <b>나들이<\/b>옷... 그래서 최종적으로 &apos;<b>나들이<\/b>옷&apos;이 합성된 것만 설명을 드리겠습니다. <b>나들이<\/b>(명사... ",
        "title": "<b>나들이<\/b>옷 어근 접사 질문"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=8&dirId=80603&docId=444156045&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=5&search_sort=0&spq=0",
        "description": "임영웅 축구장 봄<b>나들이<\/b> 비하인드 영상 있나요? 임영웅 공식유튜브채널에 영웅이랑 봄<b>나들이<\/b> 라는 제목의 축구시축 비하인드 스토리가 업로드 되어 있습니다 링크 드릴게요~ https://youtu.be/1TGshLZ-zSI ",
        "title": "임영웅 축구장 봄<b>나들이<\/b>"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=12&dirId=120128&docId=451464484&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=6&search_sort=0&spq=0",
        "description": "... 원래의 제 성격상 서울의 문화적 인프라 자원(?)이랄까요 그런 곳을 돌아다니고 구경하는 것을 즐기지 않지만 이제 내려가면 아마 서울에 올 일이 거의 없지 않을까 싶어서 주말에 서울 <b>나들이<\/b>를 해보려구 합니다. 서울에 꼭 가보면... ",
        "title": "서울 <b>나들이<\/b> 추천"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=9&dirId=901&docId=450781468&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=7&search_sort=0&spq=0",
        "description": "남자 불이서 서울 <b>나들이<\/b> 할만한곳 추천좀요  서울은 다양한 놀거리와 관광명소가 많이 있어서 선택하기 어려울 정도로 다양합니다. 몇 가지 추천해드리겠습니다. ▶경복궁: 한국의 대표적인 궁궐로, 아름다운... ",
        "title": "남자 둘이서 서울 <b>나들이<\/b>"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=12&dirId=1201&docId=443565149&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=8&search_sort=0&spq=0",
        "description": "주말에 딸이랑 1박 2일 서울 <b>나들이<\/b> 하기로 했는데요 ^^ 경복궁, 박물관... 중학생 따님 분과 서울 <b>나들이<\/b>를 오시는군요~! 주말에 어머님과 바람 쐬며... 도움이 되셨길 바랍니다. 따님 분과 즐거운 <b>나들이<\/b> 되시길 바라요~",
        "title": "중학생 딸이랑 서울 <b>나들이<\/b> 전시 체험"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=5&dirId=505&docId=442230158&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=9&search_sort=0&spq=0",
        "description": "날도 따뜻해져서 <b>나들이<\/b> 가려고 합니다. 여러 명이서 <b>나들이<\/b> 가서 먹기 좋은 간식이 뭐가 있을까요? 준비해갔을 때... <b>나들이<\/b> 간식으로 요즘 제철이라 인기 터지는 대저 달짝이토마토 추천! 즐거운 <b>나들이<\/b> 되시길 바라요~! 요 아래는 제가... ",
        "title": "<b>나들이<\/b>갈 때 간식(센스 있다고 할만한)"
    },
    {
        "link": "https://kin.naver.com/qna/detail.naver?d1id=8&dirId=8&docId=128428714&qb=64KY65Ok7J20&enc=utf8&section=kin.qna&rank=10&search_sort=0&spq=0",
        "description": "이번에 봄여행을 가려고하는데, 봄<b>나들이<\/b> 갈만한 장소... 혹시 서울근교에 갈만한 봄<b>나들이<\/b>장소나 봄여행지... 봄<b>나들이<\/b>장소추천 완전 부탁드릴께요 서울에서 1~2시간... 혹시 꽃 향기로 가득한 봄<b>나들이<\/b> 어디 갈지 찾고 계신가요?... ",
        "title": "봄여행을 가려고하는데, 봄<b>나들이<\/b> 갈만한 장소 추천좀... "
    }
]
title:봄<b>나들이</b> 갈만한 곳 해주세요
description... 봄<b>나들이</b> 가고 싶은데 봄<b>나들이</b> 갈만한 곳 추천 부탁드려요 ㅎㅎ  안녕하세요. 질문하신 [봄<b>나들이</b> 갈만한곳
] 관련... 그 다음으로 갈만한 봄<b>나들이</b> 여행지를 찾고 계시나 보네요~ 봄<b>나들이</b> 갈만한곳 중에서는 여수 영취산, 응봉산... 

네이버 쇼핑인사이트 API 사용해보기

네이버 쇼핑 데이터를 API를 이용하여 반환받기

패션의류, 여가/생활편의, 화장품/미용의 데이터를 JSON형식으로 반환받아 보자.

package com.example.openAPI;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;

// 네이버 쇼핑인사이트 API 예제 
public class NaverShoppinInsightAPI {

	public static void main(String[] args) {
		String clientId = "애플리케이션 클라이언트 아이디"; // 애플리케이션 클라이언트 아이디
		String clientSecret = "애플리케이션 클라이언트 시크릿"; // 애플리케이션 클라이언트 시크릿

		String apiUrl = "https://openapi.naver.com/v1/datalab/shopping/categories";

		Map<String, String> requestHeaders = new HashMap<>();
		requestHeaders.put("X-Naver-Client-Id", clientId);
		requestHeaders.put("X-Naver-Client-Secret", clientSecret);
		requestHeaders.put("Content-Type", "application/json");

		String requestBody = "{\"startDate\":\"2017-08-01\"," + "\"endDate\":\"2017-09-30\","
				+ "\"timeUnit\":\"month\"," + "\"category\":[{\"name\":\"패션의류\",\"param\":[\"50000000\"]},"
				+ "{\"name\":\"여가/생활편의\",\"param\":[\"50000009\"]}," +
				// "{\"name\":\"출산/육아\",\"param\":[\"50000005\"]}," +
				"{\"name\":\"화장품/미용\",\"param\":[\"50000002\"]}]," +

				"\"device\":\"pc\"," + "\"ages\":[\"20\",\"30\"]," + "\"gender\":\"f\"}";

		String responseBody = post(apiUrl, requestHeaders, requestBody);
		System.out.println(responseBody);

		// json 데이터 파싱

		JSONObject jObject = new JSONObject(responseBody);

		JSONArray resultsArray = jObject.getJSONArray("results");

		for (int i = 0; i < resultsArray.length(); i++) {
			JSONObject resultObject = resultsArray.getJSONObject(i);

			String title = resultObject.getString("title");
			JSONArray categoryArray = resultObject.getJSONArray("category");
			JSONArray dataArray = resultObject.getJSONArray("data");

			System.out.println("Title: " + title);

			// Category는 배열로 주어져 있으므로 JSONArray에서 값을 가져와 처리합니다.
			for (int j = 0; j < categoryArray.length(); j++) {
				String category = categoryArray.getString(j);
				System.out.println("Category: " + category);
			}

			// Data 역시 배열로 주어져 있으므로 JSONArray에서 값을 가져와 처리합니다.
			for (int k = 0; k < dataArray.length(); k++) {
				JSONObject dataObject = dataArray.getJSONObject(k);
				String period = dataObject.getString("period");
				double ratio = dataObject.getDouble("ratio");
				System.out.println("Period: " + period + ", Ratio: " + ratio);
			}
		}

	}

	private static String post(String apiUrl, Map<String, String> requestHeaders, String requestBody) {
		HttpURLConnection con = connect(apiUrl);

		try {
			con.setRequestMethod("POST");
			for (Map.Entry<String, String> header : requestHeaders.entrySet()) {
				con.setRequestProperty(header.getKey(), header.getValue());
			}

			con.setDoOutput(true);
			try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
				wr.write(requestBody.getBytes());
				wr.flush();
			}

			int responseCode = con.getResponseCode();
			if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 응답
				return readBody(con.getInputStream());
			} else { // 에러 응답
				return readBody(con.getErrorStream());
			}
		} catch (IOException e) {
			throw new RuntimeException("API 요청과 응답 실패", e);
		} finally {
			con.disconnect(); // Connection을 재활용할 필요가 없는 프로세스일 경우
		}
	}

	private static HttpURLConnection connect(String apiUrl) {
		try {
			URL url = new URL(apiUrl);
			return (HttpURLConnection) url.openConnection();
		} catch (MalformedURLException e) {
			throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
		} catch (IOException e) {
			throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
		}
	}

	private static String readBody(InputStream body) {
		InputStreamReader streamReader = new InputStreamReader(body, StandardCharsets.UTF_8);

		try (BufferedReader lineReader = new BufferedReader(streamReader)) {
			StringBuilder responseBody = new StringBuilder();

			String line;
			while ((line = lineReader.readLine()) != null) {
				responseBody.append(line);
			}

			return responseBody.toString();
		} catch (IOException e) {
			throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
		}
	}

}
{"startDate":"2017-08-01","endDate":"2017-09-30","timeUnit":"month","results":[{"title":"패션의류","category":["50000000"],"data":[{"period":"2017-08-01","ratio":84.01252},{"period":"2017-09-01","ratio":100}]},{"title":"여가/생활편의","category":["50000009"],"data":[{"period":"2017-08-01","ratio":16.57204},{"period":"2017-09-01","ratio":13.78843}]},{"title":"화장품/미용","category":["50000002"],"data":[{"period":"2017-08-01","ratio":22.21162},{"period":"2017-09-01","ratio":21.54278}]}]}
Title: 패션의류
Category: 50000000
Period: 2017-08-01, Ratio: 84.01252
Period: 2017-09-01, Ratio: 100.0
Title: 여가/생활편의
Category: 50000009
Period: 2017-08-01, Ratio: 16.57204
Period: 2017-09-01, Ratio: 13.78843
Title: 화장품/미용
Category: 50000002
Period: 2017-08-01, Ratio: 22.21162
Period: 2017-09-01, Ratio: 21.54278

네이버 Papago API 사용해보기

네이버 파파고 API를 이용해서 번역해보기.

package com.example.openAPI;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;


// 네이버 파파고API 예제 
public class PapagoAPI {
	
	 public static void main(String[] args) {
	        String clientId = "애플리케이션 클라이언트 아이디값";";//애플리케이션 클라이언트 아이디값";
	        String clientSecret = "애플리케이션 클라이언트 시크릿값";//애플리케이션 클라이언트 시크릿값";

	        String apiURL = "https://openapi.naver.com/v1/papago/n2mt";
	        String text;
	        try {
	            text = URLEncoder.encode("안녕하세요. 오늘 기분은 어떻습니까?", "UTF-8");
	        } catch (UnsupportedEncodingException e) {
	            throw new RuntimeException("인코딩 실패", e);
	        }

	        Map<String, String> requestHeaders = new HashMap<>();
	        requestHeaders.put("X-Naver-Client-Id", clientId);
	        requestHeaders.put("X-Naver-Client-Secret", clientSecret);

	        String responseBody = post(apiURL, requestHeaders, text);

	        System.out.println(responseBody);
	        
	        // json 데이터 파싱 
	        
	        JSONObject jObject = new JSONObject(responseBody);

	        // "message" 필드에서 "result" 객체 가져오기
	        JSONObject resultObject = jObject.getJSONObject("message").getJSONObject("result");

	        String srcLangType = resultObject.getString("srcLangType");
	        String tarLangType = resultObject.getString("tarLangType");
	        String translatedText = resultObject.getString("translatedText");
	        String engineType = resultObject.getString("engineType");

			
	        System.out.println("srcLangType: " + srcLangType);
	        System.out.println("tarLangType: " + tarLangType);
	        System.out.println("translatedText: " + translatedText);
	        System.out.println("engineType: " + engineType);
			
			
			
	        
	    }

	    private static String post(String apiUrl, Map<String, String> requestHeaders, String text){
	        HttpURLConnection con = connect(apiUrl);
	        String postParams = "source=ko&target=en&text=" + text; //원본언어: 한국어 (ko) -> 목적언어: 영어 (en)
	        try {
	            con.setRequestMethod("POST");
	            for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
	                con.setRequestProperty(header.getKey(), header.getValue());
	            }

	            con.setDoOutput(true);
	            try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
	                wr.write(postParams.getBytes());
	                wr.flush();
	            }

	            int responseCode = con.getResponseCode();
	            if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 응답
	                return readBody(con.getInputStream());
	            } else {  // 에러 응답
	                return readBody(con.getErrorStream());
	            }
	        } catch (IOException e) {
	            throw new RuntimeException("API 요청과 응답 실패", e);
	        } finally {
	            con.disconnect();
	        }
	    }

	    private static HttpURLConnection connect(String apiUrl){
	        try {
	            URL url = new URL(apiUrl);
	            return (HttpURLConnection)url.openConnection();
	        } catch (MalformedURLException e) {
	            throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
	        } catch (IOException e) {
	            throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
	        }
	    }

	    private static String readBody(InputStream body){
	        InputStreamReader streamReader = new InputStreamReader(body);

	        try (BufferedReader lineReader = new BufferedReader(streamReader)) {
	            StringBuilder responseBody = new StringBuilder();

	            String line;
	            while ((line = lineReader.readLine()) != null) {
	                responseBody.append(line);
	            }

	            return responseBody.toString();
	        } catch (IOException e) {
	            throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
	        }
	    }

}

"안녕하세요. 오늘 기분은 어떻습니까?" 로 적었던 한글(ko) 가
"Hello. How are you today?" 영어(en)으로 번역된 것을 확인할 수 있다.

{"message":{"result":{"srcLangType":"ko","tarLangType":"en","translatedText":"Hello. How are you today?","engineType":"N2MT"},"@type":"response","@service":"naverservice.nmt.proxy","@version":"1.0.0"}}
srcLangType: ko
tarLangType: en
translatedText: Hello. How are you today?
engineType: N2MT

위의 예제 코드에서 String postParams 부분을 수정해 주면 다른 언어로도 변역이 가능하다.

String postParams = "source=ko&target=en&text=" + text; //원본언어: 한국어 (ko) -> 목적언어: 영어 (en)

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기