본문 바로가기
JAVA

[JAVA] Naver News API 적용

by 승븐지 2025. 8. 26.
반응형
네이버 오픈 소스를 사용하여 News API를 개발해볼려한다.
Spring boot 3.x 버전이다.

 

1. Naver Devplopers 오픈소스 페이지에 들어간다.

https://developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

2.Application -> 내 에플리케이션을 들어간다,

 

3.회원가입 후 다시 돌아와 내 애플리케이션 클릭 -> 클릭 후 playground(Beta) 클릭

4. API선택에서 search- 기본 검색 클릭 후 API 호출 

5. applcation.properties 추가
naver.client-id =내ID
naver.client-secret=내KEY
naver.base-url= https://openapi.naver.com
6. Service 및 컨트롤러 생성 
//컨트롤러 

package com.test.gw.controller.news;

import com.test.gw.service.news.NaverNewsService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;
import java.util.Objects;

@Validated
@RestController
@RequestMapping("/api/in/news")
@Tag(name = "Naver News Controller", description = "Naver News API")
public class NaverNewsController {

    @Autowired
    private final NaverNewsService naverNewsService;

    public NaverNewsController(NaverNewsService naverNewsService) {
        this.naverNewsService = naverNewsService;
    }

    @PostMapping("/list")
    public ResponseEntity<String> postNews(
            @RequestBody Map<String, Object> body
    ) {
        String query   = Objects.toString(body.getOrDefault("query", ""), "");
        int display    = Integer.parseInt(Objects.toString(body.getOrDefault("display", "20")));
        int start      = Integer.parseInt(Objects.toString(body.getOrDefault("start", "1")));
        String sort    = Objects.toString(body.getOrDefault("sort", "date"));
        String normalizedSort = "sim".equalsIgnoreCase(sort) ? "sim" : "date";
        return naverNewsService.search(query, display, start, normalizedSort);
    }
}




//service
package com.test.gw.service.news;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;

@Service
public class NaverNewsService {

    private final RestClient rest;

    public NaverNewsService(
            @Value("${naver.base-url}") String baseUrl,
            @Value("${naver.client-id}") String clientId,
            @Value("${naver.client-secret}") String clientSecret
    ) {
        this.rest = RestClient.builder()
                .baseUrl(baseUrl) // https://openapi.naver.com
                .defaultHeader("X-Naver-Client-Id", clientId)
                .defaultHeader("X-Naver-Client-Secret", clientSecret)
                .build();
    }

    public ResponseEntity<String> search(String query, int display, int start, String sort) {
        return rest.get()
                .uri(uri -> uri.path("/v1/search/news.json")
                        .queryParam("query", query)
                        .queryParam("display", display)
                        .queryParam("start", start)
                        .queryParam("sort", sort)
                        .build())
                .retrieve()
                .toEntity(String.class);
    }
}

 

반응형