티스토리 뷰

golang

Slack Slash Command - 영한 번역(2)

주먹불끈 2019. 7. 15. 19:59

개요

 

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
«   2024/04   »
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
글 보관함