본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


SPRING BOOT

Spring-boot 공부 9 - RestTemplate 활용(Naver Open API 사용)

반응형

이전시간에 공부한 RestTemplate를 활용해보려한다 

 

Naver 지역 Api를 활용해서 데이터를 얻어와 보려 한다. 

 

일단 브라우저의 요청을 받을 Controller를 만들었다 .

 

ApiController

 

@RestController
@RequestMapping("/api/client")
public class ApiController {

    private final RestTemplateService templateService;

    public ApiController(RestTemplateService templateService) {
        this.templateService = templateService;
    }

    @GetMapping("/naver")
    public NaverApiDto naver() throws CharacterCodingException {
        return templateService.naverApiTest();
    }
}

 

테스트이니 컨트롤러 단에서 그냥 해결해도 되겠지만 그래도 서비스를 만들어서 해보자

 

그전에 데이터를 담을 Dto를 만들어야 하니 예제코드로 API 스펙을 알아보자 

 

https://developers.naver.com/ 에 들어가서 원하는 API를 검색해서 찾으면 documentation이 나온다. 

 

검색창말고 모든 API를 볼 수 있는 페이지가 있었는데 어딨는지 모르겠다 . 사이트가 좀 불편한 것 같다.

 

지역 API를 사용할 것이기 떄문에  

 

https://developers.naver.com/docs/search/local/

 

위 링크로 들어갔다 .

 

Api문서가 자세히 정의되어 있다 . 

 

6번에 예시가 있다 . 

 

예시에서 나온 요청 URI는 

 

https://openapi.naver.com/v1/search/local.json?query=%EC%A3%BC%EC%8B%9D&display=10&start=1&sort=random

 

위와 같은데 한번 ApiTest로 어떻게 나오나 보자 Api 스펙이 아래와 같이 응답되었다.

 

아마 검색어가 증권 관련으로 되어 있나 보다.

 

현재 검색에 대한 정보와 검색결과가 items에 리스트형식으로 들어있다 .

 

Dto를 만들어보자 2가지를 만들면 될 것 같다 . 검색정보를 받을 SearchResult와  SearchResult안에서 검색 결과 레코드

 

를 담을 Item 두가지를 만들어보자

 

 

SearchResult

 

-롬복을 사용했다.

 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class SearchResult {
    private String lastBuildDate;
    private int total;
    private int start;
    private int display;
    private List<Item> items;
}

 

Item

 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Item {
    private String title;
    private String link;
    private String category;
    private String description;
    private String telephone;
    private String address;
    private String roadAddress;
    private String mapx;
    private String mapy;
}

원하는 데이터만 받아도 되지만 그냥  예제에 나온데로 받아 보려한다.  

 

원한다면 Api 설명서에 출력결과를 보면 여러가지가 더 있다.

 

 

RestTemplateService

 

public NaverApiDto naverApiTest() throws CharacterCodingException {


       
        URI uri = UriComponentsBuilder
                .fromUriString("https://openapi.naver.com")
                .path("/v1/search/local.json")
                .queryParam("query","약국")
                .queryParam("display",3)
                .queryParam("start", 1)
                .queryParam("sort","random")
                .encode()
                .build()
                .toUri();

        RequestEntity requestEntity = RequestEntity
                .get(uri)
                .header("X-Naver-Client-Id","네이버에서 받은 id")
                .header("X-Naver-Client-Secret","네이버에서 받은 secret key")
                .build();

        RestTemplate restTemplate = new RestTemplate();

        ResponseEntity<NaverApiDto> searchList = restTemplate.exchange(requestEntity, NaverApiDto.class);
        log.info("uri:{}",uri);
        log.info("searchList:{}",searchList.getBody());
        return searchList.getBody();
    }

 

uri를 build 하고 쿼리 파라미터로 query, display(몇개를 보여줄지 최대 5개 최소 1개) , start (검색 시작 위치로 1만 가능), sort(정렬 옵션: random(유사도순), comment(카페/블로그 리뷰 개수 순)) 요렇게 넣어 줬다 api 설명서보면 다 있다.

 

query에 검색어를 넣어주면 해당 검색에 대한 결과가 리턴될 것이다 이렇게 정해놓고 할 일은 없겠지만 테스트니 "약국" 으로 검색어를 지정해놓고 한번 돌려보려한다. 주의할 점은 query의 값은 UTF-8로 인코딩되어야한다  스프링 부트는 기본이 UTF-8이기 때문에 다른 값을 지정하지않고 encode() 메서드만 붙혀줘도 UTF-8로 전송될 것이다 .

 

요청 헤더에 앱등록 후 API 사용요청을 하고 받은 인증 id 와 비밀번호를 보내줘야 하기 때문에 

 

RequestEntity를 생성해서 정의해 줬다 . 

 

RequestEntity 타입으로 보내기 위해선 exchange 메서드를 사용해야한다 

 

요청 uri 와 응답 바디를  로깅 해봤다.

 

요청을해보자

 

 

 

응답이 잘 되었다 . 

 

서비스 메서드 로깅을 보면

 

uri와 요청바디가 잘 찍혔다 . 

 

일반인이 수집하기 힘든 데이터들을 쉬운 방법으로 구할 수 있는게 참 좋은 것 같다. 활용할 곳이 많을 것 같다.

 

 

반응형