티스토리 뷰
개요
Slack Slash Command 로 영한 번역을 해보자.
이를 위해 Google 의 Cloud Functions 와 Translation API 를 이용해본다.
목차
구구절절이 적다보니 하나의 게시물에 모두 적으면 정신이 없다.
아래와 같이 세 부분으로 나누어서 하나씩 정리해가며 포스팅 해본다.
첫번째 포스팅. Slack Slash Command 를 만들고, 로컬 PC 에서 서버를 구동해본다. - 겸사겸사 Slack Slash Command 로 전달되는 내용을 들여다본다. - 링크: https://jusths.tistory.com/136 두번째 포스팅. 로컬 PC 에서 Translation API 를 호출해본다. - 비용과 API 사용법을 알아보자 세번째 포스팅. 구현한 내용을 Cloud Functions 에 올려서 서비스한다. - 별도의 서버 구축없이 위의 기능을 돌려보자. 비용도 확인해본다. |
구현 코드 보기
GitHub 링크: https://github.com/nicewook/slack-translate/tree/Implementation_Phase2
- 두번째 포스팅 내용의 구현 역시 별도의 branch 로 빼두었음
Verification 부분에 Timeout Check 추가
|
Slack 공식 링크: https://api.slack.com/docs/verifying-requests-from-slack github.com/nlopes/slack 관련코드: https://sourcegraph.com/github.com/nlopes/slack/-/blob/security.go#L55:6
공식 링크와 nlopes/slack 패키지의 코드를 참고하여 (=복붙) Timeout 부분을 추가하였음 보낸지 5분이나 지난 메시지가 왔다는건 문제가 있다 생각하는 거다.
1. strconv.ParseInt() - 정수형 문자열을 10진수로 변환하는데 기본적으로 64비트로 변환한다 (int64) - 근데 더 작은 32 등으로 정의할 수도 있다. - 리턴값은 int64 이다.
2. time.Unix() - 첫번째 파라미터는 초, 뒤에는 나노초이다. - 이렇게 입력된 값을 유닉스타임 형태로 변환해 준다.
3. time.Since() - 현재 시간에서 입력된 시간을 빼주며 time.Duration 타입으로 nanoseconds 단위로 리턴된다.
4. abs64() 로 양수값으로 확실하게 변환후 계산 - int64 정수의 절대값을 비트 연산자를 활용하여 가장 빠르게 계산하는 법이다. - 참고링크: http://cavaliercoder.com/blog/optimized-abs-for-int64-in-go.html
5 * time.Minute 는 나노세컨드 단위로 값을 계산해줌. 흠.
|
Translation API 를 써보자
공식 페이지 링크: https://cloud.google.com/translate/docs/
v2 with golang lilbrary 예제: https://cloud.google.com/translate/docs/quickstart-client-libraries
예제만 따라가도 구현이 어렵지 않다.
API v2 는 비용이 발생하고, v3beta1 은 무료 사용이 가능하지만,
v3beta1 은 아직 Golang library 지원을 않기에 v2 로 구현하였음
1) 준비사항
- 너무 자세한 설명은 생략한다.
GCP Console project
1) GCP 프로젝트 하나 생성 2) 프로젝트의 Cloud Translation API 를 Enable 3) service account 를 생성 4) private key 를 json 파일로 다운로드 받는다. |
1) Translation API 를 사용하려면, GCP (Google Cloud Platform) 의 계정이 있어야 하고 Project 도 하나 생성하고, Billing 설정이 되어 있어야 한다. 2) 마지막으로 Cloud Translation API 를 Enable 해두어야 한다. 3) 이러한 API 서비스를 이용하기 위한 service account 를 생성하고, 4) 생성한 service account 의 private key 를 json 파일로 로컬에 다운받아 두어야 한다. |
이 전체를 풀어서 이야기하면 아래와 같다.
- GCP 에서 제공하는 서비스를 이용하려다 보니, GCP 에 계정을 만들고, 비용이 발생할 경우 지불방법을 설정해두어야 한다.
- 그 다음엔 사용하고픈 Cloud Translation API 서비스를 Enable 해준 다음에,
- 외부에서 이 서비스에 접근할 때 사용할 서비스 계정을 만들고, 그 계정으로 접근할 수 있는 private key 를 json 파일로 다운받아 놓는다.
환경변수 설정
위에서 다운받은 private key 가 담긴 json 파일의 위치를 환경변수로 저장한다.
$set GOOGLE_APPLICATION_CREDENTIALS=c:\myproject\my_credential.json 이런 식이다.
→ 이렇게 해두면 translation 관련 library 에서 이 환경변수를 찾아 읽어 사용할 것이다.
2) 라이브러리 설치 및 사용
라이브러리 설치: go get -u cloud.google.com/go/translate
사용은 아래와 같이 해주면 된다. 어려운 것이 없어서 실제 구현한 코드를 바로 설명하도록 한다.
|
1) slack.SlackCommandParse()
- 지난번에 보았던 대로 slack 패키지를 이용해서 파싱해준다. - 파싱한 것중 여기서 쓸 것은 s.Text 뿐이다. - s.Text 는 slack 창에서 /tr <English to translate> 라고 칠 경우 < > 안에 쓴 문장이다.
2) translate.NewClient()
- 이제 번역을 위한 클라이언트를 생성해둔다. - Google 의 Transation API 를 서비스 해주는 서버와 통신을 할 녀석이다.
3) check if it's Korean, and language.Parse()
- 한국어의 유니코드 범위를 이용하여, - 그 안에 들어가는 문자가 하나라도 있으면 한글을 영어로 번역하게 하겠다는 것이다. (thanks to 권경모님) - language.Parse 안에 번역하고픈 타겟 언어를 설정해준다. 한글이면 영어, 영어이면 한글이 타겟이다.
4) client.Translate()
- 이 함수에 번역하고픈 문장과 타켓 언어를 설정해주면 번역된 결과가 리턴된다.
5) formatting and sending back to Slack
- 이후 부분은 Slack 에 리턴하기 위해 format 를 정해주고 보내는 것이 전부이다. - 이 부분 역시 다양한 기능과 포맷을 고민해볼 수 있겠다. |
실제 구동 프로세스
1) 외부에서 local PC 에 접근할 수 있도록 $ssh -o ServerAliveInterval=60 -R 80:localhost:8080 serveo.net 실행
2) SLACK_SIGNING_SECRET 과 GOOGLE_APPLICATION_CREDENTIALS 를 설정
- SLACK_SIGNING_SECRET 는 나의 Slack App 에서 보낸 것인지 검증하는 용도
- GOOGLE_APPLICATION_CREDENTIALS 는 나의 GCP Project 에서 Enable 한 Colud Transation API 를 쓸 권한이 있는 Servcie Account 가 맞는지 확인 하는 용도
3) go run main.go 실행
Slack App 을 설치해둔 Workspace 에서 실행해본 결과는 아래와 같다.
번역의 특성상 본인만 보이도록 (Only visible to you) 설정해두었다. 기본값이며 이걸 채널 전체 참여자가 볼 수 있게 변경할 수도 있다.
|
|
비용
비용 링크: https://cloud.google.com/translate/pricing
비용이 든다고는 하지만 자신이 속한 특정 Workspace 에만 적용하고 사용한다면 부담은 미미한 수준이다.
백만개의 문자당 20달러라 하는데, 영문 PDF 200 여 페이지의 문자를 확인해보니 약 40만 자 정도였다.
쿼타와 제한
링크: https://cloud.google.com/translate/quotas
제한이라고 하기도 애매한 제한이지만
- 하루 10억 문자까지 번역 가능하고 (그 와중에 최대 제한도 없음)
- 100 초 마다 백만 문자까지로 제한하며
- 한 유저가, 한 프로젝트에서, 100초마다 십만 문자까지 번역이 가능하다.
GCP 콘솔의 해당 API 페이지에서 쿼타를 제한해줄 수도 있다.
- 쫄보인지라 많이 줄여두었음.
기본값 |
변경한 쿼타 |
|
|
'golang' 카테고리의 다른 글
Concurrency Is Not Parallelism (0) | 2019.07.19 |
---|---|
Slack Slash Command - 영한 번역(3) (0) | 2019.07.16 |
Slack Slash Command - 영한 번역(1) (0) | 2019.07.12 |
gRPC SSL/TLS 3. 실제 구현 (9) | 2019.07.01 |
gRPC SSL/TLS 2. SSL/TLS 에 대하여 (0) | 2019.07.01 |
- Total
- Today
- Yesterday
- Bug
- strange
- 노션
- solid
- 잡학툰
- folklore
- websocket
- github
- 영화
- API
- intellij
- golang
- 독서후기
- 독서
- OpenAI
- Gin
- JIRA
- 체호프
- bun
- 제이펍
- 2023
- 인텔리제이
- agile
- Shortcut
- go
- 클린 애자일
- pool
- notion
- postgres
- ChatGPT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |