이전시간에 공부한 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는
위와 같은데 한번 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와 요청바디가 잘 찍혔다 .
일반인이 수집하기 힘든 데이터들을 쉬운 방법으로 구할 수 있는게 참 좋은 것 같다. 활용할 곳이 많을 것 같다.
'SPRING BOOT' 카테고리의 다른 글
spring-boot JUnit Test시 유의 할 점 (0) | 2021.06.09 |
---|---|
Spring-boot 공부 8 - RestTemplate(Server to Server 간의 통신) (0) | 2021.05.25 |
Spring boot 공부 6 - interceptor (1) | 2021.05.22 |
Spring boot 공부 5 - filter (0) | 2021.05.21 |
Spring boot 공부 4 - Error 데이터 커스터마이징해서 응답 (0) | 2021.05.20 |