[SpringBoot]네이버 번역 파파고 API 적용 및 예제
1. 네이버 번역 API란?
네이버 번역 API는 네이버에 번역하고 싶은 단어나 문장을 보내주면
해당 문장을 번역한 결과값을 아래와 같이 JSON이나 XML 형식으로 반환해주는 API이다.
1
2
3
4
5
6
7
8
|
{"message":
{"@type":"response",
"@service":"naverservice.labs.api",
"@version":"1.0.0",
"result":
{"translatedText":"So glad to see you."}
}
}
|
cs |
주로 다국어 서비스를 할 때 실시간으로 번역이 필요할 때 이 API 적용을 고려해 볼 만 할것으로 보이는데
하루에 1만글자까지 번역이 가능하므로 참고 바란다.
(바이트 단위인 것으로 보인다)
참고로 소스코드는 Java의 SpringBoot로 작성되었다.
본인이 필요한 환경에 맞게 바꿔서 넣어주면 될 것 같다.
2. 오픈 API 신청하기
처음 네이버 API를 이용하려 하는 것이라면 자신의 서비스를 등록해줘야 한다.
아래 주소로 가서 자신의 서비스를 등록하고 오도록 하자.
https://developers.naver.com/apps/#/register?defaultScope=translate
아래는 등록할 때 화면이다.
사용 API항목에서 파파고 번역을 누르고 환경을 자신의 서비스에 맞게 Web/Android/IOS 중에 고르면 된다.
애플리케이션 등록이 끝났다면 다음과 같은 화면이 나오게 되는데 여기서 ClientId와 Client Secret 키들을 복사 해놓도록 하자.
3. API 연동 코드 제작
프로젝트 내에 번역할 문장을 보내고 받아올 기능을 할 클래스를 제작하고
아래의 코드들을 넣는다.
3.1 getTransSentence 함수 제작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public String getTransSentence(String s){
String clientId = "";//애플리케이션 클라이언트 아이디값";
String clientSecret = "";//애플리케이션 클라이언트 시크릿값";
String apiURL = "https://openapi.naver.com/v1/papago/n2mt";
String text;
try {
text = URLEncoder.encode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("인코딩 실패", e);
}
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", clientId);
requestHeaders.put("X-Naver-Client-Secret", clientSecret);
String responseBody = post(apiURL, requestHeaders, text);
System.out.println("responseBody = " + responseBody);
return convertToData(responseBody);
}
|
cs |
먼저 getTransSentence함수에서 매개변수로 번역할 문장을 받아온다.
여기서 해당 문장을 URLEncoding을 한번 하고 text에 세팅을 해준다.
그리고 요청할 requestHeader에다 네이버에서 복사했던 아이디와 시크릿 키를 세팅해준다.
이후 post 함수를 만들어 두고 post함수를 요청해서 응답을 네이버에게서 받아오고
받은 결과를 원하는 대로 가공해서 쓰면 된다.
3.2. 요청을 보내고 받아올 post, connect 함수 제작.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
private String post(String apiUrl, Map<String, String> requestHeaders, String text){
HttpURLConnection con = connect(apiUrl);
String postParams = "source=ko&target=ja&text=" + text; //원본언어: 한국어 (ko) -> 목적언어: 영어 (en)
try {
con.setRequestMethod("POST");
for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}
con.setDoOutput(true);
try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
wr.write(postParams.getBytes());
wr.flush();
}
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 응답
return readBody(con.getInputStream());
} else { // 에러 응답
return readBody(con.getErrorStream());
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
} finally {
con.disconnect();
}
}
private HttpURLConnection connect(String apiUrl){
try {
URL url = new URL(apiUrl);
return (HttpURLConnection)url.openConnection();
} catch (MalformedURLException e) {
throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
} catch (IOException e) {
throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
}
}
|
cs |
post 함수와 connect 함수에서는 POST방식으로 요청을 보내서 결과를 받아오는 역할을 한다.
HttpURLConnection을 생성해서 POST방식으로 요청을 보내고
그 결과가 response코드가 200(정상)인지 체크해서 정상 반환해준다.
이 때 번역할 문장의 언어와 자신이 번역을 원하는 언어를 postParams의 source와 target에 각각 적어준다.
각 언어의 키워드는 아래 이미지를 참고 바란다.
3.3 요청받은 Body를 읽는 readBody함수를 제작
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private String readBody(InputStream body){ InputStreamReader streamReader = new InputStreamReader(body, StandardCharsets.UTF_8);
try ( BufferedReader lineReader = new BufferedReader(streamReader) ) { StringBuilder responseBody = new StringBuilder();
String line; while ((line = lineReader.readLine()) != null) { responseBody.append(line); }
return responseBody.toString(); } catch (IOException e) { throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e); } } |
cs |
get함수에서 받은 결과 값을 리턴해주는 함수인 readBody를 제작한다.
받은 값을 UTF8로 읽어서 BufferedReader로 값들을 읽어서 리턴해준다.
이렇게 하면 결과 값을 읽어서 네이버에서 받은 요청 번역된 문장을
최종적으로 String형태로 getTransSentence 함수에서 받아올 수 있다.
이 결과값을 gson등의 라이브러리를 통해
객체에 매핑하거나 하는 방법으로 데이터를 가져다 쓰면 될 것 같다.
참고로 우리가 원하는 번역된 문장은 아래와 같이
{"message":
{"@type":"response",
"@service":"naverservice.labs.api",
"@version":"1.0.0",
"result":
{"translatedText":"So glad to see you."}
}
}
message->result->translatedText 안에 있으니 결과 파싱할 때 참고 바란다.
아래 내용은 전체 소스코드이다.
필요하신 분은 가져다 쓰시면 될 것 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
@Service
public class NaverTransService {
public String getTransSentence(String s){
String clientId = "";//애플리케이션 클라이언트 아이디값";
String clientSecret = "";//애플리케이션 클라이언트 시크릿값";
String apiURL = "https://openapi.naver.com/v1/papago/n2mt";
String text;
try {
text = URLEncoder.encode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("인코딩 실패", e);
}
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", clientId);
requestHeaders.put("X-Naver-Client-Secret", clientSecret);
String responseBody = post(apiURL, requestHeaders, text);
System.out.println("responseBody = " + responseBody);
return convertToData(responseBody);
}
private String post(String apiUrl, Map<String, String> requestHeaders, String text){
HttpURLConnection con = connect(apiUrl);
String postParams = "source=ko&target=ja&text=" + text; //원본언어: 한국어 (ko) -> 목적언어: 영어 (en)
try {
con.setRequestMethod("POST");
for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}
con.setDoOutput(true);
try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
wr.write(postParams.getBytes());
wr.flush();
}
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 응답
return readBody(con.getInputStream());
} else { // 에러 응답
return readBody(con.getErrorStream());
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
} finally {
con.disconnect();
}
}
private HttpURLConnection connect(String apiUrl){
try {
URL url = new URL(apiUrl);
return (HttpURLConnection)url.openConnection();
} catch (MalformedURLException e) {
throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
} catch (IOException e) {
throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
}
}
private String readBody(InputStream body){
InputStreamReader streamReader = new InputStreamReader(body);
try (BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}
return responseBody.toString();
} catch (IOException e) {
throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
}
}
}
|
cs |
'Language > Java' 카테고리의 다른 글
[Java]객체 지향 프로그래밍의 기초-객체와 클래스의 개념 및 예제 (0) | 2020.08.26 |
---|---|
[JAVA]반복문 개념 정리 for, foreach,whlie, do-whlie문 사용법 및 예제 (0) | 2020.08.21 |
[Java]네이버 지역 검색 API 적용하는 방법 정리 (2) | 2020.08.20 |
[Java]조건문 if 와 switch문 개념 정리 및 예제 (0) | 2020.08.17 |
[Java]특수문자와 서식 문자,소수점 제한 처리 정리 및 예제 (0) | 2020.08.15 |