React/React 다국어

i18next과 다국어 데이터 rest api 연동 방법 및 장단점 비교

atomicdev 2024. 10. 25. 10:06
728x90

i18next를 사용하면 번역 파일을 로컬에 저장하지 않고 REST API로부터 바로 받아서 사용하는 것이 가능합니다. 이를 위해 i18next-http-backend를 사용하여 서버에서 번역 데이터를 요청하고, 응답을 받아 번역을 처리할 수 있습니다.

다음은 REST API를 사용하여 번역 데이터를 가져오는 방법을 설명하는 단계입니다.


1. i18next-http-backend 설치

먼저, i18next-http-backend 플러그인을 설치하여 REST API와 통합할 수 있도록 합니다.

npm install i18next-http-backend

2. i18n.js 설정 변경 (REST API 사용)

i18n.js 파일에서 i18next-http-backend를 사용하여 번역 데이터를 REST API로부터 가져오도록 설정합니다.

// src/i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import Backend from 'i18next-http-backend'; // HTTP 백엔드 플러그인
import LanguageDetector from 'i18next-browser-languagedetector';

i18n
  .use(Backend) // REST API를 통한 데이터 로딩
  .use(LanguageDetector) // 브라우저 언어 감지
  .use(initReactI18next) // React와 통합
  .init({
    backend: {
      // REST API 경로 설정
      loadPath: 'https://api.example.com/translations/{{lng}}', // REST API의 URL
    },
    fallbackLng: 'en', // 기본 언어 설정
    debug: true,
    interpolation: {
      escapeValue: false, // XSS 방지를 위한 옵션
    },
  });

export default i18n;

설명:

  • loadPath: 번역 데이터를 가져올 REST API 경로입니다. 여기서 {{lng}}는 선택된 언어 코드로 대체됩니다. 예를 들어, i18n.changeLanguage('ko')를 호출하면 API 요청이 **https://api.example.com/translations/ko**로 전송됩니다.
  • REST API의 응답은 번역 내용을 JSON 형식으로 반환해야 합니다.

3. REST API 예시 응답

서버에서 제공하는 REST API가 다음과 같은 형식의 JSON 데이터를 반환해야 합니다. API의 응답 데이터는 로컬 JSON 파일에서 사용하는 데이터 구조와 동일해야 합니다.

예시 응답 (한국어):

{
  "welcome": "애플리케이션에 오신 것을 환영합니다!",
  "description": "이것은 자동 언어 변경 애플리케이션입니다."
}

예시 응답 (영어):

{
  "welcome": "Welcome to the application!",
  "description": "This is an automatic language switching application."
}

예시 응답 (아랍어):

{
  "welcome": "مرحبًا بك في التطبيق!",
  "description": "هذا تطبيق تغيير اللغة التلقائي."
}

4. App.js 구현

번역 데이터를 REST API에서 받아오면 기존의 App.js는 그대로 사용할 수 있습니다. i18n.changeLanguage를 호출하면 API로부터 번역 데이터를 받아와서 렌더링할 수 있습니다.

// src/components/App.js
import React, { useEffect, useState, Suspense, startTransition } from 'react';
import { useTranslation } from 'react-i18next';
import i18n from 'i18next';
import '../i18n'; // i18next 설정 파일 import

const App = () => {
  const { t } = useTranslation();
  const [languageIndex, setLanguageIndex] = useState(0);
  const languages = ['ko', 'en', 'ar']; // 언어 목록

  useEffect(() => {
    const interval = setInterval(() => {
      startTransition(() => {
        setLanguageIndex((prevIndex) => (prevIndex + 1) % languages.length); // 언어 순환
      });
    }, 10000); // 10초마다 언어 변경

    return () => clearInterval(interval); // 컴포넌트 언마운트 시 타이머 해제
  }, []);

  useEffect(() => {
    i18n.changeLanguage(languages[languageIndex]); // 언어 변경
  }, [languageIndex]);

  return (
    <Suspense fallback={<div>Loading translations...</div>}>
      <div>
        <h1>{t('welcome')}</h1>
        <p>{t('description')}</p>
      </div>
    </Suspense>
  );
};

export default App;

5. REST API에서의 처리

서버에서 각 언어에 대한 번역 데이터를 처리하여 JSON 형식으로 반환해야 합니다. 예를 들어, Node.js나 다른 백엔드 서버에서 /translations/:lng 경로로 요청을 처리하고, 언어에 맞는 JSON 파일을 반환하는 API를 구현할 수 있습니다.


6. 결론

이제 REST API를 사용하여 번역 데이터를 실시간으로 서버에서 받아오고, i18next를 통해 언어 변경을 처리할 수 있습니다. 이를 통해 번역 데이터 관리가 서버에서 이루어지며, JSON 파일을 로컬에 저장할 필요가 없으므로 동적 데이터 처리에 유리합니다.

이 방식은 번역 데이터를 실시간으로 서버에서 받아오는 서비스에 매우 유용하며, 번역 파일이 변경될 때마다 애플리케이션을 재배포하지 않고, 서버에서 번역 내용을 업데이트할 수 있다는 장점이 있습니다.

번역 데이터를 관리하는 두 가지 방법

 

*** 장단점 비교 ***

 

REST API를 사용하여 번역 데이터를 동적으로 받아오는 방식과 JSON 파일로 번역 데이터를 로컬에 저장하는 방식은 각각 장단점이 있으며, 애플리케이션의 요구 사항에 따라 선택할 수 있습니다. 아래에서 두 가지 방식의 장점단점을 설명해드리겠습니다.


1. REST API로 번역 데이터를 받아오는 방법

장점:

  1. 동적인 데이터 관리:
    • 번역 데이터를 서버에서 실시간으로 가져오기 때문에, 번역 수정 및 업데이트가 필요할 때 서버에서만 업데이트하면 됩니다. 클라이언트 측의 애플리케이션을 재배포할 필요가 없기 때문에 빠른 유지보수가 가능합니다.
  2. 확장성:
    • 여러 개의 번역 파일을 관리할 때, 특히 많은 언어를 지원할 때 유리합니다. 서버 측에서 모든 번역 파일을 중앙에서 관리하고 필요할 때만 클라이언트로 전송할 수 있습니다.
  3. 번역 파일의 크기 감소:
    • 클라이언트에서 필요한 언어만 동적으로 로드하므로, 초기 페이지 로딩 시 모든 언어 데이터를 불러오지 않아도 됩니다. 이는 앱 성능에 긍정적인 영향을 미칩니다.
  4. 보안:
    • 번역 파일을 서버에만 저장하면, 민감한 내용(예: 계약서, 법률 관련 번역 등)을 클라이언트에 직접 저장하지 않기 때문에 보안이 더 강화됩니다.

단점:

  1. 의존성:
    • 애플리케이션이 번역 데이터를 REST API로 받아오므로, 인터넷 연결이나 서버의 가용성에 의존합니다. 서버 장애나 네트워크 문제 발생 시 번역 데이터를 불러오지 못할 수 있습니다.
  2. 지연 시간:
    • REST API를 통해 번역 데이터를 가져오는 동안 네트워크 지연이 발생할 수 있습니다. 번역 데이터가 클라이언트에 로드되기 전까지는 페이지에 로딩 지연이 발생할 수 있습니다.
  3. 추가적인 서버 부하:
    • REST API 호출을 통해 여러 클라이언트가 동시에 번역 데이터를 요청하면, 서버에 부하가 발생할 수 있습니다. 많은 트래픽이 발생할 경우 서버 성능에 영향을 줄 수 있습니다.

2. JSON 파일로 번역 데이터를 로컬에 저장하는 방법

장점:

  1. 빠른 로딩:
    • 번역 데이터를 로컬 JSON 파일로 저장하면 애플리케이션이 초기 로딩 시 파일을 바로 불러오기 때문에 지연 시간이 거의 없습니다. 이는 오프라인 상태에서도 유용합니다.
  2. 단순한 구조:
    • JSON 파일을 로컬에 저장하는 방식은 비교적 간단하며, REST API를 호출하는 데 필요한 추가적인 서버 구성 없이도 동작합니다.
  3. 서버 의존성 감소:
    • 모든 번역 파일이 클라이언트에 있으므로, 번역 데이터를 서버로부터 요청할 필요가 없으며, 인터넷 연결이나 서버 가용성에 의존하지 않습니다. 오프라인 애플리케이션에서 유리합니다.
  4. 일관성:
    • 번역 파일을 한 번 로컬에 저장하면, 동일한 파일을 반복해서 로드할 필요가 없기 때문에 일관된 성능을 보장합니다.

단점:

  1. 번역 데이터 업데이트 어려움:
    • 번역 데이터가 변경될 경우, 클라이언트 측에 저장된 JSON 파일을 수정 후 애플리케이션을 다시 배포해야 합니다. 이는 번역 업데이트 빈도가 잦은 경우 불편할 수 있습니다.
  2. 번역 파일의 크기 증가:
    • 애플리케이션에서 많은 언어를 지원하는 경우, 모든 언어의 JSON 파일을 로컬에 저장해야 하므로 파일 크기가 커질 수 있습니다. 이는 초기 로딩 속도를 늦출 수 있습니다.
  3. 유연성 부족:
    • 번역 데이터를 서버에서 관리하지 않으므로, 번역 수정 시 중앙에서 유연하게 관리하기 어렵습니다. 또한 특정 사용자나 지역에 맞춘 동적 번역 데이터를 제공하는 데 한계가 있을 수 있습니다.
  4. 보안:
    • 번역 파일이 클라이언트에 저장되면, 누구나 파일에 접근하여 데이터를 수정하거나 열람할 수 있습니다. 민감한 내용이 포함된 경우에는 보안 이슈가 발생할 수 있습니다.

3. 두 방법의 선택 기준

  • REST API로 번역 데이터를 받아오는 방식은 번역 데이터의 실시간 업데이트가 필요하고, 많은 언어를 지원해야 하며, 중앙에서 동적으로 관리해야 하는 대규모 애플리케이션에 적합합니다. 예를 들어, 대규모 웹 서비스다국어 지원이 필요한 애플리케이션에서는 REST API 방식을 사용하는 것이 효율적입니다.
  • 로컬 JSON 파일을 사용하는 방식은 애플리케이션이 작거나, 번역 데이터가 자주 변경되지 않는 경우, 그리고 오프라인 상태에서 번역을 제공해야 할 때 유리합니다. 또한, 번역 데이터가 상대적으로 적은 경우에는 JSON 파일을 사용하는 것이 간단하고 성능상 이점이 있을 수 있습니다.

결론

  • REST API 방식실시간 업데이트, 확장성, 번역 파일의 크기 최적화와 같은 장점이 있지만, 네트워크 지연서버 의존성 등의 단점이 있습니다.
  • 로컬 JSON 파일 방식빠른 로딩, 오프라인 지원, 단순성에서 이점이 있지만, 번역 데이터를 중앙에서 관리하기 어렵고, 번역 업데이트가 번거로울 수 있습니다.

두 방식 중 하나를 선택할 때는 애플리케이션의 규모와 요구 사항에 맞게 적합한 방법을 선택하는 것이 중요합니다.

728x90