Open API를 이용하면 여러 플랫폼에서 제공하는 API를 사용 할 수 있습니다.
Open API를 이용하는 방법은 여러가지가 있습니다.
- 플랫폼에서 제공하는 SDK를 이용하기
- 유튜브 검색 SDK
- AWS S3 - 파일업로드 등등 - HTTP 클라이언트를 통해 API를 호출하기
HTTP 클라이언트를 통해 API를 호출하기
이 글에서는 HTTP 클라이언트를 이용하여 네이버에서 제공하는 검색 API를 호출해보겠습니다.
검색 API 레퍼런스 확인
https://developers.naver.com/docs/serviceapi/search/news/news.md#%EB%89%B4%EC%8A%A4
검색 > 뉴스 - Search API
검색 > 뉴스 뉴스 검색 개요 개요 검색 API와 뉴스 검색 개요 검색 API는 네이버 검색 결과를 뉴스, 백과사전, 블로그, 쇼핑, 웹 문서, 전문정보, 지식iN, 책, 카페글 등 분야별로 볼 수 있는 API입니다
developers.naver.com
요청 URL 반환 형식
https://openapi.naver.com/v1/search/news.xml | XML |
https://openapi.naver.com/v1/search/news.json | JSON |
파라미터
query | String | Y | 검색어. UTF-8로 인코딩되어야 합니다. |
display | Integer | N | 한 번에 표시할 검색 결과 개수(기본값: 10, 최댓값: 100) |
start | Integer | N | 검색 시작 위치(기본값: 1, 최댓값: 1000) |
sort | String | N | 검색 결과 정렬 방법 - sim: 정확도순으로 내림차순 정렬(기본값) - date: 날짜순으로 내림차순 정렬 |
Json으로 리스폰스 받겠습니다.
레퍼런스페이지에 Json문 응답 예시가 없어 포스트맨으로 확인해보겠습니다.
레퍼런스에 있는 파라미터들과, Json Url, 헤더에 키값을 입력하면
위와 같이 Json응답결과를 확인 할 수 있습니다.
의존성 추가하기 - Spring Reactive Web
서버간의 원활한 통신을 위해 Spring Reactive Web 웹 개발 프레임워크를 추가합니다.
네이버 개발자 어플리케이션 등록하기
https://developers.naver.com/main/
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
레퍼런스페이지를 확인해보니 API 요청시 클라이언트 아이디와 시크릿키가 필요하다고합니다.
아이디와 시크릿키는 위 사이트에서 발급 가능합니다.
웹 서비스 url이 아직 준비전이면 localhost로 등록합니다.
앱 등록 후 Client 정보를 발급 받습니다.
해당 ID와 Secretkey를 헤더에 보내 인증을 받게됩니다.
IntelliJ 설정
application.yml 설정
spring:
application:
name: news
naver:
api:
client-id:
client-secret:
url: https://openapi.naver.com/v1/search/news.json
Config 설정
@Configuration
public class NaverApiConfig {
@Value("${naver.api.client-id}")
//yml 파일에 있는 naver.api.client-id 값을 가져옴
public String clientId;
@Value("${naver.api.client-secret}")
public String clientSecret;
@Value("${naver.api.url}")
public String newsUrl;
}
기본준비는 마쳤습니다.
본격적으로 Http 요청 클라이언트를 만들어봅시다.
요청방법은 두가지 방법이 있습니다.
이 글에서는 두가지 방법 모두 확인해 보겠습니다.
RestTemplate 사용하기
/// RestTemplate 사용
//- 사용자가 입력한 키워드를 기반으로 네이버 뉴스 API 를 통해 최신 뉴스 20개를 검색하여 제공하는 API
//- 네이버 뉴스 검색 API 를 내부적으로 호출하여 결과를 가공하여 제공
public NewsSearchResponse getNews(String keyword) {
//DB 에도, 스토리지에도 없다
//네이버에 뉴스 API 호출하여 쓰자
//네트워크 통신할 멤버변수 RestTemplate restTemplate
URI uri = UriComponentsBuilder.
fromUriString(naverApiConfig.newsUrl)
//호출할 url 세팅
.queryParam("query", keyword)
.queryParam("display", 20)
.queryParam("start", 1)
.queryParam("sort", "date")
// 파라미터가 4개, 쿼리 디스플레이 스타트 솔트
.build()
.encode() // 한글은 인코딩이 필요
.toUri(); //uri 경로, 파라미터들이 들어가있음
//헤더에 아이디와 키값을 보냄
// X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 클라이언트 아이디 값}, X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 클라이언트 시크릿 값}
HttpHeaders headers = new org.springframework.http.HttpHeaders();
headers.set("X-Naver-Client-Id", naverApiConfig.clientId);
headers.set("X-Naver-Client-Secret", naverApiConfig.clientSecret);
//RestTemplate 을 이용하여 네이버 API 호출
NaverNewsResponse naverNewsResponse
= restTemplate.exchange(uri, HttpMethod.GET, new HttpEntity<>(headers), NaverNewsResponse.class).getBody();
// exchange : uri : 호출할 url,
// HttpMethod.GET : GET 방식으로 호출,
// new HttpEntity<>(headers) : 헤더를 넣어줌,
// NaverNewsResponse.class : 응답을 NaverNewsResponse 클래스로 받겠다
// .getBody() : 응답을 받아옴
// naverNewsResponse 에 담아온 데이터를 가공하여 제공 newsSearchResponse
NewsSearchResponse newsSearchResponse = new NewsSearchResponse();
newsSearchResponse.setTotalCount(naverNewsResponse.getTotal());
newsSearchResponse.setArticles(naverNewsResponse.getItems());
return newsSearchResponse;
}
RestTemplate은 Spring에서 제공하는 HTTP 클라이언트로, RESTful 웹 서비스를 호출하기 위한 동기식 클라이언트입니다.
주요 특징:
HTTP 요청 후 JSON, XML, String 등의 응답을 받을 수 있습니다.
RESTful 형식을 지원합니다.
멀티 스레드와 블로킹 방식을 사용합니다.
블로킹 I/O 기반의 동기 방식 API입니다.
그러나 Spring 5.0 이후부터 RestTemplate은 더 이상 권장되지 않습니다.
WebClient 사용하기
public NewsSearchResponse getNews2(String keyword) {
URI uri = UriComponentsBuilder.
fromUriString(naverApiConfig.newsUrl)
//호출할 url 세팅
.queryParam("query", keyword)
.queryParam("display", 20)
.queryParam("start", 1)
.queryParam("sort", "date")
// 파라미터가 4개, 쿼리 디스플레이 스타트 솔트
.build()
.encode() // 한글은 인코딩이 필요
.toUri(); //uri 경로, 파라미터들이 들어가있음
NaverNewsResponse naverNewsResponse= naverWebClient.get()
//http 메소드먼저 씀 get post put delete
.uri(uri)
.retrieve()
.bodyToMono(NaverNewsResponse.class)
//NaverNewsResponse.class : 응답을 NaverNewsResponse 클래스로 받겠다
.block();
// naverNewsResponse 에 담아온 데이터를 가공하여 제공 newsSearchResponse
NewsSearchResponse newsSearchResponse = new NewsSearchResponse();
newsSearchResponse.setTotalCount(naverNewsResponse.getTotal());
newsSearchResponse.setArticles(naverNewsResponse.getItems());
return newsSearchResponse;
//헤더세팅은 이미 컨피그에서 되어있음
}
WebClient는 Spring 5에서 도입된 논블로킹 방식의 리액티브 웹 클라이언트입니다.
주요 특징:
싱글 스레드(코어당 1개의 스레드)와 논블로킹 방식을 사용합니다.
이벤트에 반응형으로 동작합니다(Spring Reactive 프레임워크 사용).
Reactor 기반의 Functional API입니다.
JSON, XML 등의 응답을 쉽게 처리할 수 있습니다.
비동기 및 논블로킹 I/O를 지원하여 효율적인 리소스 사용이 가능합니다
Controller 클래스
@GetMapping("/api/v1/news/search")
public ResponseEntity<NewsSearchResponse> getNews(@RequestParam ("keyword") String keyword) {
NewsSearchResponse newsSearchResponse = newsService.getNews(keyword);
return ResponseEntity.status(200).body(newsSearchResponse);
}
@GetMapping("/api/v1/news2/search")
public ResponseEntity<NewsSearchResponse> getNews2(@RequestParam ("keyword") String keyword) {
NewsSearchResponse newsSearchResponse = newsService.getNews2(keyword);
return ResponseEntity.status(200).body(newsSearchResponse);
}
두 쿼리 모두 같은 결과를 가져오지만,
WebClient는 리액티브 프로그래밍 모델을 지원하여 대량의 동시 요청을 효율적으로 처리할 수 있습니다.
최신 Spring 애플리케이션에서는 WebClient의 사용이 권장되며, 특히 고성능이 요구되는 시나리오에서 더 적합합니다.
지금까지 네이버 뉴스 API를 활용하여 뉴스 데이터를 수집하고 활용하는 방법을 알아보았습니다.