서론
- Spring Boot 기반의 RestTemplate 공부를 하며 local에 서버를 2개 띄워서 테스트 하는것 보다는, openAPI를 적용해보고 싶던 와중
kakao 에서 제공하는 Translate (번역) API 를 찾게 되었고 연동해보았다.
- 예전에는 단순히 카카오 개발자 사이트에서, Test용 어플리케이션 등록 + Api Key로 사용이 가능했지만,
2023.03.13일 현재 kakao i cloud라는 시스템을 사용하는것으로 조금 바뀌어 있다. (호출 방식, key 같은것들이 다름.)
혹시나 하는 마음에 이전버전의 API 호출 방식을 적용해봤는데 정상적으로 동작이 되었다.
목적은 어디까지나 RestTemplate를 사용한 API호출 이었기 때문에, 예전방식으로 진행했다.
* 시작전 유의점
- RestTemplate의 개념에 대해서 다루지 않습니다. (사전 기본지식 필요)
- 카카오 OpenAPI 가 언제 지원종료될지 모릅니다. (deprecated)
- 카카오 개발자 사이트에서 어플리케이션 등록 및 API Key 발급되어야 합니다.
개발 환경
- Mac OS
- IntelliJ Ultimate
- Spring Boot 2.7.2
- jdk 11
- build tool : Gradle
카카오 번역기 API 호출
- 우선 이런 OpenAPI 를 사용하기 위해서는, API를 제공하는 공식문서를 필수적으로 참고 해야 합니다,
API를 호출하기 위해서는 API를 제공하는쪽에 원하는 스펙을 맞춰서 요청을 보내야 하기 때문입니다.
- 카카오 번역기 : 이전버전(문서)
* 요구사항 (spec)
- method : GET
- parameter : query, src_lang, target_lang
- Header : Authorization: KakaoAK {API Key}
- encoding : form-urlencoded
- response : translated_text (List<String> -> JSON)
1. 라이브러리 추가
- 요청 Data가 JSON 내부에 List 형태의 String 으로 오기때문에, 파싱을 해주어야 한다.
JSON 형태의 데이터를 파싱하기 위해 라이브러리를 추가해주는것이다.
// https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
2. Data 예시
- 카카오 API 에서 리턴해주는 형식을 확인해보자.
{"translated_text": [["data1", "data2", "data3"]]}
- 위와 같이 JSON 형태로 문단단위로 리스트를 반환해준다.
3. Controller
- 컨트롤러 코드를 보자
/************
* @info : Kakao Open API - Translate by Rest template Controller
* @name : TransKakaoController
* @date : 2023/03/13 4:07 PM
* @version : 1.0.0
* @Description :
************/
@RestController
@RequiredArgsConstructor
@Slf4j
public class TransKakaoController {
private final TransKakaoService service;
@GetMapping("/api/kakao/translate")
public String translate(@RequestParam String lang, @RequestParam String text) {
status = trace.begin("TransKakaoController.translate()");
String translate = service.translate(lang, text);
return translate;
}
}
- 컨트롤러에 요청 할때, 카카오API 요청에 필요한 파라미터 2개를 넣어주었다.
1. lang : 번역 할 타겟 언어.(번역결과언어)
2. text : 번역 할 텍스트.
- 번역대상언어, 번역결과언어를 둘다 파라미터로 받아서 확장성을 높일수 있지만, 본 예제에서는 한글 -> 번역결과언어
로 번역할 예정이기 때문에, 번역 결과 언어많을 파라미터로 받았다.
4. Service
- 실질적으로 API 요청을 하는 Service 코드.
/************
* @info : Kakao Open API - Translate by Rest template
* @name : TransKakaoService
* @date : 2023/03/13 3:39 PM
* @version : 1.0.0
* @Description :
************/
@Service
@RequiredArgsConstructor
@Slf4j
public class TransKakaoService {
private String url = "https://dapi.kakao.com/v2/translation/translate";
private String key = "kakao REST API key";
/**
* 카카오 번역 api를 통해 번역함
* @param targetLang : en(영어), 번역 결과 언어
* @param targetText : 번역할 텍스트
*/
public String translate(String targetLang, String targetText) {
String result = ""; // return value
UriComponents build = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("src_lang", "kr")
.queryParam("target_lang", targetLang)
.queryParam("query", targetText)
.encode()
.build();
// Header
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "KakaoAK " + key);
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> exchange
= restTemplate.exchange(build.toUri(), HttpMethod.GET, new HttpEntity<>(headers), String.class);
// json parsing - json 형태의 결과를 파싱함.
// Json Simple 라이브러리 import
// Array 결과를 -> String 으로 변환(Stream)
try{
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(exchange.getBody());
JSONArray translateText = (JSONArray) jsonObject.get("translated_text");
List<String> str = (List<String>) translateText.get(0);
result = str.stream().collect(Collectors.joining(" "));
}catch (Exception e) {
e.printStackTrace();
}
return result;
}//translate
}
- 서비스 코드의 구조는 생각보다 간단하다.
타겟 API가 원하는 스펙을 설정 하고, 요청 전송 -> 결과 파싱 흐름이기 때문이다.
- 요청 시 필요한, 파라미터, 주소, API Key, 텍스트, 번역대상언어, 번역결과언어를 각각 맞추어서 보내주면 된다.
(Header 부분은 꼭 카카오에서 명시한 스펙대로 보내주어야 한다.)
- 결과는 클래스를 따로 지정하여 받아줄수 있지만, String 으로 받아서 별도 파싱을 해주었다.
- 추후 DB 조회 결과를 번역하는 등, 확장에도 염두에 두었다.
Test - Swagger
- 이제 해당 API 가 정상작동하는지 테스트 해보자.
테스트는 Swagger를 사용해서 진행했다.
- 번역결과언어는 en : 영어로 지정해주었다.
* 번역결과언어 코드는 카카오 공식문서에 존재한다.
- 결과
- 번역된 결과를 String 으로 정상적으로 Return 하는것을 확인할 수 있다.
* 추가
- 현재 카카오에서 공식적으로 지원하고 있는 API 가이드는 아래 링크에서 확인 가능하다.
- 예제에서 사용한 API 호출 방식이 다른것을 확인 할 수 있다.
'spring & boot > Spring & Spring Boot' 카테고리의 다른 글
[Spring Security] x-frame-option 헤더 설정(iframe) (1) | 2024.04.03 |
---|---|
[SpringBoot] QR코드 생성 & Test(링크이동) - zxing (2) | 2023.03.24 |
[Spring] Spring-Container(IoC 컨테이너)에 관리되는 Bean 목록 확인 (0) | 2023.02.08 |
[Spring] Spring-Container, IoC, DI, Singleton 개념 정리 (0) | 2023.02.08 |
[SpringBoot] Swagger API 문서 자동화 간단 연동, 테스트하기(1) (0) | 2023.01.18 |
댓글