본문 바로가기
SpringBoot Server/API

OPEN API 활용 - HTTP 클라이언트를 통해 네이버 뉴스 API 구현

by ssury94 2025. 1. 12.
 
 
 

 

Open API를 이용하면 여러 플랫폼에서 제공하는 API를 사용 할 수 있습니다.

 

 

Open 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를 활용하여 뉴스 데이터를 수집하고 활용하는 방법을 알아보았습니다.