[Java]네이버 지역 검색 API 적용하는 방법 정리
1. 네이버 검색 API란?
네이버 지역 검색 API는 네이버에 검색어를 보내주면
해당 검색어로 검색한 결과값을 아래와 같이 JSON이나 XML 형식으로 반환해주는 API이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Naver Open API - local ::'갈비집'</title>
<link>http://search.naver.com</link>
<description>Naver Search Result</description>
<lastBuildDate>Tue, 04 Oct 2016 13:10:58 +0900</lastBuildDate>
<total>407</total>
<start>1</start>
<display>10</display>
<item>
<title>조선옥</title>
<link />
<category>한식>육류,고기요리</category>
<description>연탄불 한우갈비 전문점.</description>
<telephone></telephone>
<address>서울특별시 중구 을지로3가 229-1 </address>
<roadAddress>서울특별시 중구 을지로15길 6-5 </roadAddress>
<mapx>311277</mapx>
<mapy>552097</mapy>
</item>
...
</channel>
</rss>
|
cs |
흔히 어떤 서비스를 만들다가 네이버의 결과 값을 가져와서
자신의 서비스에 뿌려주고 싶을 때 사용하게 되는데
그 중에 이번 포스팅에서는 지역 검색 API를 만들게 되서
그 방법에 대해 공유하려 한다.
참고로 소스코드는 Java의 SpringBoot로 작성되었다.
본인이 필요한 환경에 맞게 바꿔서 넣어주면 될 것 같다.
2. 오픈 API 신청하기
처음 네이버 API를 이용하려 하는 것이라면 자신의 서비스를 등록해줘야 한다.
아래 주소로 가서 자신의 서비스를 등록하고 오도록 하자.
https://developers.naver.com/apps/#/register?defaultScope=search
애플리케이션 - NAVER Developers
developers.naver.com
아래는 등록할 때 화면이다.
사용 API항목에서 검색을 누르고 환경을 자신의 서비스에 맞게 Web/Android/IOS 중에 고르면 된다.
애플리케이션 등록이 끝났다면 다음과 같은 화면이 나오게 되는데 여기서 ClientId와 Client Secret 키들을 복사 해놓도록 하자.
이 때 아래의 0/25000 이라 나와있는 것은 일일 사용량 제한이니 잘 보고 사용하도록 하자.
3. 네이버 코드 제작
나는 PlaceSearchService라는 서비스에서 네이버에 검색어에 대한 장소 데이터를 요청하고 받아오는 내용을 만들었다.
3.1 searchPlace 함수 제작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//naver place search api.
public void searchPlace(String keyword){
try {
keyword = URLEncoder.encode(keyword, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("encoding fail!",e);
}
String apiURL = "https://openapi.naver.com/v1/search/local.json?query="+keyword+"&display=20&start=1&sort=random"; // json 결과
//String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text; // xml 결과
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", "자신의 키값입력");
requestHeaders.put("X-Naver-Client-Secret", "Client Secret 값 입력");
String responseBody = get(apiURL,requestHeaders);
System.out.println("네이버에서 받은 결과 = " + responseBody);
System.out.println("-----------------------------------------");
return convertData(responseBody);
}
|
cs |
먼저 searchPlace함수에서 매개변수로 검색할 키워드를 받아온다.
여기서 키워드를 URLEncoding을 한번 하고 apiURL에 세팅을 해준다.
apiUrl에 키워드 뒤에 붙어있는 값들은 검색할 때 조건들인데
이 값들은 본인이 필요한 만큼 세팅을 해서 보내주면 된다.
(단, display로 결과값을 몇개까지 받을 지 설정하는 칸은 네이버 정책으로 인해 최대 5개까지로 바뀌었다고 한다)
참고로 나는 결과를 json으로 받고자 해서 url을 local.json 이렇게 썼는데
xml로 받고싶을 때는 저 부분을 수정하면 된다.
그리고 요청할 requestHeader에다 네이버에서 복사했던 아이디와 시크릿 키를 세팅해준다.
이후 Get 함수를 만들어 두고 Get함수를 요청해서 응답을 네이버에게서 받아오고
받은 결과를 원하는 대로 가공해서 쓰면 된다.
3.2. 요청을 보내고 받아올 get 함수 제작.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
private 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());
}
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();
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
|
private 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);
}
}
|
cs |
get과 connect 함수에서는 말 그대로 요청을 받아오고 받아오는 역할을 한다.
HttpURLConnection을 생성해서 Get방식으로 요청을 보내고
그 결과가 response코드가 200(정상)인지 체크해서 정상 반환해준다.
3.3 요청받은 Body를 읽는 readBody함수를 제작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
private 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);
}
}
|
cs |
get함수에서 받은 결과 값을 리턴해주는 함수인 readBody를 제작한다.
받은 값을 UTF8로 읽어서 BufferedReader로 값들을 읽어서 리턴해준다.
이렇게 하면 결과 값을 읽어서 네이버에서 받은 요청 결과 값을
최종적으로 String형태로 searchPlace에서 받아올 수 있다.
이 결과값을 gson등의 라이브러리를 통해
객체에 매핑하거나 하는 방법으로 데이터를 가져다 쓰면 될 것 같다.
아래 내용은 전체 소스코드이다.
필요하신 분은 가져다 쓰시면 될 것 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
@Service
public class PlaceSearchService {
private Gson gson;
@PostConstruct
private void setup()
{
gson=new Gson();
}
//naver place search api.
public List<SearchDTO> searchPlace(String keyword){
try {
keyword = URLEncoder.encode(keyword, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("encoding fail!",e);
}
String apiURL = "https://openapi.naver.com/v1/search/local.json?query="+keyword+"&display=20&start=1&sort=random"; // json 결과
//String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text; // xml 결과
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", "Client ID값 입력");
requestHeaders.put("X-Naver-Client-Secret", "Client Secret값 입력");
String responseBody = get(apiURL,requestHeaders);
System.out.println("네이버에서 받은 결과 = " + responseBody);
System.out.println("-----------------------------------------");
return convertData(responseBody);
}
private 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());
}
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 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 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);
}
}
}
|
cs |
'Language > Java' 카테고리의 다른 글
[JAVA]반복문 개념 정리 for, foreach,whlie, do-whlie문 사용법 및 예제 (0) | 2020.08.21 |
---|---|
[Java]네이버 번역 파파고 API 적용 및 예제 (0) | 2020.08.21 |
[Java]조건문 if 와 switch문 개념 정리 및 예제 (0) | 2020.08.17 |
[Java]특수문자와 서식 문자,소수점 제한 처리 정리 및 예제 (0) | 2020.08.15 |
[Java]배열과 메모리, 다차원 배열 개념 정리 및 예제 (0) | 2020.08.13 |