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

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

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

    ๋ชฉ์ฐจ


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

    Intlayer ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ Live Sync๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”:

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... ๊ธฐํƒ€ ๊ตฌ์„ฑ ์„ค์ •
      editor: {
        /**
         * ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜๋ฉด ๋กœ์ผ€์ผ ๊ตฌ์„ฑ์„ ํ•ซ ๋ฆฌ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
         * ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์ „์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด
         * ํŽ˜์ด์ง€์— ํ‘œ์‹œ๋˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
         *
         * ํ•ซ ๋ฆฌ๋กœ๋”ฉ์€ ์„œ๋ฒ„์™€์˜ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
         * `enterprise` ํ”Œ๋žœ ๊ณ ๊ฐ์—๊ฒŒ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
         *
         * ๊ธฐ๋ณธ๊ฐ’: false
         */
        liveSync: true,
      },
      dictionary: {
        /**
         * ์‚ฌ์ „์ด ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š”์ง€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค:
         *
         * - "fetch": ์‚ฌ์ „์€ Live Sync API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
         *   useIntlayer๋ฅผ useDictionaryDynamic์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
         *
         * ์ฐธ๊ณ : ๋ผ์ด๋ธŒ ๋ชจ๋“œ๋Š” Live Sync API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ „์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. API ํ˜ธ์ถœ์ด
         * ์‹คํŒจํ•˜๋ฉด ์‚ฌ์ „์€ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
         * ์ฐธ๊ณ : ์›๊ฒฉ ์ฝ˜ํ…์ธ ๊ฐ€ ์žˆ๊ณ  "live" ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ์‚ฌ์ „๋งŒ ๋ผ์ด๋ธŒ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
         * ๋‚˜๋จธ์ง€๋Š” ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋™์  ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
         */
        importMode: "fetch",
      },
    };
    
    export default config;
    

    ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ์‹ธ๊ธฐ ์œ„ํ•ด Live Sync ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”:

    ๋…๋ฆฝํ˜• ์„œ๋ฒ„ ์‚ฌ์šฉ ์˜ˆ์‹œ:

    package.json
    {
      "scripts": {
        // ... ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋“ค
        "live:start": "npx intlayer live",
      },
    }
    

    --process ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    Next.js ์‚ฌ์šฉ ์˜ˆ์‹œ:

    package.json
    {
      "scripts": {
        // ... ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋“ค
        "build": "next build",
        "dev": "next dev",
        "start": "npx intlayer live --with 'next start'",
      },
    }
    

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

    package.json
    {
      "scripts": {
        // ... ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋“ค
        "build": "vite build",
        "dev": "vite dev",
        "start": "npx intlayer live --with 'vite start'",
      },
    }
    

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

    CMS๋กœ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ ์•Œ๋ฆผ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด, Live Sync ์„œ๋ฒ„๋Š” ๋ฐฑ์—”๋“œ์™€ SSE ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. CMS์—์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ๋ฐฑ์—”๋“œ๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ Live Sync ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ณ , Live Sync ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ์‚ฌ์ „์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ ํƒ์ƒ‰ ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉฐ, ์žฌ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ํ”Œ๋กœ์šฐ ์ฐจํŠธ (CMS/๋ฐฑ์—”๋“œ -> Live Sync ์„œ๋ฒ„ -> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ -> ํ”„๋ก ํŠธ์—”๋“œ):

    Live Sync Flow CMS/Backend/Live Sync Server/Application Server/Frontend Schema

    ์ž‘๋™ ๋ฐฉ์‹:

    Live Sync Logic Schema

    ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ (๋กœ์ปฌ)

    • ๊ฐœ๋ฐœ ์ค‘์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ๋ชจ๋“  ์›๊ฒฉ ์‚ฌ์ „์„ ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Next.js๋กœ ๋กœ์ปฌ์—์„œ Live Sync๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋ž˜ํ•‘ํ•˜์„ธ์š”:
    package.json
    {
      "scripts": {
        // ... ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ
        "dev": "npx intlayer live --with 'next dev'",
        // "dev": "npx intlayer live --with 'vite dev'", // Vite์šฉ
      },
    }
    

    ๊ฐœ๋ฐœ ์ค‘์— Intlayer๊ฐ€ Live import ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋„๋ก ์ตœ์ ํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”:

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      editor: {
        applicationURL: "http://localhost:5173",
        liveSyncURL: "http://localhost:4000",
        liveSync: true,
      },
      dictionary: {
        importMode: "fetch",
      },
      build: {
        optimize: true, // ๊ธฐ๋ณธ๊ฐ’: process.env.NODE_ENV === 'production'
      },
    };
    
    export default config;
    

    ์ด ์„ค์ •์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ Live Sync ์„œ๋ฒ„์™€ ๋ž˜ํ•‘ํ•˜๊ณ , ์‹œ์ž‘ ์‹œ ์›๊ฒฉ ์‚ฌ์ „์„ ๊ฐ€์ ธ์˜ค๋ฉฐ, CMS์—์„œ SSE๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณด๋ ค๋ฉด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์น˜์„ธ์š”.

    ์ฐธ๊ณ  ์‚ฌํ•ญ ๋ฐ ์ œ์•ฝ ์กฐ๊ฑด

    • ๋ผ์ด๋ธŒ ์‹ฑํฌ ์ถœ์ฒ˜๋ฅผ ์‚ฌ์ดํŠธ ๋ณด์•ˆ ์ •์ฑ…(CSP)์— ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๋ผ์ด๋ธŒ ์‹ฑํฌ URL์ด connect-src(๋ฐ ๊ด€๋ จ์ด ์žˆ๋‹ค๋ฉด frame-ancestors)์— ํ—ˆ์šฉ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
    • ๋ผ์ด๋ธŒ ์‹ฑํฌ๋Š” ์ •์  ์ถœ๋ ฅ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Next.js์˜ ๊ฒฝ์šฐ, ๋Ÿฐํƒ€์ž„์— ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๋™์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ „์ฒด ์ •์  ์ „์šฉ ์ œ์•ฝ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด generateStaticParams, generateMetadata, getServerSideProps ๋˜๋Š” getStaticProps๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉ).
    • CMS์—์„œ ๊ฐ ์‚ฌ์ „์—๋Š” live ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. live=true์ธ ์‚ฌ์ „๋งŒ ๋ผ์ด๋ธŒ ์‹ฑํฌ API๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋ฉฐ, ๋‚˜๋จธ์ง€๋Š” ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์™€ ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • live ํ”Œ๋ž˜๊ทธ๋Š” ๋นŒ๋“œ ์‹œ ๊ฐ ์‚ฌ์ „์— ๋Œ€ํ•ด ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ ์›๊ฒฉ ์ฝ˜ํ…์ธ ๊ฐ€ live=true๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ํ•ด๋‹น ์‚ฌ์ „์— ๋Œ€ํ•ด ๋ผ์ด๋ธŒ ์‹ฑํฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ผ์ด๋ธŒ ์‹ฑํฌ ์„œ๋ฒ„๋Š” .intlayer์— ์“ธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋Š” /.intlayer์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    ์œ ์šฉํ•œ ๋งํฌ