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

    Intlayer ๋ฌธ์„œ

    ๊ณต์‹ Intlayer ๋ฌธ์„œ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์ด๊ณณ์—์„œ Next.js, React, Vite, Express ๋˜๋Š” ๊ธฐํƒ€ JavaScript ํ™˜๊ฒฝ ๋“ฑ ์–ด๋””์—์„œ ์ž‘์—…ํ•˜๋“  ๋ชจ๋“  ๊ตญ์ œํ™”(i18n) ์š”๊ตฌ ์‚ฌํ•ญ์„ ์œ„ํ•ด Intlayer๋ฅผ ํ†ตํ•ฉ, ๊ตฌ์„ฑ ๋ฐ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์†Œ๊ฐœ

    Intlayer๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

    Intlayer๋Š” JavaScript ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ๊ตญ์ œํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋‚ด ์–ด๋””์—์„œ๋‚˜ ์ฝ˜ํ…์ธ ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ๋‹ค๊ตญ์–ด ์ฝ˜ํ…์ธ  ์„ ์–ธ์„ ๊ตฌ์กฐํ™”๋œ ์‚ฌ์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฝ”๋“œ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Intlayer๋Š” ๊ฐœ๋ฐœ์„ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

    Intlayer๋Š” ๋˜ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ์‰ฝ๊ฒŒ ํŽธ์ง‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์„ ํƒ์ ์ธ ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ(visual editor)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽธ์ง‘๊ธฐ๋Š” ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ์— ์‹œ๊ฐ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋‚˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒ€์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ ์˜ˆ์‹œ

    bash
    .
    โ””โ”€โ”€ Components
        โ””โ”€โ”€ MyComponent
            โ”œโ”€โ”€ index.content.ts
            โ””โ”€โ”€ index.tsx
    
    src/components/MyComponent/index.content.ts
    import { t, type Dictionary } from "intlayer";
    
    const componentContent = {
      key: "component-key",
      content: {
        myTranslatedContent: t({
          en: "Hello World",
          es: "Hola Mundo",
          fr: "Bonjour le monde",
          ko: "์•ˆ๋…• ์„ธ์ƒ",
        }),
      },
    } satisfies Dictionary;
    
    export default componentContent;
    
    src/components/MyComponent/index.tsx
    import type { FC } from "react";
    import { useIntlayer } from "react-intlayer";
    
    export const MyComponent: FC = () => {
      const { myTranslatedContent } = useIntlayer("component-key");
    
      return <span>{myTranslatedContent}</span>;
    };
    

    ์™œ ๋Œ€์•ˆ๋“ค๋ณด๋‹ค Intlayer์ธ๊ฐ€์š”?

    next-intl์ด๋‚˜ i18next์™€ ๊ฐ™์€ ์ฃผ์š” ์†”๋ฃจ์…˜๊ณผ ๋น„๊ตํ•˜์—ฌ Intlayer๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ†ตํ•ฉ๋œ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค:

    ๊ฑฐ๋Œ€ํ•œ JSON ํŒŒ์ผ์„ ํŽ˜์ด์ง€์— ๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  ํ•„์š”ํ•œ ์ฝ˜ํ…์ธ ๋งŒ ๋กœ๋“œํ•˜์„ธ์š”. Intlayer๋Š” ๋ฒˆ๋“ค ๋ฐ ํŽ˜์ด์ง€ ํฌ๊ธฐ๋ฅผ ์ตœ๋Œ€ 50%๊นŒ์ง€ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

    ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ˜ํ…์ธ ์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ˜ํ…์ธ  ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€ํ† ํ•ด์•ผ ํ•˜๋Š” ์ •์‹ ์  ๋ถ€๋‹ด ์—†์ด ๋‹จ์ผ ๊ธฐ๋Šฅ(feature) ํด๋”๋ฅผ ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Intlayer๋Š” ์ฝ˜ํ…์ธ ์˜ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์™„์ „ํžˆ ํƒ€์ž…ํ™”(fully typed)๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์œ„์น˜์— ๋‘๋ฉด ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์ด ํ•„์š”๋กœ ํ•˜๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. Intlayer์—๋Š” ๋ˆ„๋ฝ๋œ ๋ฒˆ์—ญ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ CLI, LSP, MCP ๋ฐ agent skills ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ๋„๊ตฌ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์–ด AI ์—์ด์ „ํŠธ์˜ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜(DX)์„ ํ›จ์”ฌ ๋” ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ์›ํ•˜๋Š” LLM๊ณผ AI ์ œ๊ณต์ž์˜ ๋น„์šฉ์œผ๋กœ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฒˆ์—ญ์„ ์ž๋™ํ™”ํ•˜์„ธ์š”. Intlayer๋Š” ์ฝ˜ํ…์ธ  ์ถ”์ถœ์„ ์ž๋™ํ™”ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(compiler)๋ฅผ ์ œ๊ณตํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์›น ํ”Œ๋žซํผ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    ๊ฑฐ๋Œ€ํ•œ JSON ํŒŒ์ผ์„ ์ปดํฌ๋„ŒํŠธ์— ์—ฐ๊ฒฐํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฐ ๋ฐ˜์‘์„ฑ(reactivity) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Intlayer๋Š” ๋นŒ๋“œ ์‹œ(build time) ์ฝ˜ํ…์ธ  ๋กœ๋”ฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹จ์ˆœํ•œ i18n ์†”๋ฃจ์…˜์„ ๋„˜์–ด, Intlayer๋Š” ์ž์ฒด ํ˜ธ์ŠคํŒ… ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ(visual editor)์™€ ์™„์ „ํ•œ CMS๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋‹ค๊ตญ์–ด ์ฝ˜ํ…์ธ ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋ฉฐ, ๋ฒˆ์—ญ๊ฐ€, ์นดํ”ผ๋ผ์ดํ„ฐ ๋ฐ ๊ธฐํƒ€ ํŒ€์›๊ณผ์˜ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋Š” ๋กœ์ปฌ ๋ฐ/๋˜๋Š” ์›๊ฒฉ์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฃผ์š” ๊ธฐ๋Šฅ

    Intlayer๋Š” ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋ฌธ์„œ๋กœ์˜ ๋งํฌ๊ฐ€ ํฌํ•จ๋œ ์ฃผ์š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค:

    • ๊ตญ์ œํ™” ์ง€์›: ๋‚ด์žฅ๋œ ๊ตญ์ œํ™” ์ง€์›์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธ€๋กœ๋ฒŒ ๋„๋‹ฌ ๋ฒ”์œ„๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ(Visual Editor): Intlayer๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ํŽธ์ง‘๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฐœ์„ ํ•˜์„ธ์š”. ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
    • ๊ตฌ์„ฑ์˜ ์œ ์—ฐ์„ฑ: ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ์— ์ž์„ธํžˆ ์„ค๋ช…๋œ ํฌ๊ด„์ ์ธ ๊ตฌ์„ฑ ์˜ต์…˜์œผ๋กœ ์„ค์ •์„ ๋งž์ถคํ™”ํ•˜์„ธ์š”.
    • ๊ณ ๊ธ‰ CLI ๋„๊ตฌ: Intlayer์˜ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค(CLI)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์„ธ์š”. CLI ๋„๊ตฌ ๋ฌธ์„œ์—์„œ ๊ธฐ๋Šฅ์„ ํƒ์ƒ‰ํ•ด ๋ณด์„ธ์š”.

    ํ•ต์‹ฌ ๊ฐœ๋…

    ์‚ฌ์ „(Dictionary)

    ๋‹ค๊ตญ์–ด ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ”๋“œ ๊ทผ์ฒ˜์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ์ผ๊ด€๋˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜์„ธ์š”.

    • ์‹œ์ž‘ํ•˜๊ธฐ
      Intlayer์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

    • ๋ฒˆ์—ญ(Translation)
      ๋ฒˆ์—ญ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ, ์ €์žฅ, ํ™œ์šฉ๋˜๋Š”์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

    • ์—ด๊ฑฐ(Enumeration)
      ์—ฌ๋Ÿฌ ์–ธ์–ด์— ๊ฑธ์ณ ๋ฐ˜๋ณต๋˜๊ฑฐ๋‚˜ ๊ณ ์ •๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • ์กฐ๊ฑด(Condition)
      Intlayer์—์„œ ์กฐ๊ฑด๋ถ€ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ์ฝ˜ํ…์ธ ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

    • ์‚ฝ์ž…(Insertion)
      ์‚ฝ์ž… ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์— ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐœ๊ฒฌํ•˜์„ธ์š”.

    • ํ•จ์ˆ˜ ํŽ˜์นญ(Function Fetching)
      ํ”„๋กœ์ ํŠธ์˜ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ์ผ์น˜ํ•˜๋„๋ก ์‚ฌ์šฉ์ž ์ •์˜ ๋…ผ๋ฆฌ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š”(fetch) ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ๋งˆํฌ๋‹ค์šด(Markdown)
      Intlayer์—์„œ ๋งˆํฌ๋‹ค์šด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’๋ถ€ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

    • ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ(File embeddings)
      ์™ธ๋ถ€ ํŒŒ์ผ์„ Intlayer์— ์ž„๋ฒ ๋“œํ•˜์—ฌ ์ฝ˜ํ…์ธ  ํŽธ์ง‘๊ธฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐœ๊ฒฌํ•˜์„ธ์š”.

    • ์ค‘์ฒฉ(Nesting)
      Intlayer์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์ค‘์ฒฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

    ํ™˜๊ฒฝ ๋ฐ ํ†ตํ•ฉ

    ์ €ํฌ๋Š” ์œ ์—ฐ์„ฑ์„ ์—ผ๋‘์— ๋‘๊ณ  Intlayer๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋นŒ๋“œ ๋„๊ตฌ ์ „๋ฐ˜์—์„œ ์›ํ™œํ•œ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

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

    ๊ธฐ์—ฌ ๋ฐ ํ”ผ๋“œ๋ฐฑ

    ์ €ํฌ๋Š” ์˜คํ”ˆ ์†Œ์Šค์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฃผ๋„ ๊ฐœ๋ฐœ์˜ ํž˜์„ ์†Œ์ค‘ํžˆ ์—ฌ๊น๋‹ˆ๋‹ค. ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ฐ€์ด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์„œ์˜ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ Pull Request๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ Issue๋ฅผ ์—ด์–ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

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

    Intlayer๋Š” JavaScript ๋ฐ TypeScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ตญ์ œํ™”(i18n) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋ฐ”๋กœ ์˜†์˜ .content.ts ํŒŒ์ผ์— ์„ ์–ธํ•˜๋ฉด, Intlayer๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ์ด๋Ÿฌํ•œ ์„ ์–ธ์„ ํƒ€์ž… ์•ˆ์ „ํ•œ ์‚ฌ์ „์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ๋Š” useIntlayer์™€ ๊ฐ™์€ ํ›…์„ ํ†ตํ•ด ์ด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฒˆ์—ญ, ๋ณต์ˆ˜ํ˜• ๊ทœ์น™, ์„ฑ๋ณ„, Markdown, ๋กœ์ผ€์ผ ์ธ์‹ ๋ผ์šฐํŒ…, SEO ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, AI ์ง€์› ๋ฒˆ์—ญ ๋ฐ ๋น„๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋น„์ฃผ์–ผ ์—๋””ํ„ฐ๊นŒ์ง€ ์ข…ํ•ฉ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

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

    ๋„ค, ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. i18next ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ ๋˜๋Š” next-intl ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ์ ์ง„์ ์œผ๋กœ ์ด์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํ˜„์žฌ API๋ฅผ ์™„์ „ํžˆ ์œ ์ง€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: ํ˜ธํ™˜ ์–ด๋Œ‘ํ„ฐ(compat adapters)๋Š” i18next, react-i18next, next-intl, next-i18next, react-intl, use-intl, vue-i18n ๋ฐ Lingui์™€ ์™„์ „ํžˆ ๋™์ผํ•œ 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 ์†Œ์Šค์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‚ฌ์ „์„ ์ƒ์„ฑํ•˜๊ณ  HMR์„ ํ†ตํ•ด ๋™๊ธฐํ™”ํ•˜๋ฏ€๋กœ ์ˆ˜๋™์œผ๋กœ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„์œผ๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„์—๋งŒ ์กด์žฌํ•˜๋Š” ๋ฌธ์ž์—ด์€ ์ œ์™ธ๋˜๋ฉฐ, ์‚ฌ์šฉ์ž ํ…์ŠคํŠธ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ฃผ์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    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 ๊ทœ์น™์œผ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ํ‘œ์‹œํ•˜๊ณ , ์ •์  ์‚ฌ์ „ ํ‚ค ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ทœ์น™์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.