์ž‘๊ฐ€:
    ์ƒ์„ฑ:2025-12-30๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:2026-08-30

    Intlayer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Fastify ๋ฐฑ์—”๋“œ ์›น์‚ฌ์ดํŠธ ๋ฒˆ์—ญํ•˜๊ธฐ | ๊ตญ์ œํ™” (i18n)

    fastify-intlayer๋Š” Fastify ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๊ตญ์ œํ™”(i18n) ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์˜ ๊ธฐ๋ณธ ์„ค์ •์— ๋”ฐ๋ผ ํ˜„์ง€ํ™”๋œ ์‘๋‹ต์„ ์ œ๊ณตํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ „ ์„ธ๊ณ„์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    GitHub์—์„œ ํŒจํ‚ค์ง€ ๊ตฌํ˜„ ํ™•์ธํ•˜๊ธฐ.

    ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€

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

    ๋ฐฑ์—”๋“œ๋ฅผ ๊ตญ์ œํ™”ํ•จ์œผ๋กœ์จ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฌธํ™”์  ์ฐจ์ด๋ฅผ ์กด์ค‘ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธ€๋กœ๋ฒŒ ์‹œ์žฅ์˜ ์š”๊ตฌ์— ๋” ์ž˜ ๋ถ€์‘ํ•˜๊ฒŒ ๋˜์–ด ์„œ๋น„์Šค๋ฅผ ์ „ ์„ธ๊ณ„๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ๋‹จ๊ณ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    ์‹œ์ž‘ํ•˜๊ธฐ

    ide.intlayer.org

    GitHub์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…œํ”Œ๋ฆฟ์„ ํ™•์ธํ•˜์„ธ์š”.

    ์„ค์น˜

    fastify-intlayer ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด npm์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.

    bash
    npx intlayer init --interactive
    
    --interactive ํ”Œ๋ž˜๊ทธ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. AI ์—์ด์ „ํŠธ์ธ ๊ฒฝ์šฐ intlayer-cli init๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
    ์ด ๋ช…๋ น์€ ํ™˜๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
    bash
    npm install intlayer fastify-intlayer
    

    ์„ค์ •

    ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— intlayer.config.ts๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ตญ์ œํ™” ์„ค์ •์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [
          Locales.ENGLISH,
          Locales.FRENCH,
          Locales.SPANISH_MEXICO,
          Locales.SPANISH_SPAIN,
        ],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    

    ์ฝ˜ํ…์ธ  ์„ ์–ธ

    ๋ฒˆ์—ญ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ฝ˜ํ…์ธ  ์„ ์–ธ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์„ธ์š”.

    src/index.content.ts
    import { t, type Dictionary } from "intlayer";
    
    const indexContent = {
      key: "index",
      content: {
        exampleOfContent: t({
          en: "Example of returned content in English",
          fr: "Exemple de contenu renvoyรฉ en franรงais",
          "es-ES": "Ejemplo de contenido devuelto en espaรฑol (Espaรฑa)",
          "es-MX": "Ejemplo de contenido devuelto en espaรฑol (Mรฉxico)",
        }),
      },
    } satisfies Dictionary;
    
    export default indexContent;
    
    ์ฝ˜ํ…์ธ  ์„ ์–ธ์€ contentDir ๋””๋ ‰ํ„ฐ๋ฆฌ(๊ธฐ๋ณธ๊ฐ’ ./src)์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์–ด๋А ๊ณณ์—์„œ๋‚˜ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ˜ํ…์ธ  ์„ ์–ธ ํŒŒ์ผ ํ™•์žฅ์ž(๊ธฐ๋ณธ๊ฐ’ .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ˜ํ…์ธ  ์„ ์–ธ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    Fastify ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •

    fastify-intlayer๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Fastify ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์ •ํ•˜์„ธ์š”.

    src/index.ts
    import Fastify from "fastify";
    import { intlayer, t, getDictionary, getIntlayer } from "fastify-intlayer";
    import dictionaryExample from "./index.content";
    
    const fastify = Fastify({ logger: true });
    
    // ๊ตญ์ œํ™” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋กœ๋“œ
    await fastify.register(intlayer);
    
    // ๋ผ์šฐํŠธ
    fastify.get("/t_example", async (_req, reply) => {
      return t({
        en: "Example of returned content in English",
        fr: "Exemple de contenu renvoyรฉ en franรงais",
        "es-ES": "Ejemplo de contenido devuelto en espaรฑol (Espaรฑa)",
        "es-MX": "Ejemplo de contenido devuelto en espaรฑol (Mรฉxico)",
      });
    });
    
    fastify.get("/getIntlayer_example", async (_req, reply) => {
      return getIntlayer("index").exampleOfContent;
    });
    
    fastify.get("/getDictionary_example", async (_req, reply) => {
      return getDictionary(dictionaryExample).exampleOfContent;
    });
    
    // ์„œ๋ฒ„ ์‹œ์ž‘
    const start = async () => {
      try {
        await fastify.listen({ port: 3000 });
      } catch (err) {
        fastify.log.error(err);
        process.exit(1);
      }
    };
    
    start();
    

    ํ˜ธํ™˜์„ฑ

    fastify-intlayer๋Š” ๋‹ค์Œ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค:

    • React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ react-intlayer
    • Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ next-intlayer
    • Vite ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ vite-intlayer

    ๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ฐ API ์š”์ฒญ์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ๊ตญ์ œํ™” ์†”๋ฃจ์…˜๊ณผ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ—ค๋”๋‚˜ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๋กœ์ผ€์ผ์„ ๊ฐ์ง€ํ•˜๋„๋ก ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... ๊ธฐํƒ€ ๊ตฌ์„ฑ ์˜ต์…˜
      routing: {
        storage: [
          { type: "header", name: "my-locale-header" },
          { type: "cookie", name: "my-locale-cookie" },
        ],
      },
    };
    
    export default config;
    

    ๊ธฐ๋ณธ์ ์œผ๋กœ fastify-intlayer๋Š” Accept-Language ํ—ค๋”๋ฅผ ํ•ด์„ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์–ธ์–ด๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๊ตฌ์„ฑ ๋ฐ ๊ณ ๊ธ‰ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.

    TypeScript ๊ตฌ์„ฑ

    fastify-intlayer๋Š” ๊ตญ์ œํ™” ํ”„๋กœ์„ธ์Šค๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด TypeScript์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. TypeScript์˜ ์ •์  ํƒ€์ดํ•‘์€ ๋ชจ๋“  ๋ฒˆ์—ญ ํ‚ค๊ฐ€ ๊ณ ๋ ค๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ ๋ฒˆ์—ญ ๋ˆ„๋ฝ์˜ ์œ„ํ—˜์„ ์ค„์ด๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

    ์ž๋™ ์ƒ์„ฑ๋œ ์œ ํ˜•(๊ธฐ๋ณธ๊ฐ’ ./types/intlayer.d.ts)์ด tsconfig.json ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    tsconfig.json
    {
      // ... ๊ธฐ์กด TypeScript ๊ตฌ์„ฑ
      "include": [
        // ... ๊ธฐ์กด TypeScript ๊ตฌ์„ฑ
        ".intlayer/**/*.ts", // ์ž๋™ ์ƒ์„ฑ๋œ ์œ ํ˜• ํฌํ•จ
      ],
    }
    

    VS Code ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ

    Intlayer ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ฐœ์„ ํ•˜๋ ค๋ฉด ๊ณต์‹ Intlayer VS Code Extension์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    VS Code Marketplace์—์„œ ์„ค์น˜ํ•˜๊ธฐ

    ์ด ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

    • ๋ฒˆ์—ญ ํ‚ค์— ๋Œ€ํ•œ ์ž๋™ ์™„์„ฑ.
    • ๋ฒˆ์—ญ ๋ˆ„๋ฝ์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์˜ค๋ฅ˜ ๊ฐ์ง€.
    • ๋ฒˆ์—ญ๋œ ์ฝ˜ํ…์ธ ์˜ ์ธ๋ผ์ธ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ.
    • ๋ฒˆ์—ญ์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋น ๋ฅธ ์ž‘์—….

    ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Intlayer VS Code Extension ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    Git ๊ตฌ์„ฑ

    Intlayer์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ์€ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Git ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด๋ฅผ ์œ„ํ•ด .gitignore ํŒŒ์ผ์— ๋‹ค์Œ ์ง€์นจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    .gitignore
    # Intlayer์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ ๋ฌด์‹œ
    .intlayer
    

    ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

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

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

    ์™œ Intlayer์ธ๊ฐ€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ๋งค์šฐ ์ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „์€ ์‚ฌ์ „์— ์ปดํŒŒ์ผ๋˜๋ฉฐ ์„ ์–ธํ•œ ๋กœ์ผ€์ผ๋งŒ ํฌํ•จ๋˜๋ฏ€๋กœ ๋ถ€ํŒ… ์‹œ ์นดํƒˆ๋กœ๊ทธ ๋กœ๋”ฉ์ด๋‚˜ ์š”์ฒญ ๊ฒฝ๋กœ์—์„œ์˜ ํŒŒ์ผ ์ฝ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์‹œ๊ฐ„์„ ์ขŒ์šฐํ•˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ๋ฐ ์—ฃ์ง€ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค ์ตœ์ ํ™”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ๋„ค, ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. i18next ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ์ ์ง„์ ์œผ๋กœ ์ด์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํ˜„์žฌ API๋ฅผ ์™„์ „ํžˆ ์œ ์ง€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: ํ˜ธํ™˜ ์–ด๋Œ‘ํ„ฐ(compat adapters)๋Š” i18next์™€ ์™„์ „ํžˆ ๋™์ผํ•œ API๋ฅผ ๋…ธ์ถœํ•˜๋ฉด์„œ Intlayer ์‚ฌ์ „์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, import ๊ตฌ๋ฌธ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋„ค. sync JSON ํ”Œ๋Ÿฌ๊ทธ์ธ์€ /messages/{locale}/{namespace}.json ํŒŒ์ผ์„ ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›(source of truth)์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ Intlayer ์‚ฌ์ „์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. sync PO ํ”Œ๋Ÿฌ๊ทธ์ธ์€ gettext ์นดํƒˆ๋กœ๊ทธ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋กœ์ผ€์ผ๋ณ„ ํŒŒ์ผ์„ ํ†ตํ•ด ๋กœ์ผ€์ผ์„ ํ•œ ํŒŒ์ผ์— ๋ชจ์œผ๋Š” ๋Œ€์‹  ์–ธ์–ด๋ณ„๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋ถ„ํ• ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์•„๋‹™๋‹ˆ๋‹ค. npx intlayer extract๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Intlayer๊ฐ€ ์†Œ์Šค ํŒŒ์ผ์„ ์ฝ๊ณ  ์‚ฌ์šฉ์ž ๋Œ€๋ฉด ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜์—ฌ ๊ฐ ์ปดํฌ๋„ŒํŠธ ์˜†์— .content ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์นดํƒˆ๋กœ๊ทธ์— ์ผ์ผ์ด ๋ณต์‚ฌํ•  ํ•„์š” ์—†์ด diff๋งŒ ๊ฒ€ํ† ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. extract ๋ช…๋ น์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ๋Š” Intlayer ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— JSX, TSX, Vue ๋˜๋Š” Svelte ์†Œ์Šค์—์„œ ์‚ฌ์ „์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์•ฑ์˜ ๋‘ ์˜์—ญ์ด ์ˆ˜๋™ ํ‚ค ๊ด€๋ฆฌ ์—†์ด ๋‹จ์ผ ์ฝ˜ํ…์ธ  ๋ ˆ์ด์–ด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    5๊ฐ€์ง€ ๋„๊ตฌ๊ฐ€ ๋ชจ๋‘ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:

    • VS Code ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ: useIntlayer ํ‚ค์—์„œ ์ด๋ฅผ ์„ ์–ธํ•œ ์ฝ˜ํ…์ธ  ํŒŒ์ผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ถœํ•˜๋ฉฐ, ๋ช…๋ น ํŒ”๋ ˆํŠธ๋‚˜ ์ „์šฉ Intlayer ํƒญ์—์„œ build, fill, test, push, pull์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • LSP ์„œ๋ฒ„: LSP๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์—๋””ํ„ฐ์—์„œ ์ •์˜๋กœ ์ด๋™, ๋ชจ๋“  ์ฐธ์กฐ ์ฐพ๊ธฐ, ๋ฒˆ์—ญ ๊ฐ’ ๋งˆ์šฐ์Šค ์˜ค๋ฒ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ํ‚ค ๋ฐ ํ•„๋“œ ์ž๋™ ์™„์„ฑ, ์„ ์–ธ๋˜์ง€ ์•Š์€ ํ‚ค์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋“ฑ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ i18next, react-i18next, next-intl, use-intl ํ˜ธ์ถœ๋„ ํ•ด์„ํ•˜๋ฏ€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • MCP ์„œ๋ฒ„: Cursor, VS Code, Claude Desktop, Claude Code, ChatGPT์— Intlayer ๋ฌธ์„œ์™€ CLI๋ฅผ ๋…ธ์ถœํ•˜์—ฌ AI ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •ํ™•ํžˆ ๋‹ต๋ณ€ํ•˜๊ณ  intlayer fill ๋“ฑ์˜ ๋ช…๋ น์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • Agent Skills: intlayer-config, intlayer-cli, intlayer-content ๋ฐ ๊ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ „์šฉ ์Šคํ‚ฌ์„ ํ†ตํ•ด AI ์—์ด์ „ํŠธ์—๊ฒŒ ๋ผ์šฐํŒ… ์„ค์ •๊ณผ ์ฝ˜ํ…์ธ  ๋…ธ๋“œ ํƒ€์ž…์„ ํ•™์Šต์‹œํ‚ต๋‹ˆ๋‹ค.
    • ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ: no-raw-text ๊ทœ์น™์œผ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ํ‘œ์‹œํ•˜๊ณ , ์ •์  ์‚ฌ์ „ ํ‚ค ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ทœ์น™์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.