무신사, i18next로 글로벌 서비스의 번역 시스템을 혁신하다!

by DD
3개월 전
조회수 96

무신사 글로벌은 13개국, 2개 언어(영어, 일본어) 지원을 위해 i18next 기반 다국어 시스템을 도입

Lokalise TMS 연동을 통해 번역 워크플로우를 자동화하고, GitHub Actions를 활용하여 PR 자동 생성

번들 사이즈(Bundle Size) 최적화를 위해 동적 import, 불필요한 언어 제거, 언어별 빌드 등 다양한 시도

총 741KB 절감, 네트워크 로딩 시간 최대 800ms 감소의 성능 개선을 달성

i18next 선택과 컴포넌트 적용

무신사 글로벌 프론트엔드 팀은 i18next를 다국어 시스템의 핵심 라이브러리로 선택했다. useTranslation 훅(Hook)을 통해 컴포넌트에서 번역을 쉽게 사용할 수 있으며, 네임스페이스(Namespace)를 활용하여 기능별 번역 파일 분리가 가능하다.

React 통합: useTranslation 훅과 컴포넌트 지원

네임스페이스: 번역 파일을 기능/앱별로 분리

유연한 로딩: 정적/동적 번역 로딩 모두 지원

이러한 유연성은 모노레포 환경에서 각 앱(App)이 필요한 번역만 로드하도록 하여 번들 사이즈(Bundle Size) 최적화에 기여한다.

Lokalise TMS 연동을 통한 번역 관리 자동화

무신사는 Lokalise TMS(Translation Management System)를 활용하여 번역 관리 워크플로우를 자동화했다. Lokalise는 개발자와 번역가 간의 협업을 돕는 플랫폼으로, 웹 기반 에디터에서 번역 작업이 이루어진다. GitHub, S3, Slack 등 써드파티 앱과의 연동을 지원하며, 무신사는 슬랙 알림을 통해 번역 변경 사항을 확인한다.

GitHub 연동: PR 자동 생성 워크플로우

슬랙 알림: 번역 변경 시 알림

API/CLI 지원: 개발 워크플로우에 통합

이러한 자동화는 번역 작업의 효율성을 높이고, 개발 생산성(Development Productivity) 향상에 기여한다.

모노레포 환경에서의 i18n 패키지 진화 과정

무신사 글로벌 프론트엔드 팀은 모노레포 환경에 적합하도록 i18n 패키지를 여러 번 리팩토링했다. 초기에는 모든 번역을 한꺼번에 로드하는 방식으로 시작했으나, 번들 사이즈(Bundle Size) 증가 문제를 겪었다. 이후 동적 import를 도입하여 앱별 번역을 분리하고, 불필요한 언어 제거, VITE_LANG 환경 변수를 활용한 언어별 빌드 등 다양한 최적화를 시도했다.

v1: 모든 번역 통합 로드: 82KB

v2: 앱별 동적 import: async 함수, Tree-shaking 비효율

v3: 한국어(ko) 제거: 불필요한 언어 제거

v4: 정적 import + VITE_LANG 언어별 빌드: 동기 초기화, Tree-shaking 최적화, 언어별 번들 분리

결과적으로 총 741KB 절감, 네트워크 로딩 시간 최대 800ms 감소의 효과를 얻었다.

번역 키 자동 추출 시스템 구축

무신사 글로벌 프론트엔드 팀은 번역 키 관리의 효율성을 높이기 위해 정적 분석(Static Analysis) 기반의 번역 키 자동 추출 시스템을 구축했다. i18next의 saveMissing: true 옵션을 사용하면 누락된 키를 감지할 수 있지만, 빌드 단계에서 미리 감지하기 위해 자체적인 스크립트를 개발했다. 이 스크립트는 정규 표현식(Regular Expression)을 사용하여 코드 내에서 사용된 번역 키를 추출하고, 번역 파일과의 일관성을 검사한다.

정적 분석: 빌드 단계에서 누락된 키 감지

동적 키 패턴 매칭: t(`ranking.location.${locationKey}`)와 같은 동적 키 지원

자동 완성 및 타입 체크: 향후 TypeScript 타입 안전성 확보

이러한 시스템은 개발 과정에서 발생할 수 있는 번역 오류를 줄이고, 유지보수성(Maintainability) 향상에 기여한다.

향후 계획: 타입 안전성 및 S3 기반 동적 로딩

무신사 글로벌 프론트엔드 팀은 i18n 시스템의 지속적인 개선을 위해 다양한 계획을 가지고 있다. 현재는 t('wrong.key')와 같이 잘못된 키를 사용해도 컴파일 에러가 발생하지 않지만, i18next v21+의 i18next.d.ts를 활용하여 타입 안전성을 확보할 예정이다. 또한, S3 기반의 동적 로딩을 통해 번역 업데이트 시 코드 배포 없이 즉시 반영될 수 있도록 개선할 계획이다.

TypeScript 타입 안전성: IDE에서 번역 키 자동 완성, 존재하지 않는 키 사용 시 컴파일 에러

Pluralization 복수형 처리: i18next 권장 방식 적용

S3 기반 동적 로딩: 번역 변경 시 즉시 반영

이러한 계획들은 개발 생산성(Development Productivity) 향상사용자 경험(User Experience) 개선에 기여할 것이다.

모노레포 환경에서 i18next 다국어 시스템 구축하기