Naver Open API 검색 활용, 맛집 서비스

네이버 Open API 를 활용해서 맛집 검색을 해 보는 예제

사용할 API

[네이버 오픈 API 목록]
(https://developers.naver.com/products/intro/plan/plan.md)

이중에 검색 API 을 사용 하면 네이버 블로그, 이미지, 웹, 뉴스, 백과사전, 책, 카페, 지식iN 등 검색 할수 있음

[비로그인 방식 API 이고 호출 예제]
(https://developers.naver.com/docs/common/openapiguide/apicall.md#%EB%B9%84%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EB%B0%A9%EC%8B%9D-%EC%98%A4%ED%94%88-api-%ED%98%B8%EC%B6%9C-%EC%98%88)

[검색 > 지역]
(https://developers.naver.com/docs/serviceapi/search/local/local.md#%EC%A7%80%EC%97%AD)

Talend 사용 해서 API 호출 해보기

검색 값을 UTF8 해야 한다. [변환 해주는 사이트] (https://meyerweb.com/eric/tools/dencoder/)

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>한식&gt;육류,고기요리</category>
<description>연탄불 한우갈비 전문점.</description>
<telephone></telephone>
<address>서울특별시 중구 을지로3가 229-1 </address>
<roadAddress>서울특별시 중구 을지로15길 6-5 </roadAddress>
<mapx>311277</mapx>
<mapy>552097</mapy>
</item>
...
</channel>
</rss>

Java 에서 해보기

강사님 코드가 제공 되어 가져와서 빌드 하니 잘 동작 한다.
강사님 코드를 참고 해서 코딩을 해보니 API 호출 시 응답은 200으로 잘 오는데 맛집 정보는 item = 0 으로 온다.
이리저리 고쳐봐고 다르게 코딩을 해 보도 동일한다. 검색어를 영어로 해보니 정보가 담아져서 온다.

아래는 강사님 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        var uri = UriComponentsBuilder.fromUriString(naverLocalSearchUrl)
.queryParams(searchLocalReq.toMultiValueMap())
.build()
.encode()
.toUri();

System.out.println(uri);
//https://openapi.naver.com/v1/search/local.json?
// query=%EA%B0%88%EB%B9%84&display=1&start=1&sort=random

var headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", naverClientId);
headers.set("X-Naver-Client-Secret", naverClientSecret);
headers.setContentType(MediaType.APPLICATION_JSON);

var httpEntity = new HttpEntity<>(headers);
var responseType = new ParameterizedTypeReference<SearchLocalRes>(){};

var responseEntity = new RestTemplate().exchange(
uri,
HttpMethod.GET,
httpEntity,
responseType
);

아래는 나의 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

String uri = local + "?query=food&display=1&start=1&sort=random";

var headers = new HttpHeaders();

headers.set("X-Naver-Client-Id", id);
headers.set("X-Naver-Client-Secret", secret);
headers.setContentType(MediaType.APPLICATION_JSON);

var request = new HttpEntity<>(headers);

var responseEntity = restTemplate.exchange(
uri,
HttpMethod.GET,
request,
String.class
);

Local local = convertData(responseEntity.getBody());
System.out.println(local);

restTemplate 이란 클래스가 MVC에서 제공 되고 여기에 exchange 함수가 사용 되어 API 호출을 한다.

또 다른 문제

응답 값이 JSON 으로 오고 이를 쓰기 위해 Java Object 로 변환을 하게 되는데 이상하게 일부만 저장 되어 돌아 온다.

정확히는 Java Object의 앞의 멤버 변수들은 잘 채워졌는데 뒤에 item list 부분은 안 채워져서 온다.

Gson이라는
라이브러리가 있어 적용 해 보았는데 이방식은 변환이 되어 잘 들어 온다.

private static Gson gson;

static Local convertData(String json) {
    if (gson == null)
        gson = new Gson();

    Local local = gson.fromJson(json, Local.class);

    return local;
}