업무를 하다 보면 늘 새로운 문제를 만납니다. 이번에는 번역 관련 API에서 번역 가능 언어를 추가해 달라는 요청이 왔습니다. 처음에는 단순히 번역 가능 언어 코드를 추가하고 끝낼 작업처럼 보였지만, 막상 작업을 시작하면서 기존 코드에서 숨겨진 문제를 발견하게 되었습니다. 그리고 그 문제를 개선하는 과정에서 많은 것을 배웠습니다. 이번 글에서는 그 경험을 나누고자 합니다.
1. 문제의 시작: 느린 번역 처리 시간
“번역 가능 언어 목록에 새로운 언어를 추가해 주세요”라는 요청을 받았습니다. 요청 자체는 간단했지만, 테스트를 진행하던 중 의외의 문제가 드러났습니다. 번역 API를 호출할 때 번역 처리 시간이 너무 오래 걸렸던 것입니다. 약 4,500자의 텍스트를 번역하는 데 17초가 걸렸죠.
“왜 이렇게 오래 걸리지?” 하는 의문에서 코드를 살펴보니 문제는 바로 for-loop 안에서 매번 번역 API로 HTTP 요청을 보내고 있다는 것이었습니다.
2. 문제의 원인: 반복적인 API 호출
from google.cloud import translate_v2 as translate
def translate_text(text):
translate_client = translate.Client()
lines = text.split("\n") # 개행 문자 기준으로 텍스트 분리
translated_lines = []
for line in lines:
if line.strip(): # 빈 줄은 건너뜀
response = translate_client.translate(line, target_language="ko")
translated_lines.append(response["translatedText"])
return "\n".join(translated_lines)
-- 예시 용으로 작성된 코드 입니다 --
• text.split("\n")로 개행 문자를 기준으로 텍스트를 분리합니다.
• 각 줄을 번역 API에 개별 요청(translate_client.translate)합니다.
• 요청이 많아질수록 네트워크 레이턴시가 누적되고, 성능이 저하됩니다.
기존 코드는 텍스트를 ”\n”(개행 문자) 기준으로 분리한 뒤, 각 줄을 번역 API에 개별적으로 요청하고 있었습니다. 즉, 줄이 많아질수록 API 요청 횟수가 기하급수적으로 늘어나고, 이로 인해 전체 처리 시간이 길어졌던 겁니다.
문제를 간단히 정리하면 다음과 같았습니다:
• 4,500자 기준으로 개행 문자가 많을수록 HTTP 요청 횟수가 늘어남.
• API 호출은 네트워크 레이턴시와 처리 시간이 포함되기 때문에, 반복 호출은 성능을 크게 저하시킴.
• 전체 작업 시간이 비효율적으로 길어짐.
3. 개선 방법: API 문서를 참고해 새로운 구조로 변경
구글 클라우드 번역 API의 공식 문서에서 translate 메서드가 **문자열(str)**뿐 아니라 리스트(list) 형태로도 요청할 수 있다는 점을 확인했습니다.
translate(
values,
target_language=None,
format_=None,
source_language=None,
customization_ids=(),
model=None,
)
values | str or list String or list of strings to translate. |
즉, 개행 문자로 나뉜 텍스트를 한 번에 리스트 형태로 API에 전달하면, 응답 또한 번역된 결과를 담은 딕셔너리 리스트로 반환된다는 것을 알게 되었습니다.
4. 개선 코드: 한 번의 요청으로 처리
구글 번역 API는 긴 텍스트를 한 번에 처리할 수 있기 때문에, 텍스트 전체를 API로 전달하도록 코드를 수정했습니다. 개선된 코드는 아래와 같습니다:
from google.cloud import translate_v2 as translate
def translate_text_optimized(text):
translate_client = translate.Client()
# API 요청을 한 번만 수행
splitted_text = text.split("\n")
response = translate_client.translate(splitted_text, target_language="ko")
# ... 그외 처리
return translated_text
• text 전체를 API로 전달하여 한 번의 요청으로 번역을 처리합니다.
• 불필요한 for-loop와 여러 HTTP 요청을 제거했습니다.
4. 결과: 성능의 극적 개선
• 개선 전: 4,500자 기준 번역 처리 시간 약 17초
• 개선 후: 같은 텍스트를 번역하는 데 약 0.9초 (1초 이내로 단축)
이 작업을 통해 요청 횟수를 대폭 줄이고, API의 성능을 최대한 활용할 수 있었습니다.
마무리하며
작은 문제처럼 보였던 비효율적인 구조가 전체 번역 프로세스의 성능을 좌우한다는 점을 이번 경험을 통해 실감했습니다. 특히 API의 문서를 잘 읽고 활용하면 단순한 최적화 작업에도 큰 성과를 낼 수 있다는 것을 배웠습니다. 앞으로도 문서를 꼼꼼히 살피며 개선할 수 있는 부분을 찾아갈 계획입니다.
'프로그래밍' 카테고리의 다른 글
6초에서 0.2초로: 레거시 API 성능 개선 이야기 (0) | 2024.12.14 |
---|---|
시스템 로그 페이지 조회 성능 최적화 (0) | 2024.04.04 |
F-Lab 자바 백엔드 코스 멘토링 후기 (1) | 2023.12.03 |
MSW? (3) | 2023.11.23 |
REST API란? (0) | 2023.09.06 |