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

    Intlayer ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(CMS) ๋ฌธ์„œ

    youtube.com

    Intlayer CMS๋Š” Intlayer ํ”„๋กœ์ ํŠธ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์™ธ๋ถ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

    ์ด๋ฅผ ์œ„ํ•ด Intlayer๋Š” '์›๊ฒฉ ์‚ฌ์ „(distant dictionaries)' ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

    Intlayer CMS ์ธํ„ฐํŽ˜์ด์Šค

    ๋ชฉ์ฐจ

    ์›๊ฒฉ ์‚ฌ์ „ ์ดํ•ดํ•˜๊ธฐ

    Intlayer๋Š” '๋กœ์ปฌ(local)' ์‚ฌ์ „๊ณผ '์›๊ฒฉ(distant)' ์‚ฌ์ „์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

    • '๋กœ์ปฌ' ์‚ฌ์ „์€ Intlayer ํ”„๋กœ์ ํŠธ ๋‚ด์— ์„ ์–ธ๋œ ์‚ฌ์ „์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒ„ํŠผ์˜ ์„ ์–ธ ํŒŒ์ผ์ด๋‚˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ”๊ฐ€ ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฝ˜ํ…์ธ ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฝ˜ํ…์ธ ๋ฅผ ์™ธ๋ถ€ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    • '์›๊ฒฉ' ์‚ฌ์ „์€ Intlayer CMS๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์‚ฌ์ „์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŒ€์ด ์›น์‚ฌ์ดํŠธ์—์„œ ์ง์ ‘ ์ฝ˜ํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, ๋˜ํ•œ A/B ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ๊ณผ SEO ์ž๋™ ์ตœ์ ํ™”๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋น„์ฃผ์–ผ ์—๋””ํ„ฐ vs CMS

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

    ๋ฐ˜๋ฉด์—, Intlayer CMS๋Š” ์›๊ฒฉ ์‚ฌ์ „์„ ์œ„ํ•œ ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์ ธ๋„ ์ฝ˜ํ…์ธ ๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›น์‚ฌ์ดํŠธ๋Š” ๋ณ€๊ฒฝ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ž๋™์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    ํ†ตํ•ฉํ•˜๊ธฐ

    ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๊ด€๋ จ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”:

    Next.js์™€ ํ†ตํ•ฉํ•˜๊ธฐ

    Next.js์™€ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    Create React App๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ

    Create React App๊ณผ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    Vite + React์™€ ํ†ตํ•ฉํ•˜๊ธฐ

    Vite + React์™€ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ๊ตฌ์„ฑ

    Intlayer CMS์— ๋กœ๊ทธ์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”:

    bash
    npx intlayer login
    

    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ ค ์ธ์ฆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์™„๋ฃŒํ•˜๊ณ  Intlayer ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž๊ฒฉ ์ฆ๋ช…(Client ID ๋ฐ Client Secret)์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Intlayer ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ CMS ์„ค์ •์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... ๊ธฐํƒ€ ๊ตฌ์„ฑ ์„ค์ •
      editor: {
        /**
         * ํ•„์ˆ˜
         *
         * ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ URL์ž…๋‹ˆ๋‹ค.
         * ์ด URL์€ ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ๊ฐ€ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” URL์ž…๋‹ˆ๋‹ค.
         */
        applicationURL: process.env.INTLAYER_APPLICATION_URL,
    
        /**
         * ํ•„์ˆ˜
         *
         * ํŽธ์ง‘๊ธฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ ID์™€ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
         * ์ด๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…์ธ ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
         * Intlayer ๋Œ€์‹œ๋ณด๋“œ - ํ”„๋กœ์ ํŠธ(https://app.intlayer.org/projects)์—์„œ ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
         * clientId: process.env.INTLAYER_CLIENT_ID,
         * clientSecret: process.env.INTLAYER_CLIENT_SECRET,
         */
        clientId: process.env.INTLAYER_CLIENT_ID,
        clientSecret: process.env.INTLAYER_CLIENT_SECRET,
    
        /**
         * ์„ ํƒ ์‚ฌํ•ญ
         *
         * Intlayer CMS๋ฅผ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒฝ์šฐ, CMS์˜ URL์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
         *
         * Intlayer CMS์˜ URL์ž…๋‹ˆ๋‹ค.
         * ๊ธฐ๋ณธ๊ฐ’์€ https://intlayer.org ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
         */
        cmsURL: process.env.INTLAYER_CMS_URL,
    
        /**
         * ์„ ํƒ ์‚ฌํ•ญ
         *
         * Intlayer CMS๋ฅผ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐฑ์—”๋“œ์˜ URL์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
         *
         * Intlayer CMS์˜ ๋ฐฑ์—”๋“œ URL์ž…๋‹ˆ๋‹ค.
         * ๊ธฐ๋ณธ๊ฐ’์€ https://back.intlayer.org ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
         */
        backendURL: process.env.INTLAYER_BACKEND_URL,
      },
    };
    
    export default config;
    
    ํด๋ผ์ด์–ธํŠธ ID์™€ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ์ด ์—†๋Š” ๊ฒฝ์šฐ, Intlayer ๋Œ€์‹œ๋ณด๋“œ - ํ”„๋กœ์ ํŠธ์—์„œ ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    CMS ์‚ฌ์šฉํ•˜๊ธฐ

    ๊ตฌ์„ฑ ํ‘ธ์‹œํ•˜๊ธฐ

    Intlayer CMS๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด intlayer CLI ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    bash
    npx intlayer config push
    
    intlayer.config.ts ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, --env ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
    bash
    npx intlayer config push --env production
    

    ์ด ๋ช…๋ น์–ด๋Š” ๊ตฌ์„ฑ์„ Intlayer CMS์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์ „ ํ‘ธ์‹œํ•˜๊ธฐ

    ๋กœ์ผ€์ผ ์‚ฌ์ „์„ ์›๊ฒฉ ์‚ฌ์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด intlayer CLI ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    bash
    npx intlayer dictionary push -d my-first-dictionary-key
    
    intlayer.config.ts ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ --env ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
    bash
    npx intlayer dictionary push -d my-first-dictionary-key --env production
    

    ์ด ๋ช…๋ น์€ ์ดˆ๊ธฐ ์ฝ˜ํ…์ธ  ์‚ฌ์ „์„ ์—…๋กœ๋“œํ•˜์—ฌ Intlayer ํ”Œ๋žซํผ์„ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์ „ ํŽธ์ง‘

    ๊ทธ๋Ÿฐ ๋‹ค์Œ Intlayer CMS์—์„œ ์‚ฌ์ „์„ ๋ณด๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    @intlayer/api SDK๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์•ก์„ธ์Šค

    CLI ๋ฐ ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ๋ฅผ ๋„˜์–ด, Intlayer๋Š” @intlayer/api ํŒจํ‚ค์ง€์— ํƒ€์ž…์ด ์ง€์ •๋œ SDK๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด CMS๋ฅผ ํ—ค๋“œ๋ฆฌ์Šค ์ฝ˜ํ…์ธ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์‚ฌ์ „์„ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์ž์‹ ๋งŒ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ง์ ‘ ํ‘ธ์‹œํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    SDK๋Š” ์ธ์ฆ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. clientId ๋ฐ clientSecret์ด (Intlayer ๊ตฌ์„ฑ ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•œ, OAuth2 ์•ก์„ธ์Šค ํ† ํฐ์„ ์ž๋™์œผ๋กœ ํš๋“ํ•˜๊ณ  ์ƒˆ๋กœ ๊ณ ์น˜๋ฉฐ ๋ชจ๋“  ์š”์ฒญ์— ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์น˜

    bash
    npm install @intlayer/api
    

    ์ž‘๋™ ๋ฐฉ์‹: ์ธ์ฆ๊ธฐ + ์—”๋“œํฌ์ธํŠธ

    SDK๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์ž„ํฌํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

    1. createIntlayerCMS โ€” ๊ฒฝ๋Ÿ‰ ์ธ์ฆ๊ธฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž๊ฒฉ ์ฆ๋ช…๊ณผ ๊ด€๋ฆฌ๋˜๋Š” ์•ก์„ธ์Šค ํ† ํฐ๋งŒ ํฌํ•จํ•˜๋ฉฐ, ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
    2. dictionaryEndpoint, projectEndpoint, โ€ฆ โ€” ๋„๋ฉ”์ธ๋ณ„ ์—”๋“œํฌ์ธํŠธ ๋ฐ”์ธ๋”๋กœ, ๊ฐ๊ฐ ์ž์ฒด ํ•˜์œ„ ๊ฒฝ๋กœ (@intlayer/api/dictionary, @intlayer/api/project, โ€ฆ)์—์„œ ์ž„ํฌํŠธ๋ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ์— ์ธ์ฆ๊ธฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ž„ํฌํŠธ๋˜๋ฏ€๋กœ, ๋ฒˆ๋“ค์—๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋„๋ฉ”์ธ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. dictionaryEndpoint๋ฅผ ์ž„ํฌํŠธํ•ด๋„ ํ”„๋กœ์ ํŠธ, AI ๋˜๋Š” ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•จ๊ป˜ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    cms.ts
    import { createIntlayerCMS } from "@intlayer/api";
    
    // ๊ตฌ์„ฑ์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค: ์ƒ๋žตํ•˜๋ฉด, ์ž๊ฒฉ ์ฆ๋ช…์€
    // INTLAYER_CLIENT_ID ๋ฐ INTLAYER_CLIENT_SECRET ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ•ด์„ํ•˜๋Š”
    // `@intlayer/config/built`์—์„œ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
    export const cmsAuthenticator = createIntlayerCMS();
    
    WARNING
    CMS ์ž๊ฒฉ ์ฆ๋ช… (clientId / clientSecret)์€ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ๊ธฐ๋Š” ์„œ๋ฒ„ ์ธก์—์„œ๋งŒ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์„œ๋ฒ„ ์•ก์…˜, ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ, ์Šคํฌ๋ฆฝํŠธ, CI). ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ์— ์ž„ํฌํŠธํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์— ์ž๊ฒฉ ์ฆ๋ช…์„ ๋…ธ์ถœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

    ๋นŒ๋“œ ์‹œ๊ฐ„ ๊ตฌ์„ฑ์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•˜์„ธ์š”:

    cms.ts
    import { createIntlayerCMS } from "@intlayer/api";
    
    export const cmsAuthenticator = createIntlayerCMS({
      editor: {
        clientId: process.env.INTLAYER_CLIENT_ID,
        clientSecret: process.env.INTLAYER_CLIENT_SECRET,
        // ์„ ํƒ ์‚ฌํ•ญ, ์ž์ฒด ํ˜ธ์ŠคํŒ… ๋ฐฑ์—”๋“œ์˜ ๊ฒฝ์šฐ:
        // backendURL: process.env.INTLAYER_BACKEND_URL,
      },
    });
    
    Intlayer Dashboard - Projects์—์„œ ์ƒˆ ์•ก์„ธ์Šค ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž๊ฒฉ ์ฆ๋ช…์„ ์–ป์œผ์„ธ์š”.

    ํ”„๋กœ์ ํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ

    projects.ts
    import { createIntlayerCMS } from "@intlayer/api";
    import { projectEndpoint } from "@intlayer/api/project";
    
    const cmsAuthenticator = createIntlayerCMS();
    
    // ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    const { data: projects } =
      await projectEndpoint(cmsAuthenticator).getProjects();
    
    // ์„ ํƒ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ†ตํ•ฉ๋œ ํ˜„์ง€ํ™” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
    const { data: insights } =
      await projectEndpoint(cmsAuthenticator).getProjectInsights();
    

    ์‚ฌ์ „ ๊ฐ€์ ธ์˜ค๊ธฐ

    read-dictionaries.ts
    import { createIntlayerCMS } from "@intlayer/api";
    import { dictionaryEndpoint } from "@intlayer/api/dictionary";
    
    const cmsAuthenticator = createIntlayerCMS();
    
    // ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์›๊ฒฉ ์‚ฌ์ „์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
    const { data: dictionaries } =
      await dictionaryEndpoint(cmsAuthenticator).getDictionaries();
    
    // ๋˜๋Š” ํ‚ค๋กœ ๋‹จ์ผ ์‚ฌ์ „์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    const { data: dictionary } = await dictionaryEndpoint(
      cmsAuthenticator
    ).getDictionary("my-first-dictionary-key");
    

    ์‚ฌ์ „ ํ‘ธ์‹œ ๋ฐ ์—…๋ฐ์ดํŠธ

    CMS๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:

    write-dictionaries.ts
    import { createIntlayerCMS } from "@intlayer/api";
    import { dictionaryEndpoint } from "@intlayer/api/dictionary";
    
    const cmsAuthenticator = createIntlayerCMS();
    
    // ์ƒˆ ์‚ฌ์ „์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    await dictionaryEndpoint(cmsAuthenticator).addDictionary({
      key: "my-first-dictionary-key",
      content: { title: "Hello world" },
    });
    
    // ์‚ฌ์ „ ๋ฐฐ์น˜(batch)๋ฅผ Upsert ํ•ฉ๋‹ˆ๋‹ค (ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ์ƒ์„ฑ ๋˜๋Š” ์—…๋ฐ์ดํŠธ).
    await dictionaryEndpoint(cmsAuthenticator).pushDictionaries([
      { key: "home", content: { title: "Home" } },
      { key: "about", content: { title: "About" } },
    ]);
    
    // ๊ธฐ์กด ์‚ฌ์ „์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    await dictionaryEndpoint(cmsAuthenticator).updateDictionary({
      id: "<dictionary-id>",
      key: "home",
      content: { title: "Updated title" },
    });
    

    ํŒ: ๋ฐ”์ธ๋”ฉ๋œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต์„ ํ”ผํ•˜์„ธ์š”:

    typescript
    const dictionary = dictionaryEndpoint(cmsAuthenticator);
    await dictionary.pushDictionaries([myDictionary]);
    const { data } = await dictionary.getDictionaries();
    

    ๋‹จ์ผ ๋ฉ”์„œ๋“œ ์ถ”์ถœ

    ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฏธ ์ธ์ฆ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค (์ž์ฒด ํ† ํฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง). ๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ข…์†์„ฑ์œผ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

    push.ts
    import { createIntlayerCMS } from "@intlayer/api";
    import { dictionaryEndpoint } from "@intlayer/api/dictionary";
    
    const dictionary = dictionaryEndpoint(createIntlayerCMS());
    
    // ์ด๋ฏธ ์ธ์ฆ๋จ โ€” ๊ฐ ํ˜ธ์ถœ ์‹œ ํ† ํฐ์„ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์นฉ๋‹ˆ๋‹ค.
    export const pushDictionaries = dictionary.pushDictionaries;
    
    // ์‚ฌ์šฉ ์˜ˆ์‹œ
    await pushDictionaries([{ key: "home", content: { title: "Home" } }]);
    

    ๋ผ์ด๋ธŒ ๋™๊ธฐํ™”

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

    ์ „์ฒด ์„ค์ • ๊ฐ€์ด๋“œ(๊ตฌ์„ฑ ํ™œ์„ฑํ™”, Live Sync ์„œ๋ฒ„ ์‹œ์ž‘, ๋กœ์ปฌ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ, ์ œ์•ฝ ์‚ฌํ•ญ)๋Š” Live Sync ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์ž์ฒด ํ˜ธ์ŠคํŒ…

    Intlayer๋Š” ์ž์ฒด ์ธํ”„๋ผ์—์„œ ์™„์ „ํžˆ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์ค„์˜ ๋ช…๋ น์–ด๋กœ Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ์Šคํƒ(๋Œ€์‹œ๋ณด๋“œ, API, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ๋ฐ ์ด๋ฉ”์ผ)์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    sh
    curl -fsSL https://intlayer.org/install.sh | sh
    

    ์ „์ฒด ์„ค์ • ๊ฐ€์ด๋“œ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐธ์กฐ, ์—…๊ทธ๋ ˆ์ด๋“œ ์ง€์นจ ๋ฐ ๋ฐฑ์—…/๋ณต์› ์ ˆ์ฐจ๋Š” ์ž์ฒด ํ˜ธ์ŠคํŒ… ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ๋””๋ฒ„๊ทธ

    CMS์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • editor ์„ค์ •์ด Intlayer ๊ตฌ์„ฑ ํŒŒ์ผ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
      • ํ•„์ˆ˜ ํ•„๋“œ:
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ URL์€ ์—๋””ํ„ฐ ๊ตฌ์„ฑ(applicationURL)์— ์„ค์ •ํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • CMS URL

    • ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์ด Intlayer CMS์— ํ‘ธ์‹œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • ๋น„์ฃผ์–ผ ์—๋””ํ„ฐ๋Š” iframe์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์›น์‚ฌ์ดํŠธ์˜ ์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…(CSP)์ด CMS URL์„ frame-ancestors๋กœ ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”(๊ธฐ๋ณธ๊ฐ’์€ 'https://app.intlayer.org'). ์—๋””ํ„ฐ ์ฝ˜์†”์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

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

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

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