본문 바로가기
SPRING

Naver Open API 연결 어렵나?

by 킹명주 2023. 11. 7.

요즘 프로젝트가 끝나서 여러가지 삽질을 하고 싶어졌다!! 그러다 문득, 학부생 때 네이버 지도와 연결하는데 실패한 경험을 떠올렸다. 

그래서 이번 기회에 Naver Open API를 사용해보면서 네이버 지도 api까지 연동해보고자 한다. 오늘은 가장 쉬운? papago API를 연동해보고자 한다.

 

별로 어렵지 않으니 블로그 내용만 보고도 바로 적용 가능할 것이다!!!  


Naver Open API Setting

 

프로젝트에 적용하기 전에 Naver Open API 세팅을 먼저 진행해보자~

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

 

NAVER Developers

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

developers.naver.com

해당 사이트에 접속해서 papago를 클릭하면 아래와 같은 페이지를 확인할 수 있다.

오픈 API 이용 신청 버튼을 클릭하면 아래와 같은 페이지가 출력된다. 애플리케이션 이름과 WEB 설정인 경우 본인이 제작하고 있는 웹페이지의 URL을 추가하면 끝이다!

이처럼 애플리케이션을 등록하게 되면, Client ID와 Secret을 발급받게 된다. 아래는 간단한 사용법을 나타냈고, 하이퍼링크로 되어 있는 가이드를 클릭하면 더욱 상세하게 나타나있다. (* 나중에 가이드 문서는 살펴볼 예정~~)


Spring Setting

 

이제 Spring Setting을 해보겠다. 정말 간단하게 테스트 용 프로젝트이니, 별로 설정할게 없다.

API를 만들어주기 위해 Spring Web을 설정했으며, 어노테이션 사용을 위해 Lombok을 설정했다. 마지막으로 FeignClient를 사용하기 위해 OpenFeign을 설정해주었다. (* Feign Client에 대해 생소하다면 아래 포스팅을 참고해주세요!!)
https://mjoo1106.tistory.com/entry/Spring-FeignClient-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

[Spring] FeignClient 란 무엇일까?

오늘은 현업에서 많이 사용하고 있는 FeignClient에 대해 소개해보려고 한다. 이론 뿐만 아니라 실습까지 진행하면서 개념을 숙지해보자~~ 그럼 출발!! FeignClient를 도입한 이유는? 현재 우리 팀은 서

mjoo1106.tistory.com


Code 작성

 

이제 모든 세팅이 끝났다!! 주요 코드를 소개하고 포스팅을 마무리하고자 한다. 전체 코드의 경우 필자의 github에서 참고 가능하다.

 

우선 papago API 요청을 위한 request 요소 그리고 응답 결과인 response 요소를 파악하는 것이 중요하다. 가이드를 클릭하여 상세보기 페이지로 넘어가면 다음과 같은 페이지를 확인할 수 있다.

https://developers.naver.com/docs/nmt/reference/

 

Papago NMT API 개발 가이드

Papago NMT API 개발 가이드 - 파파고에 적용된 Naver Neural Machine Translator를 이용한 번역 API.

developers.naver.com

근데, 여기서 엄청난 함정 카드가 있다!!! POST 요청이라 당연히 @RequestBody를 통해 파라미터를 전달했는데, @RequestParam 형태로 각 요소를 전달해야 한다. 이 부분은 좀 아쉬운 것 같다. (네이버 만세)

 

어째든 위 문서를 통해, request / response 요소를 파악했다면 아래와 같은 DTO를 작성할 수 있다.

public class NaverResponse {

    @Getter
    public static class Papago {

        private Message message;

        @Getter
        public static class Message {

            @JsonProperty("@type")
            private String type;

            @JsonProperty("@service")
            private String service;

            @JsonProperty("@version")
            private String version;

            private Result result;
        }

        @Getter
        public static class Result {

            private String srcLangType;

            private String tarLangType;

            private String translatedText;

            private String engineType;
        }
    }
}

해당 프로젝트에서 네이버 지도 API까지 연동할 예정이기 때문에 papago 관련 dto는 inner class 형태로 작성했다. (확장성 고려)

파파고 API 응답의 경우 아래와 같이 특수문자를 포함한 형태로 오기 때문에 String으로 구성된 변수명만으로는 응답을 받아올 수 없다. 그러므로 @JsonProperty 사용해주었다.

실제 응답 구조를 살펴보면 복잡하다. 그리고 킹이버가 @type이라고 이름 붙인 이유가 있겠지? 라는 생각도 들면서 한편으로는 왜 @를 붙여서 많은 사람을 힘들게 할까? 라는 생각도 든다 ㅎㅎ(네이버 짱)

 

그리고 feign client의 요소를 보겠다.

@FeignClient(name = "naver-open-api", url = "${naver.url}", configuration = NaverConfiguration.class)
public interface NaverFeign {

    @PostMapping("papago/n2mt")
    NaverResponse.Papago translatedText(@RequestParam(value = "source") String source,
                                        @RequestParam(value = "target") String target,
                                        @RequestParam(value = "text") String text);
}
@Configuration
public class NaverConfiguration {

    @Value("${naver.client-id}")
    private String clientId;

    @Value("${naver.client-secret}")
    private String clientSecret;

    @Bean
    public RequestInterceptor requestInterceptor() {

        return requestTemplate -> {
            requestTemplate.header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            requestTemplate.header("X-Naver-Client-Id", clientId);
            requestTemplate.header("X-Naver-Client-Secret", clientSecret);
        };
    }
}

이렇게 설정해서 사용하면


파파고 연동을 마치고...

 

오늘은 Naver Open API를 맛보았다. Open API를 사용하면서 정말 네이버는 문서 정리를 잘해놨다는 생각이 들기도 했지만, 몇가지 아쉬운 점도 있었다. 예를들어, 번역의 경우 POST 요청이라 JSON 형태로 데이터를 전송할 것으로 예상했지만 URI 파라미터 형태로 받고 있었다. 그리고 변수 명에 특수기호를 쓰는 것,,? 다만, 킹이버는 이유가 있을 것이라고 생각한다.

 

사실 이만큼 Open API 문서 정리가 잘되어있는 기업이 별로 없다 ㅎㅎ,, 사용할 수 있음에 감사 (왜 일본어 번역은 지원안할까,,?)

 

 

* 코드 전체를 보고싶다면, 아래의 github를 참고하면 될 것이다!!

https://github.com/myeongju-kim/Naver-OpenAPI

 

GitHub - myeongju-kim/Naver-OpenAPI

Contribute to myeongju-kim/Naver-OpenAPI development by creating an account on GitHub.

github.com