안녕하세요. 뤼이드 백엔드팀 송준호입니다.
미국 주식 투자 학습 가이드 앱 베스트웨이(Vest Way)를 글로벌 시장에 출시하며 다국어 지원을 도입하게 되었습니다. 이번 글에서는 다국어 지원을 추가하며 겪은 경험과 이를 효율적으로 구현하기 위해
django-modeltranslation을 도입한 과정을 공유하고자 합니다.
다국어 지원이 필요한 이유
Django는 기본적으로 다국어 지원 기능을 제공합니다. 하지만 이는 로컬 파일에 미리 저장된 번역 데이터를 기반으로 작동하기 때문에 유연성이 부족합니다.
베스트웨이는 블룸버그에서 제공받은 뉴스를 AI로 실시간 번역해 제공하는 서비스입니다. 하루 평균 60개 이상의 뉴스가 업로드되며, 일부 영상은 길이가 몇 시간에 달하기도 합니다. 이러한 콘텐츠의 자막, 요약, 제목 등을 모두 로컬 파일로 관리하는 것은 비효율적이었습니다.
이에 따라 개발 편의성과 유지 보수성을 높이기 위해 보다 효율적인 다국어 지원 솔루션이 필요했습니다.
django-modeltranslation을 선택한 이유
라이브러리 선정 기준은 다음과 같았습니다.
도입 당시에는 한국어만 지원하던 서비스를 영어까지 확장하는 것이 목표였지만, 장기적으로 일본어 등 다른 언어도 추가할 가능성이 있었습니다. 따라서 새로운 언어를 추가할 때마다 코드 수정이 최소화되는 것이 가장 중요한 기준이었습니다.
***본 포스트 작성일(2025–03–13) 기준 일본어도 지원하고 있습니다.***
Django 생태계에서 사용 가능한 여러 다국어 지원 라이브러리를 검토한 결과, django-modeltranslation을 최종적으로 선택했습니다.
django-modeltranslation 적용하기
우선 프로젝트에 django-modeltranslation을 설치합니다.
pip install django-modeltranslation
settings.py에서 다음 설정을 추가합니다.
INSTALLED_APPS = (
...
'modeltranslation',
'django.contrib.admin', # optional
...
)
USE_I18N = True
MODELTRANSLATION_DEFAULT_LANGUAGE = 'ko'
MODELTRANSLATION_LANGUAGES = ("ko", "en")
'django.contrib.admin'보다 앞에 위치해야 함MODELTRANSLATION_LANGUAGES에 없는 언어에 대한 요청은 기본 언어(MODELTRANSLATION_DEFAULT_LANGUAGE)로 제공됩니다.
콘텐츠를 예로 들겠습니다.

원본 영상은 모두 영문으로 된 블룸버그 뉴스였습니다.
번역된 국문 title과 요약이 저장된 상태입니다.
다국어 지원을 원하는 모델이 있는 디렉토리에 translation.py 파일을 추가합니다.

이제 마이그레이션을 적용합니다.
python manage.py makemigrations
python manage.py migrate
마이그레이션을 수행하면 각 언어별로 별도의 필드가 생성되며,
null=True 상태로 추가됩니다.

각 언어별 필드는 일반 필드와 동일하게 생성, 조회, 필터링할 수 있습니다.
#Example
ExampleContent.objects.create(
title_en="SpaceX's Rescue Mission", title_ko="스페이스X의 구조 임무"
)
ExampleContent.objects.filter(summary_en__contains="nvidia")
Django-ModelTranslation의 가장 큰 특징은 감지된 언어에 따라 해당 언어에 맞는 데이터를 자동으로 조회할 수 있다는 점입니다.
#Example
bloomberg_news = ExampleContent.objects.first()
#감지된 언어가 ko일 때
bloomberg_news.title # EU-남아프리카 정상회의에서 기대할 점
#감지된 언어가 ja일 때
bloomberg_news.title # EU-南アフリカ首脳会議から期待できること
ModelTranslation의 언어 감지는 다음과 같은 우선순위에 따라 동작합니다.
Accept-Language 헤더를 확인이 방식을 활용하면 새로운 언어가 추가될 때 코드 수정이 필요 없거나 최소한으로 줄일 수 있습니다.
다국어 콘텐츠 관리 전략
언어별 콘텐츠 필터링
일본어 지원을 추가하면서 기존의 한국어/영어 콘텐츠를 어떻게 관리할지 고민이 필요했습니다. 현실적으로 모든 과거 콘텐츠를 일본어로 번역하는 것은 시간과 비용 측면에서 어려움이 크기 때문입니다.
이를 해결하기 위해 언어별 콘텐츠 필터 기능을 추가했습니다. 이를 통해 사용자는 원하는 언어로 제공되는 콘텐츠만 탐색할 수 있습니다.

블룸버그 영상 콘텐츠의 경우, 항상 해당 함수를 사용하여 쿼리셋에 언어별 필터를 적용합니다. 비록 단순한 함수지만, 경제 콘텐츠를 제공하는 서비스에서는 신뢰도가 핵심 요소입니다. 이 필터를 활용하면 사용자에게 일관된 언어 환경을 제공할 수 있으며, 이는 곧 서비스의 신뢰도를 높이는 데 중요한 역할을 합니다.
번역 누락 방지: 폴백(fallback) 기능
예를 들어, 일본어 사용자가 콘텐츠를 조회할 때 해당 콘텐츠가 DB에는 일본어 버전으로 저장되어 있지만, 실제 번역이 누락된 경우가 있을 수 있습니다.이때 빈 텍스트를 그대로 노출하면 사용자 경험이 저하될 뿐만 아니라, 서비스 신뢰도에도 부정적인 영향을 미칠 수 있습니다.
번역이 누락된 콘텐츠가 있을 경우, 해당 부분을 공란으로 두는 대신
폴백 언어(fallback language) 데이터를 대신 노출하는 방식으로 처리합니다.
MODELTRANSLATION_FALLBACK_LANGUAGES = {
'default': ('en',),
'ja': ('en', 'ko'),
}
이렇게 설정하면:
en)ja) 데이터가 없을 경우, 영어(en) 데이터를 표시ko) 데이터를 표시로 설정됩니다.
특히 영어 브랜드명(예: AMD)처럼 모든 언어에서 동일하게 사용되는 데이터는 영어 버전만 저장해 중복 데이터 저장을 방지할 수 있습니다.
이로 인해 다음과 같은 기대효과가 있습니다.
마무리
이번 글에서는 Django REST Framework에서 django-modeltranslation을 활용한 다국어 지원 방식을 소개했습니다. 이를 통해 유지 보수성을 높이고, 새로운 언어 추가 시 코드 수정 부담을 최소화할 수 있었습니다.
django-modeltranslation은 이 외에도 다양한 편의 기능을 제공하며, 앞으로도 이를 적극 활용해 개발 생산성을 높일 계획입니다. 또한 오픈소스 프로젝트로 운영되는 만큼, 직접 기여하는 방안도 고려 중입니다. 특히, 현재 ManyToManyField가 fallback을 지원하지 않는 문제를 해결할 방법을 고민하고 있습니다.
다국어 지원을 고민하는 개발자들에게 이번 경험이 도움이 되길 바라며, 더 나은 방법이나 개선점이 있다면 의견을 공유해 주세요!


