DevJong12

[OrientalUnity][Spring] NCP의 Papago Translation을 이용한 API번역 기능 구현 본문

프로젝트/OrientalUnity

[OrientalUnity][Spring] NCP의 Papago Translation을 이용한 API번역 기능 구현

Jong12 2023. 11. 13. 17:53
728x90

목차

     

    1️⃣ 글을 적기에 앞서...

    와...정말 보기힘든 기능구현 글이다..! 

     

    해당 포스트는 Naver Cloud에서 제공되는 서비스중 하나인 Java를 활용해 Papago Translation을 사용하는 기능구현 방법을 기록해 보고자 한다.

     

    그 중에서도 Text와 HTML번역에 대하여 다룰 예정이다.

     

    또한 필자의 프로젝트의 경우 한국어, 영어, 중국어, 일본어만 활용했다보니 언어가 지원이 안되는 경우는 한개의 케이스밖에 없었다.

    여러개의 언어를 활용하면 서비스를 지원하지 않는 언어타입도 존재하니 주의하기 바란다.


    2️⃣ Papago Translation API

    1. API 이용 신청

    먼저 API를 활용하기 위해선 사용부터 해야한다. 이용신청을 할 경우 다음의 이미지들이 뜬다.

    생성 및 동의를 먼저 해주도록 하자.

     

    2. API서비스 페이지에서 Application 생성

    위의 이미지처럼 동의를 하게 될 경우 이동이 되는 페이지 이다.

    Application 등록버튼클 클릭한 이후 등록해주면된다.

     

    필자가 프로젝트에서 사용해야 하는 항목은 Papago Text Translation(Text번역)Papago Website Translation(HTML번역)이다.

    다른 서비스도 필요하면 그건 가이드 문서를 보는 것을 권장한다.

     

    3. 인증정보 확인

    어플리케이션의 생성이 완료되면 다음과 같이 서비스에 대한 사용정보가 출력된다. 

    여기서 인증정보를 클릭할 경우 API를 요청할 수 있는 키를 확인이 가능하다.

     

    Papago번역시스템의 경우 과금의 비중이 높은 편이니 비밀키 관리에 주의를 하도록 하자.


    3️⃣ 개발 가이드문서 확인 및 공통사항 확인 및 구현

    1. 공통항목 공식 가이드 확인하기

    개발 가이드 링크를 꼭! 꼭꼭! 확인하도록 하자, 이건 몇번을 봐도 중요하다

     

    해당 챕터는 가이드를 일부만 보도록 하겠다.

     

    우선 Application을 만들고 Client 정보를 확인하라고 한다. 우리는 위에서 했다...! 

     

     

    다음으로 요청 Request를 보낼 호스트의 주소이다. 알 수 있는 정보는 POST 메소드로 발송하며 https://naveropenapi.apigw.ntruss.com/nmt/v1/translation링크로 Text, HTML 모두 발송하면 된다는 것이다.

     

    요청헤더의 인증정보에서 나온 값을 사용하게 되며 다음과 같이 요청헤더객체를 전달하면 된다.

    • KeyName : X-NCP-APIGW-API-KEY-ID, Value  Client ID
    • KeyName : X-NCP-APIGW-API-KEY, Value  Client Secret

     

    2. 공통항목 기능 구현하기

    a-1 . 설정값 추가하기  (VMOption ✅)

    먼저 안내를 드리자면 설정된 Key Value는 이 글을 보시는 독자님들이 자유롭게 변형을 하셔도 상관 없습니다.

    또한 VMOption을 활용한 이유는 Public한 Repository이다 보니 직접적으로 Commit을 할 수 없으나 Code로 주입을 하기 위해서 다음의 방법을 활용하였습니다.

     

    먼저 VMOption을 설정하며, 해당 API-KEY-ID와 API-KEY의 경우 인증인가의 Client ID와 Client Secret을 의미합니다.

     

    이후 application.yml에는 아래의 이미지 처럼 설정해주세요.

     

     

    a-2 . 설정값 추가하기  (VMOption ❎)

    클라이언트 ID와 Secret은 발급받은 값을 기록하기 바랍니다.

     

    b . Code에 YML주입후 Bean객체로 관리하기

    ConfigurationProperties를 통해 papago의 Value를 가져옵니다.

    또한 header Key와 Value를 Map형태로 가져옵니다

     

    이후 위에서 생성한 PapagoProperties를 Bean으로 관리합니다.

    c . RestTemplate 분리해서 관리 및 사용하기

    Bean의 경우 필자는 2개를 생성하였으며 각각 개별의 Connection Pool을 가지도록 의도하였습니다.

     

    먼저 Text 번역을 담당하는 RestTemplate의 Connection Pool 입니다.

    많은 양을 번역하지 않기 때문에, 짧은 시간만의 Connection을 유지하였습니다.

     

     

    다음으로는 HTML 웹사이트를 번역할 때 Connection을 맺을 RestTemplate Connection Pool로 생성된 Bean 객체입니다.

    양이 어느정도 되기에 번역에 소요시간이 좀 더 걸릴거라 최초에 판단하고 작성하였으며, 약 20초를 초안으로 생각하였습니다.

     

    d . 언어타입 분류하기

    해당 코드는 (꼭) 필요한 것은 아닙니다. 하지만 언어 타입을 강제로 지정하기 위해 제작하였으며, 필자는 Enum을 활용하였습니다.

    e . 번역기능을 구현할 Class 생성하기

    해당작업으로 공통사항이 들어갈 소스코드에 대한 제작이 끝났습니다. 

    위에서 제작한 두개의 Bean, Papago Properties, 받아온 값을 파싱할 ObjectMapper를 주입하였습니다.


    4️⃣ Papago Text Translation 구현

    1. 공식가이드 확인하기

    Text Translation의 경우에도 따로 가이드 페이지가 존재한다. (링크참고)

     

    가이드에 따르면 Request Header의 경우에는 공통사항을 그대로 사용하면 된다. 

    추가된 사항은 JSON요청,  x-www-form-urlencoded를 모두 활용 가능하다는 정도 같다.

     

    또한 번역요청을 Curl Sample로 제공하며 다음의 항목이 필수인 것으로 확인이 된다.

     

    Body에 들어가는 옵션값들을 보면 필수여부가 실제로 기록이 되어있다.

    이건 문서를 잘 읽어보도록 하자.

     

    마지막으로 응답 예시 구조이다. 정말 중요하다.

    2. Text Translation 코드 작성

    먼저 응답 예시대로 제공을 받을 Response Class를 생성합니다

     

    이후 아래처럼, 요청을 보낼 Request Header, Request Body를 생성하며 Source, Target, Text를 기록한 이후 Rest요청을 보내면 됩니다.


    5️⃣ Papago HTML WebSite Translation 구현

    1. 공식가이드 확인하기

    WebSite Translation의 경우에도 따로 가이드 페이지가 존재한다. (링크참고)

     

    가이드에 따르면 Request Header의 경우에는 공통사항을 그대로 사용하면 된다. 

    추가된 사항은  x-www-form-urlencoded만 활용 가능하다는 정도 이다.

     

    또한 번역요청을 Curl Sample로 제공하며 다음의 항목이 필수인 것으로 확인이 된다.

     

    문서를 확인해보면 source, target, html만 보내면 되는것으로 확인이 된다.

    Response는 StatusCode, Data만 넘어오는 것으로 확인이 된다. (간단하구만😎)

     

    실제 CURL샘플의 경우에도 형식이 매우 간단했다. 쉽게 할 수 있겠다.

    2. WebSite Translation 코드 작성

    어...끝이다. 그냥 Text처럼 요청에 대한 Request를 생성한 이후 차이점은 String으로 바로 받아서 Return하면 된다.


    6️⃣ 사용방법 그리고 주의사항

    아래의 이미지처럼 사용하면 된다. 원본 언어타입, 타겟언어타입, 내용.

     

    참고로 현재는 일부로 오류 이미지를 가져왔는데, 지원하지 않는 경우 이런식으로 Exception이 발생한다.

    참고하면 좋을 듯 하다.


    7️⃣ 글을 마치며...

    구현을 다 해놓고 보니까 언어 지원타입이 문제가 될 줄은 생각을 못했다.

    트랜잭션 처리를 했다 보니까 무조건 성공하게 하는 케이스를 제작하는게 머리가 아팠지 직접 구현 자체는 금방 끝난 것 같습니다.

     

    빵빵하게 사용할 수 있는 클라우드 금액이 없으면 과금이 무서운 번역 API였는데, 과감하게 사용할 수 있었던게 좋은 경험이 된것 같습니다.


    8️⃣ Reference

    개발가이드 CURL 샘플만 보고 제작된 코드입니다. 구현은 매우 쉬웠는데, 지원이 되냐 안되냐 유무를 직접 테스트해보는게 힘들었습니다.

    9️⃣ 참고 할 수 있는 코드

    해당 Repository에 위의 코드가 모두 구현이 되어 있으니 참고하시기 바랍니다. 😎😎😎

    https://github.com/hook-killer/back-end

     

    GitHub - hook-killer/back-end: 동북아 자동번역 커뮤니티 OU의 BackEnd Repository입니다.

    동북아 자동번역 커뮤니티 OU의 BackEnd Repository입니다. Contribute to hook-killer/back-end development by creating an account on GitHub.

    github.com

     

    728x90
    Comments