요즘 프로젝트가 끝나서 여러가지 삽질을 하고 싶어졌다!! 그러다 문득, 학부생 때 네이버 지도와 연결하는데 실패한 경험을 떠올렸다.
그래서 이번 기회에 Naver Open API를 사용해보면서 네이버 지도 api까지 연동해보고자 한다. 오늘은 가장 쉬운? papago API를 연동해보고자 한다.
별로 어렵지 않으니 블로그 내용만 보고도 바로 적용 가능할 것이다!!!
Naver Open API Setting
프로젝트에 적용하기 전에 Naver Open API 세팅을 먼저 진행해보자~
https://developers.naver.com/main/
해당 사이트에 접속해서 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
Code 작성
이제 모든 세팅이 끝났다!! 주요 코드를 소개하고 포스팅을 마무리하고자 한다. 전체 코드의 경우 필자의 github에서 참고 가능하다.
우선 papago API 요청을 위한 request 요소 그리고 응답 결과인 response 요소를 파악하는 것이 중요하다. 가이드를 클릭하여 상세보기 페이지로 넘어가면 다음과 같은 페이지를 확인할 수 있다.
https://developers.naver.com/docs/nmt/reference/
근데, 여기서 엄청난 함정 카드가 있다!!! 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를 참고하면 될 것이다!!
'SPRING' 카테고리의 다른 글
MyBatis에서 Helper 클래스 적용하기 (StringUtils, CollectionUtils...) (2) | 2024.06.23 |
---|---|
정적 팩토리 메서드(Static Factory Method) 맛보기 (2) | 2024.02.25 |
[Spring] 서비스에 인터페이스를 구현하는 이유는 뭘까? (ServiceImpl) (6) | 2023.10.13 |
[Spring] Static Class, Custom Builder 소개 (4) | 2023.07.22 |
[Spring] FeignClient 란 무엇일까? (2) | 2023.07.17 |