티스토리 뷰
번역 API에 대한 기술 검토 중에 문서 번역에 대한 요청을 받게 됐다.
이런 저런 방법에 대한 고민을 해보다가 직접하는 것보단 통합으로 제공하는 곳이 없을까 찾아봤다.
그리고, GCP에서 제공하는 Document Translation API를 알게 됐다.
Document Translation API는 Cloud Translation API 일부인데, 말 그대로 구글에서 제공하는 번역 API 에서 제공하는 세부 기능 중 하나다.
API를 자유롭게 사용할 수 있으면 좋겠지만, 유료 결제를 등록한 계정만 사용할 수 있다.
카드 등록도 해야 쓸 수 있다.
일단은 무료 크레딧으로 사용해보기로 하고, 하나씩 시작해보자.
1. 서비스 계정 만들고 키 발급 받기
처음 시작은 indexing API와 크게 다르지않다.
서비스 계정을 만들고, Key를 발급받아야하는데 이 과정에서 "역할"을 부여해야 사용 가능하다.
(여기서 많이 헤멨다. 역할을 부여하지 않으면 Permission Deny 에러가 발생한다.)
이전에 indexing api를 쓰면서 프로젝트를 만들어놨었다.
2024.02.02 - [개발/개발팁] - SpringBoot에서 Google Indexing API 사용하기 1
Cloud Translation API를 선택하고, 사용으로 활성화하면 된다.
다만, 위에서 언급했다시피 카드를 등록해야 사용할 수 있다.
다음은 서비스 계정을 생성해야한다.
두번째 이미지에서 Cloud Translation API에 대한 역할을 모두 부여했다.
(관리자까지는 아마 안넣어도 되지 싶다)
다음은 키를 발급해야한다.
IAM 및 관리자 > 서비스 계정 > [지정한 아이디]@[프로젝트명].iam.gserviceaccount.com 클릭 > 키 > 키 추가 > JSON
이제 이 JSON 파일을 불러와서 인증을 하면 API를 사용할 수 있다.
2. 코드
build.gradle
implementation 'com.google.cloud:google-cloud-translate:2.6.0'
GCP를 쓸 때마다 느끼는거지만 인증 방식이 API마다 왜 이렇게 다른지 모르겠다.
선택권을 주려고하는 거였으면, 정리를 조금 더 잘했으면 좋을 것은데 말이다.
키는 resources 디렉토리 아래에 저장했다.
코드 자체는 별게 없다. 인증 - 사용 API 설정 - API 사용 - 변환된 파일 다운로드의 과정이다.
public void googleCloudTranslate(MultipartFile multipartFile) {
try {
// API 키 파일 로드
InputStream keyFile = ResourceUtils.getURL("classpath:translation-key.json")
.openStream();
GoogleCredentials credentials = GoogleCredentials.fromStream(keyFile)
.createScoped(Collections.singletonList(TranslateScopes.CLOUD_TRANSLATION));
// TranslationServiceSettings를 사용하여 credentials 설정
TranslationServiceSettings translationServiceSettings = TranslationServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credentials))
.build();
try (TranslationServiceClient translationServiceClient = TranslationServiceClient.create(translationServiceSettings)) {
String projectId = "[Google Cloud 프로젝트 ID]";
String location = "global"; // 번역 API 서비스 위치 global만되는듯?
String parent = String.format("projects/%s/locations/%s", projectId, location);
// 입력 문서 설정
DocumentInputConfig inputConfig = DocumentInputConfig.newBuilder()
.setContent(ByteString.copyFrom(multipartFile.getBytes()))
.setMimeType("application/pdf")
.build();
// 번역 요청 생성
TranslateDocumentRequest request = TranslateDocumentRequest.newBuilder()
.setParent(parent)
.setTargetLanguageCode("en")
.setDocumentInputConfig(inputConfig)
.build();
// 문서 번역 실행
TranslateDocumentResponse response = translationServiceClient.translateDocument(request);
File outputFile = new File("translated_document.pdf"); // 저장할 파일 경로와 이름 설정
try (OutputStream outputStream = new FileOutputStream(outputFile)) {
response.getDocumentTranslation().writeTo(outputStream);
log.info("번역된 문서가 성공적으로 저장되었습니다: " + outputFile.getAbsolutePath());
} catch (IOException e) {
log.error("번역된 문서를 저장하는 중 오류가 발생했습니다: " + e.getMessage());
}
System.out.println(response.toString());
}
} catch (Exception e) {
log.error("번역 API를 불러오는 중 문제 발생: " + e.getMessage());
}
}
3. 결과
페이지 최상단에 위 문자가 붙는다.
레이아웃을 유지해주는 게 가장 큰 장점이라 생각했는데, 일부 삐져나가는게 있다.
번역 자체는 깔끔하게 되는 것 같다.
4. 문제점
너무 비싸다.
8장짜리 PDF를 딱 5번 번역했는데 3.54 달러가 부과됐다.
가격 때문에라도 서비스로는 적절하지 않아보인다.
google translation의 pricing에서의 설명을 보면 기본 제공하는 크레딧이 있다고 했는데,
내가 설정을 잘못하고 사용한건지 뭔지 모르겠는데 요금이 부과됐다.
AWS나 GCP나 zero bugdet 사용자를 위한 보호가 잘 안되는 것 같다.
(굳이 보호할 이유가 없다고 생각하는 것 같기도 하고)
마치며
결론은 이 API는 사용 불가능하다.
많은 사용자가 보편적으로 사용할 수 있는 번역 서비스를 만드는게 목표였기 때문이다.
가격이 이러면 수익모델이 제대로 갖춰지지 않은 곳에서는 쉽사리 사용하기 힘들지 않을까란 생각이 든다.
(굳이 API를 사용하지 않아도, GPT-4에게 요청을 하면 레이아웃 유지가 안되더라도 번역을 해주긴한다)
마지막으로 BigQuery - Search Console을 연동하는 방법을 마지막으로 GCP는 한동안 보지 않을 것 같다.
BigQuery가 정말 SEO를 사용하는 사람들에게 중요한 지표기 때문에, 한번쯤 짚고 넘어가는 것도 좋을텐데,
또 인증 과정 & 코드가 복잡할 것 같아서 조금 걱정이다.
'개발 > SPRING' 카테고리의 다른 글
Layered 아키텍처에서 Hexagonal 아키텍처로 리팩토링하면서 느낀 점 (0) | 2024.07.04 |
---|---|
OpenFeign 간단 사용법과 FeignException 핸들링하기 (0) | 2024.03.22 |
스프링부트에서 Multipart/form-data 요청의 MultipartFile 정보 로그 남기기 (1) | 2024.02.10 |
SpringBoot에서 Google Indexing API 사용하기 2 - Batch 사용하기 (1) | 2024.02.07 |
스프링부트에서 상태 검사(health check)하기 (0) | 2024.01.26 |
- Total
- Today
- Yesterday
- Spring
- Log
- Elastic cloud
- ChatGPT
- AWS EC2
- 오블완
- AOP
- S3
- cache
- 스프링부트
- elasticsearch
- Kotlin
- docker
- GIT
- 후쿠오카
- AWS
- MySQL
- EKS
- 람다
- OpenFeign
- 티스토리챌린지
- JWT
- lambda
- OpenAI
- springboot
- java
- terraform
- openAI API
- CloudFront
- serverless
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |