좌충우돌 GCP Translation 적용기

Google Translation API 를 적용하여 글로벌 번역 시스템을 만들기 시작한지 2달 정도 지났다. 어려운 과정이 많았는데, 그동안 나타났던 문제들과 해결했던 경험을 적어본다.

GCP 환경 설정의 어려움

Credential File Path Setting

https://cloud.google.com/translate/docs/quickstart-client-libraries#client-libraries-install-java

위의 구글 API 문서에서 가이드를 보며 프로젝트를 생성하고, API Key 와 Credetial file 을 받는 것까지는 순조로웠다. 그리고 바로 예제 코드를 실행해 보았다.

// Imports the Google Cloud client library
import com.google.cloud.translate.Translate;
import com.google.cloud.translate.Translate.TranslateOption;
import com.google.cloud.translate.TranslateOptions;
import com.google.cloud.translate.Translation;

public class QuickstartSample {
  public static void main(String... args) throws Exception {
    // Instantiates a client
    Translate translate = TranslateOptions.getDefaultInstance().getService();

    // The text to translate
    String text = "Hello, world!";

    // Translates some text into Russian
    Translation translation =
        translate.translate(
            text,
            TranslateOption.sourceLanguage("en"),
            TranslateOption.targetLanguage("ru"));

    System.out.printf("Text: %s%n", text);
    System.out.printf("Translation: %s%n", translation.getTranslatedText());
  }
}

실행을 하였더니 Credetial does not exist. 에러메세지가 나왔다. 분명 CMD 창에서 다음과 같이 입력하였는데 파일을 찾을 수 없다니…

set GOOGLE_APPLICATION_CREDENTIALS=[PATH]

하지만 구글 API가 되는지 우선 확인하기 위해 Java 코드로 Credential 을 적용 해 보았다.

GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream("D:\\CredentailFile.json"))
.createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));

구글 문서와 같이 set GOOGLE_APPLICATION_CREDENTIALS=[PATH] 를 시도할 경우 새 세션을 열 때 변수를 다시 설정 해야 하는 문제가 생기므로 다음의 경로로 찾아가서 환경 변수를 직접 넣어주었다.

제어판 > 시스템 > 고급 시스템 설정 > 환경변수

이렇게 하는 이유는 코드에 중요한 정보를 넣으면 코드를 가진 모든 사람이 접근이 가능하므로 CREDENTIALS 파일을 발급 받은 사람에 한해 접근 가능하게 하기 위함이다.

API Key Setting

그렇게 Credetial 문제는 한단락이 되고 기대하는 마음으로 다시 실행해보았지만 The request is missing a valid API key 에러메세지 떴다. 대체 API key는 어떻게 보내야하는 것인가. 이 내용은 구글 문서에 없었다. 그래서 몇가지 도전을 해봤다.

javascript에서 key를 파라미터로 보내 보기

$.ajax({
url: 'https://www.googleapis.com/language/translate/v2?key=apiKey'
, data: '&target=zh&format=html&q={"<code>hello</code>":"login"}'
, type: 'POST'
, success: function(r){
console.log(JSON.parse(r.data.translations[0].translatedText.replace(/&quot;/gi, '"').replace(/\<code\>([^<]+)\<\/code\>/, '$1')));
}
});

이 방법은 키가 인터넷 상에 노출되는 방식이므로, 보안상 java단에서 처리하는 것이 좋다고 생각했다.

자바 코드에서 구글이 제공하는 메서드 사용

TranslateOptions.newBuilder().setApiKey(apiKey);

이렇게 간단하면 좋았겠지만 이 메서드는 @Deprecated 된 것이었다. 거기에 해당하는 메세지를 읽어보았더니 답이 있었다.

.. an API key is looked for in the GOOGLE_API_KEY environment variable.

결론은 윈도우 환경변수에서 변수명을 GOOGLE_API_KEY 로 하고 key 값을 추가하면 된다.

Summary

처음하는 GCP에 막막하였지만 첫 단계를 잘 넘어가였다. 다음은 개발 서버에 반영하는 것인데 AWS EC2에 환경변수를 적용하는 과정을 적어보겠다.