๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Lect & Tip/node, Angular, React

๋‹ค๊ตญ์–ด ์ง€์›์„ ์œ„ํ•œ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ i18n ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

by ๊น€๋ฌด์•ผํ˜ธ3ํ˜ธ 2025. 9. 1.
๋ฐ˜์‘ํ˜•

๋‹ค๊ตญ์–ด ์ง€์›์„ ์œ„ํ•œ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ i18n ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

์ตœ๊ทผ ๊ธ€๋กœ๋ฒŒ ์‹œ์žฅ์œผ๋กœ ํ™•์žฅ๋˜๋Š” ์›น ์„œ๋น„์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ๋ฌธํ™”๊ถŒ์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ง€์›ํ•˜๋Š” ๋‹ค๊ตญ์–ด ๊ธฐ๋Šฅ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ(React)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ตญ์ œํ™”(i18n) ๊ธฐ๋Šฅ์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ˜• ์–ธ์–ด ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ตญ์ œํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ react-i18next์™€ ํ•จ๊ป˜ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๋‹ค๊ตญ์–ด ์ง€์› ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ตญ์ œํ™”(i18n)์˜ ์ค‘์š”์„ฑ๊ณผ ๋ฆฌ์•กํŠธ์—์„œ์˜ ์ ์šฉ ํ•„์š”์„ฑ

๋‹ค๊ตญ์–ด ์ง€์›์€ ๋‹จ์ˆœํžˆ ์—ฌ๋Ÿฌ ์–ธ์–ด๋กœ ๋ฒˆ์—ญ๋œ ํ…์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI), ๋‚ ์งœ ๋ฐ ์ˆซ์ž ํ˜•์‹, ํ™”ํ ๋‹จ์œ„ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธํ™”์  ์š”์†Œ๋ฅผ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ : ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๊ตญ์–ด๋กœ ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ ‘ํ•  ๋•Œ, ๋ณด๋‹ค ์นœ๊ทผํ•˜๊ณ  ์ง๊ด€์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์žฅ ํ™•๋Œ€: ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•จ์œผ๋กœ์จ, ๊ธ€๋กœ๋ฒŒ ์‹œ์žฅ ์ง„์ถœ ๋ฐ ๋‹ค์–‘ํ•œ ๊ตญ๊ฐ€์˜ ์‚ฌ์šฉ์ž ํ™•๋ณด์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธํ™”์  ์ฐจ์ด ๋ฐ˜์˜: ๋‚ ์งœ, ์‹œ๊ฐ„, ํ™”ํ ๋“ฑ ๋ฌธํ™”์— ๋”ฐ๋ฅธ ํ‘œ๊ธฐ ๋ฐฉ์‹์„ ๋ฐ˜์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์‹ ๋ขฐ๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋‹จ์ˆœํžˆ ํ…์ŠคํŠธ๋ฅผ ๋ฒˆ์—ญํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ ๋ฒˆ์—ญ ๋ฌธ์ž์—ด์„ ๊ด€๋ฆฌํ•˜๊ณ , ๋™์ ์œผ๋กœ ์–ธ์–ด๋ฅผ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


react-i18next ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๊ฐœ ๋ฐ ์„ค์น˜

react-i18next๋Š” i18next์˜ ๋ฆฌ์•กํŠธ ์ „์šฉ ๋ž˜ํผ๋กœ, ๊ฐ•๋ ฅํ•œ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ๊ณผ ์œ ์—ฐํ•œ ์„ค์ • ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์‰ฝ๊ฒŒ ๋‹ค๊ตญ์–ด ํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์‚ฌ์šฉ์ž ์–ธ์–ด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ๋ฐฉ๋ฒ•

ํ”„๋กœ์ ํŠธ์— react-i18next์™€ i18next๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

npm install react-i18next i18next

๋˜๋Š” yarn์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

yarn add react-i18next i18next

๊ตญ์ œํ™” ์ดˆ๊ธฐ ์„ค์ • ๋ฐ ๊ตฌ์„ฑ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— i18n.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ, i18next ์ดˆ๊ธฐ ์„ค์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์–ธ์–ด ์„ค์ •๊ณผ ๋ฆฌ์†Œ์Šค(resource)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

// ์–ธ์–ด๋ณ„ ๋ฒˆ์—ญ ๋ฆฌ์†Œ์Šค ์„ค์ •
const resources = {
  en: {
    translation: {
      welcome: 'Welcome to our website!',
      description: 'This is a sample description in English.',
      buttonText: 'Click Here',
    },
  },
  ko: {
    translation: {
      welcome: '์ €ํฌ ์›น์‚ฌ์ดํŠธ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!',
      description: '์ด๊ฒƒ์€ ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑ๋œ ์ƒ˜ํ”Œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.',
      buttonText: '์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜์„ธ์š”',
    },
  },
  es: {
    translation: {
      welcome: '¡Bienvenido a nuestro sitio web!',
      description: 'Esta es una descripción de muestra en español.',
      buttonText: 'Haz clic aquí',
    },
  },
};

i18n
  .use(initReactI18next) // ๋ฆฌ์•กํŠธ์™€ ์—ฐ๊ฒฐ
  .init({
    resources,
    lng: 'en', // ๊ธฐ๋ณธ ์–ธ์–ด ์„ค์ •
    fallbackLng: 'en', // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์–ธ์–ด๋กœ ๋Œ€์ฒด
    interpolation: {
      escapeValue: false, // ๋ฆฌ์•กํŠธ๋Š” XSS ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ์ „ํ•จ
    },
  });

export default i18n;

์œ„ ํŒŒ์ผ์€ ๋‹ค๊ตญ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ธฐ๋ณธ ์–ธ์–ด๋ฅผ ์˜์–ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, fallbackLng ์˜ต์…˜์„ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒˆ์—ญ์ด ์—†์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์–ธ์–ด๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.


๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ i18next ์‚ฌ์šฉํ•˜๊ธฐ

์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด, ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. react-i18next์—์„œ๋Š” useTranslation ํ›…์„ ์ œ๊ณตํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฒˆ์—ญ ๋ฌธ์ž์—ด์„ ์‰ฝ๊ฒŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ: ๋‹ค๊ตญ์–ด ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ

์•„๋ž˜ ์˜ˆ์ œ๋Š” ๋‹ค๊ตญ์–ด ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์˜ ํ…์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์–ธ์–ด ์„ค์ •์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

// LanguageSwitcher.jsx
import React from 'react';
import { useTranslation } from 'react-i18next';
import styled from 'styled-components';

const Button = styled.button`
  padding: 10px 20px;
  margin: 5px;
  background-color: #1976d2;
  color: #fff;
  border: none;
  border-radius: 4px;
  cursor: pointer;

  &:hover {
    background-color: #1565c0;
  }
`;

const LanguageSwitcher = () => {
  const { i18n } = useTranslation();

  const changeLanguage = (lng) => {
    i18n.changeLanguage(lng);
  };

  return (
    <div>
      <Button onClick={() => changeLanguage('en')}>English</Button>
      <Button onClick={() => changeLanguage('ko')}>ํ•œ๊ตญ์–ด</Button>
      <Button onClick={() => changeLanguage('es')}>Español</Button>
    </div>
  );
};

export default LanguageSwitcher;

์˜ˆ์ œ: ๋‹ค๊ตญ์–ด ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ

๋‹ค์Œ ์˜ˆ์ œ๋Š” ๋‹ค๊ตญ์–ด ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

// WelcomeMessage.jsx
import React from 'react';
import { useTranslation } from 'react-i18next';
import styled from 'styled-components';

const MessageContainer = styled.div`
  padding: 20px;
  text-align: center;
`;

const WelcomeMessage = () => {
  const { t } = useTranslation();

  return (
    <MessageContainer>
      <h2>{t('welcome')}</h2>
      <p>{t('description')}</p>
    </MessageContainer>
  );
};

export default WelcomeMessage;

์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” useTranslation ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ, i18next์— ์„ค์ •๋œ ๋ฒˆ์—ญ ๋ฌธ์ž์—ด์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. t('welcome')์™€ ๊ฐ™์ด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” ๋ฒˆ์—ญ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์–ธ์–ด๋ฅผ ์ „ํ™˜ํ•˜๋ฉด ์ž๋™์œผ๋กœ UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.


๋‹ค๊ตญ์–ด ์ง€์› ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ์ „๋žต ๋ฐ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

๋‹ค๊ตญ์–ด ์ง€์›์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ „๋žต๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ

  • ๋ฒˆ์—ญ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ: ํ…์ŠคํŠธ๋ฅผ ์ง์ ‘ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹ , ๋‹ค๊ตญ์–ด ์ง€์›์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฒˆ์—ญ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋ฒˆ์—ญ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ , ๋‹ค๊ตญ์–ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ ํ™œ์šฉ: ๋‹ค๊ตญ์–ด ์ง€์› UI์—์„œ๋Š” ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ๊ณผ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ์Šคํƒ€์ผ์ด๋‚˜ ํ…Œ๋งˆ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…์ŠคํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์–ธ์–ด ์ „ํ™˜ ์‹œ UI ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฒˆ์—ญ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

  • ์™ธ๋ถ€ ํŒŒ์ผ ๊ด€๋ฆฌ: ๋ฒˆ์—ญ ๋ฆฌ์†Œ์Šค๋Š” JSON ํŒŒ์ผ ๋“ฑ ์™ธ๋ถ€ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉด, ์–ธ์–ด ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ • ์‹œ ๊ฐœ๋ฐœ์ž์™€ ๋ฒˆ์—ญ ๋‹ด๋‹น์ž ๊ฐ„์˜ ํ˜‘์—…์ด ์›ํ™œํ•ด์ง‘๋‹ˆ๋‹ค.
  • ๋™์  ๋กœ๋”ฉ: ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ฒˆ์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜๋Š” ๋Œ€์‹ , ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์–ธ์–ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฒˆ์—ญ ํŒŒ์ผ๋งŒ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ „๋žต์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

3. ์ ‘๊ทผ์„ฑ๊ณผ SEO ๊ณ ๋ ค

  • ARIA ์†์„ฑ ํ™œ์šฉ: ๊ตญ์ œํ™”๋œ UI์—์„œ๋„ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ARIA ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , SEO ์ธก๋ฉด์—์„œ ์ค‘์š”ํ•œ ๋ฉ”ํƒ€ ํƒœ๊ทธ๋ฅผ ๊ฐ ์–ธ์–ด์— ๋งž๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • URL ๊ตฌ์กฐ: ๋‹ค๊ตญ์–ด ์ง€์› ์›น์‚ฌ์ดํŠธ์—์„œ๋Š” ์–ธ์–ด๋ณ„ URL ๊ตฌ์กฐ(์˜ˆ: /en, /ko, /es)๋ฅผ ์ ์šฉํ•˜์—ฌ, ๊ฒ€์ƒ‰ ์—”์ง„์ด ๊ฐ ์–ธ์–ด๋ณ„ ์ฝ˜ํ…์ธ ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์‹ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

4. ํ…Œ์ŠคํŠธ์™€ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ

  • ๋‹ค๊ตญ์–ด ํ…Œ์ŠคํŠธ: ๊ฐ ์–ธ์–ด๋ณ„๋กœ UI์™€ ๋ฒˆ์—ญ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‹ค์ œ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์„ ์ง€์†์ ์œผ๋กœ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ: Jest๋‚˜ React Testing Library์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ๋‹ค๊ตญ์–ด ์ง€์› ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘์„ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆํ•˜๋ฉด, ์—…๋ฐ์ดํŠธ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ํ”„๋กœ์ ํŠธ ์ ์šฉ ์‚ฌ๋ก€

๋‹ค๊ตญ์–ด ์ง€์› ๊ธฐ๋Šฅ์€ ๊ธ€๋กœ๋ฒŒ ์ „์ž์ƒ๊ฑฐ๋ž˜, ๋‰ด์Šค ํฌํ„ธ, SaaS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ „์ž์ƒ๊ฑฐ๋ž˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์–ธ์–ด์— ๋”ฐ๋ผ ์ƒํ’ˆ ์„ค๋ช…, ๋ฆฌ๋ทฐ, ๊ฒฐ์ œ ์ •๋ณด ๋“ฑ์ด ์ž๋™์œผ๋กœ ์ „ํ™˜๋˜๋ฉฐ, ๋‰ด์Šค ํฌํ„ธ์—์„œ๋Š” ๊ฐ ๋‚˜๋ผ์˜ ๋…์ž์—๊ฒŒ ๋งž๋Š” ๋‰ด์Šค ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” react-i18next์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ๋ณ„๋„์˜ ๋ฒˆ์—ญ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜์—ฌ, ์–ธ์–ด ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ • ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์–ธ์–ด ์ „ํ™˜ UI๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž๊ฐ€ ์†์‰ฝ๊ฒŒ ์›ํ•˜๋Š” ์–ธ์–ด๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๊ฒฐ๋ก 

๋ฆฌ์•กํŠธ์—์„œ ๊ตญ์ œํ™”(i18n) ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ธ€๋กœ๋ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ˜• ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ , ๋‹ค์–‘ํ•œ ์‹œ์žฅ์—์„œ ์„ฑ๊ณต์ ์ธ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ์ „๋žต์ž…๋‹ˆ๋‹ค. react-i18next์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ๋‹ค๊ตญ์–ด ๋ฒˆ์—ญ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ ๋ฒˆ์—ญ ๋ฌธ์ž์—ด์„ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐ ์„ค์ •: i18n ์ดˆ๊ธฐ ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด ์–ธ์–ด๋ณ„ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ธฐ๋ณธ ์–ธ์–ด์™€ ํด๋ฐฑ ์–ธ์–ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ํ™œ์šฉ: useTranslation ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค๊ตญ์–ด ํ…์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์–ธ์–ด ์ „ํ™˜ ๋ฒ„ํŠผ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์–ธ์–ด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๊ณ„ ์ „๋žต: ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ, ์™ธ๋ถ€ ๋ฒˆ์—ญ ํŒŒ์ผ ๊ด€๋ฆฌ, ๋™์  ๋กœ๋”ฉ, ์ ‘๊ทผ์„ฑ ๋ฐ SEO ๊ณ ๋ ค ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ ์šฉํ•˜์—ฌ, ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋†’์€ ๋‹ค๊ตญ์–ด ์ง€์› ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ธ€๋กœ๋ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‹ค ์นœ์ˆ™ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋น„์Šค์˜ ๊ฒฝ์Ÿ๋ ฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๊ตญ์–ด ์ง€์› ๊ธฐ๋Šฅ์„ ์ ๊ทน ๋„์ž…ํ•˜์—ฌ, ์ „ ์„ธ๊ณ„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ˜• ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ , ์„ฑ๊ณต์ ์ธ ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€