NAVER 검색 API 에러 해결

송민지·2025년 5월 5일
0

PortCoin

목록 보기
4/7
post-thumbnail

에러 발생 지역

public List<NewsResponse> getNews(){
        List<NewsResponse> newsData = redisTemplate.opsForValue().get("News");

        if(newsData == null){
            newsData =  naverRestClient.get()
                    .uri(uriBuilder -> uriBuilder
                            .queryParam("query", param)
                            .queryParam("display", 10)
                            .queryParam("start", 1)
                            .queryParam("sort", "date")
                            .build())
                    .retrieve()
                    .body(new ParameterizedTypeReference<>() {}); //에러 발생

            redisTemplate.opsForValue().set("News",newsData);
        }
        return newsData;
    }

에러 내용

json parse error가 발생하였습니다. 구글링 해보니 데이터 타입이 일치하지 않아 생긴 오류였습니다.

왜 발생했을까?

네이버 검색 API의 응답 예시입니다. PortCoin에서 필요한 데이터는 item안에 title과 link였습니다. 그래서 ResponseDto역시 title, link의 값만 포함하도록 하였습니다. 여기서 문제가 발생하였습니다.

해결방법

title과 originalLink가 포함된 값을 받기위해 NaverNewsList Response DTO를 추가하였습니다.

또한 Redis에 저장된 값에서 NewsResponse Dto를 반환하도록 하였습니다.

public List<NewsResponse> getNews(){
        List<NewsResponse> newsData = redisTemplate.opsForValue().get("News");

        if(newsData == null){
           NaverNewsList  response =  naverRestClient.get()
                    .uri(uriBuilder -> uriBuilder
                            .queryParam("query", param)
                            .queryParam("display", 10)
                            .queryParam("start", 1)
                            .queryParam("sort", "date")
                            .build())
                    .retrieve()
                    .body(new ParameterizedTypeReference<>() {});

            if (response != null && response.getItems() != null) {
                newsData = response.getItems();
                redisTemplate.opsForValue().set("News", newsData);
            }
        }
        return newsData;
    }

API 값이 안들어 오는 오류 발생

원인

log.info로 확인해보니 param값이 넘어오지 않는걸 확인하였습니다.
바람의 구분값을 쉼표(,)로 바꾸고 List를 담는 ArrayList를 추가하였습니다.

 public List<NewsResponse> getNews() {
        List<NewsResponse> newsData = redisTemplate.opsForValue().get("News");

        if (newsData == null) {
            List<NewsResponse> allNews = new ArrayList<>();
            String[] keywords = param.split(",");

            for (String keyword : keywords) {
                NaverNewsList response = naverRestClient.get()
                        .uri(uriBuilder -> uriBuilder
                                .queryParam("query", keyword.trim())
                                .queryParam("display", 10)
                                .queryParam("start", 1)
                                .queryParam("sort", "date")
                                .build())
                        .retrieve()
                        .body(NaverNewsList.class);

                if (response != null && response.getItems() != null) {
                    allNews.addAll(response.getItems());
                }
            }

            // 중복 제거 (제목 기준)
            newsData = allNews.stream()
                    .distinct()
                    .collect(Collectors.toList());

            redisTemplate.opsForValue().set("News", newsData, 5, TimeUnit.MINUTES);
        }

        return newsData;
    }

한글이 깨지는 오류 발생

스웨거에서 확인하던중 한글이 깨지고 있음을 알게되었습니다.
확인결과 애초에 param값이 깨져서 오고 있었습니다..

업로드중..

해결방법

지금 encoder를 사용해서 값을 확인해도 한글이 깨지는 현상이 계속되었습니다.
결국 방법을 알아낼때까진, 하드코딩으로 검색하게 되었습니다.

profile
항상 밝게

0개의 댓글