์ž‘๊ฐ€:
    ์ƒ์„ฑ:2025-11-24๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:2026-09-27

    ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ i18n์— ๋Œ€ํ•œ ์ฐฌ๋ฐ˜ ๋…ผ์Ÿ

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

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

    ํ•˜์ง€๋งŒ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์˜ ๋ชจ๋“  ์ถ”์ƒํ™”๊ฐ€ ๊ทธ๋ ‡๋“ฏ, ๋งˆ๋ฒ•์—๋Š” ๋Œ€๊ฐ€๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

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

    ๋ชฉ์ฐจ

    ๊ตญ์ œํ™”์˜ ๊ฐ„๋žตํ•œ ์—ญ์‚ฌ

    ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด, ์‹œ์ž‘์ ์„ ๋˜๋Œ์•„๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    2011๋…„์—์„œ 2012๋…„๊ฒฝ, JavaScript ํ™˜๊ฒฝ์€ ๋งค์šฐ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋“ค(Webpack, Vite)์€ ์กด์žฌํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์— ๋ถˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๊ธฐ์— i18next์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

    ์ด๋“ค์€ ๋‹น์‹œ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค: ๋Ÿฐํƒ€์ž„ ์‚ฌ์ „(Runtime Dictionaries). ๊ฑฐ๋Œ€ํ•œ JSON ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๊ณ , ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ์ค‘์— ํ‚ค๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ณ  ๋ช…ํ™•ํ•˜๋ฉฐ ์–ด๋””์„œ๋‚˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ์‹œ๊ฐ„์ด ํ˜๋Ÿฌ ์˜ค๋Š˜๋‚ ์— ์ด๋ฅด๋ €์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(Abstract Syntax Trees, AST)๋ฅผ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค(SWC, Rust ๊ธฐ๋ฐ˜ ๋ฒˆ๋“ค๋Ÿฌ)์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํž˜์€ ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๋ฅผ ํƒ„์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค: ์™œ ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ• ๊นŒ? ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "Hello World"๋ผ๋Š” ํ…์ŠคํŠธ๋ฅผ ๋ณด๊ณ  ๋ฐ”๋กœ ๊ต์ฒดํ•ด์ฃผ๋ฉด ์•ˆ ๋ ๊นŒ?

    ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ i18n์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

    ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ i18n์˜ ์˜ˆ:

    • Paraglide (๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์€ ESM ํ•จ์ˆ˜๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น ๋ชจ๋“ˆ๋กœ, ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋กœ์ผ€์ผ๊ณผ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ํ‚ค ์กฐํšŒ ๋Œ€์‹  ๋ฉ”์‹œ์ง€๋ฅผ ํ•จ์ˆ˜๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.)
    • LinguiJS (<Trans>์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ๋งคํฌ๋กœ๋ฅผ ๋นŒ๋“œ ์‹œ์ ์— ์ผ๋ฐ˜ JS ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์žฌ์ž‘์„ฑํ•˜๋Š” ๋งคํฌ๋กœ-ํˆฌ-ํ•จ์ˆ˜ ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ์ž‘์€ ๋Ÿฐํƒ€์ž„ ํฌ๊ธฐ๋กœ ICU/MessageFormat ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.)
    • Lingo.dev (React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ ์ค‘์— ๋ฒˆ์—ญ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ง์ ‘ ์ฃผ์ž…ํ•˜์—ฌ ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. AI๋ฅผ ์‚ฌ์šฉํ•ด ๋ฒˆ์—ญ์„ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ CI/CD์— ์ง์ ‘ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
    • Wuchale (Svelte ์šฐ์„  ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ .svelte ํŒŒ์ผ ๋‚ด ์ธ๋ผ์ธ ํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋ž˜ํผ๊ฐ€ ์—†๋Š” ๋ฒˆ์—ญ ํ•จ์ˆ˜๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ํ‚ค๋ฅผ ํ”ผํ•˜๊ณ , ์ฝ˜ํ…์ธ  ์ถ”์ถœ ๋กœ์ง์„ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Ÿฐํƒ€์ž„๊ณผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.)
    • Intlayer (์ปดํŒŒ์ผ๋Ÿฌ / ์ถ”์ถœ CLI๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ , ํƒ€์ž…์ด ์ง€์ •๋œ ์‚ฌ์ „์„ ์ƒ์„ฑํ•˜๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ ๋ช…์‹œ์ ์ธ Intlayer ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์žฌ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ์„ ์–ธ์ ์ด๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ์ฝ”์–ด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•œ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

    ์„ ์–ธ์  i18n์˜ ์˜ˆ:

    • i18next / react-i18next / next-i18next (๋Ÿฐํƒ€์ž„ JSON ์‚ฌ์ „๊ณผ ๊ด‘๋ฒ”์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„ฑ์ˆ™ํ•œ ์—…๊ณ„ ํ‘œ์ค€)
    • react-intl (FormatJS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€๋กœ, ํ‘œ์ค€ ICU ๋ฉ”์‹œ์ง€ ๊ตฌ๋ฌธ๊ณผ ์—„๊ฒฉํ•œ ๋ฐ์ดํ„ฐ ํฌ๋งทํŒ…์— ์ค‘์ ์„ ๋‘ )
    • next-intl (Next.js์— ์ตœ์ ํ™”๋˜์–ด App Router ๋ฐ React Server Components์™€ ํ†ตํ•ฉ๋จ)
    • vue-i18n / @nuxt/i18n (์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์˜ ๋ฒˆ์—ญ ๋ธ”๋ก๊ณผ ๊ฐ•๋ ฅํ•œ ๋ฐ˜์‘์„ฑ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ Vue ์ƒํƒœ๊ณ„ ์†”๋ฃจ์…˜)
    • svelte-i18n (๋ฐ˜์‘ํ˜• ๋Ÿฐํƒ€์ž„ ๋ฒˆ์—ญ์„ ์œ„ํ•œ Svelte ์Šคํ† ์–ด๋ฅผ ๊ฐ์‹ผ ๊ฒฝ๋Ÿ‰ ๋ž˜ํผ)
    • angular-translate (๋นŒ๋“œ ํƒ€์ž„ ๋ณ‘ํ•ฉ ๋Œ€์‹  ๋Ÿฐํƒ€์ž„ ํ‚ค ์กฐํšŒ์— ์˜์กดํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ๋™์  ๋ฒˆ์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
    • angular-i18n (๋นŒ๋“œ ์‹œ XLIFF ํŒŒ์ผ์„ ํ…œํ”Œ๋ฆฟ์— ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” Angular์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์„ ํ–‰ ์ฒ˜๋ฆฌ ๋ฐฉ์‹)
    • Tolgee (์„ ์–ธ์  ์ฝ”๋“œ๋ฅผ UI ๋‚ด์—์„œ ์ง์ ‘ "ํด๋ฆญํ•˜์—ฌ ๋ฒˆ์—ญ" ํŽธ์ง‘์ด ๊ฐ€๋Šฅํ•œ ์ธ์ปจํ…์ŠคํŠธ SDK์™€ ๊ฒฐํ•ฉ)
    • Intlayer (์ปดํฌ๋„ŒํŠธ๋ณ„ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ, ๋„ค์ดํ‹ฐ๋ธŒ ํŠธ๋ฆฌ ์‰์ดํ‚น๊ณผ TypeScript ๊ฒ€์ฆ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ฝ˜ํ…์ธ  ์„ ์–ธ ํŒŒ์ผ ์‚ฌ์šฉ)
    ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๋ฉด JavaScript i18n์˜ ์—ญ์‚ฌ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

    Intlayer ์ปดํŒŒ์ผ๋Ÿฌ

    Intlayer๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•ด ์„ ์–ธ์  ์ ‘๊ทผ๋ฒ•์„ ๊ถŒ์žฅํ•˜๋Š” ์†”๋ฃจ์…˜์ด์ง€๋งŒ, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๊ฑฐ๋‚˜ ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘์„ ๋•๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    Intlayer ์ปดํŒŒ์ผ๋Ÿฌ๋Š” React, Vue, Svelte ์ปดํฌ๋„ŒํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐํƒ€ JavaScript/TypeScript ํŒŒ์ผ์˜ AST(์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ)๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์—ญํ• ์€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ๊ฐ์ง€ํ•˜์—ฌ ์ „์šฉ .content ์„ ์–ธ์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”: Intlayer Compiler Docs

    ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋งค๋ ฅ (์ผ๋ช… "๋งˆ๋ฒ•" ์ ‘๊ทผ๋ฒ•)

    ์ด ์ƒˆ๋กœ์šด ์ ‘๊ทผ๋ฒ•์ด ์œ ํ–‰ํ•˜๋Š” ๋ฐ๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๊ฒฝํ—˜์ด ๋†€๋ž๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค.

    1. ์†๋„์™€ "ํ๋ฆ„"

    ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์„ ๋•Œ ์˜๋ฏธ ์žˆ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„(home_hero_title_v2)์„ ๊ณ ๋ฏผํ•˜๋А๋ผ ๋ฉˆ์ถ”๋ฉด ํ๋ฆ„์ด ๋Š๊น๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด <p>Welcome back</p>๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฐ์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.

    2. ๋ ˆ๊ฑฐ์‹œ ๊ตฌ์กฐ ๊ตฌ์ถœ ๋ฏธ์…˜

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

    3. AI ์‹œ๋Œ€

    ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ„๊ณผํ•ด์„œ๋Š” ์•ˆ ๋  ํ˜„๋Œ€์ ์ธ ์ด์ ์ž…๋‹ˆ๋‹ค. AI ์ฝ”๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ(์˜ˆ: Copilot ๋˜๋Š” ChatGPT)๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œ์ค€ JSX/HTML์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ํŠน์ • ๋ฒˆ์—ญ ํ‚ค ์Šคํ‚ค๋งˆ๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

    • ์„ ์–ธ์ (Declarative): AI์˜ ์ถœ๋ ฅ์„ ํ…์ŠคํŠธ์—์„œ ํ‚ค๋กœ ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ปดํŒŒ์ผ๋Ÿฌ(Compiler): AI ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฐ”๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    ํ˜„์‹ค ์ ๊ฒ€: ์™œ "๋งˆ๋ฒ•"์ด ์œ„ํ—˜ํ•œ๊ฐ€

    "๋งˆ๋ฒ•" ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ๋งค๋ ฅ์ ์ด์ง€๋งŒ, ์ถ”์ƒํ™”๊ฐ€ ๋ˆ„์ˆ˜๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋„๊ตฌ์— ์ธ๊ฐ„์˜ ์˜๋„๋ฅผ ์ดํ•ดํ•˜๋„๋ก ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์•„ํ‚คํ…์ฒ˜์  ์ทจ์•ฝ์„ฑ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

    ํœด๋ฆฌ์Šคํ‹ฑ ์ทจ์•ฝ์„ฑ (์ถ”์ธก ๊ฒŒ์ž„)

    ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฌด์—‡์ด ์ฝ˜ํ…์ธ ์ด๊ณ  ๋ฌด์—‡์ด ์ฝ”๋“œ์ธ์ง€ ์ถ”์ธกํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋„๊ตฌ์™€ "์‹ธ์šฐ๊ฒŒ" ๋˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์‹ญ์‹œ์˜ค:

    • <span className="active"></span>๊ฐ€ ์ถ”์ถœ๋˜๋‚˜์š”? (๋ฌธ์ž์—ด์ด์ง€๋งŒ, ์•„๋งˆ๋„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค).
    • <span status="pending"></span>๊ฐ€ ์ถ”์ถœ๋˜๋‚˜์š”? (ํ”„๋กœํผํ‹ฐ ๊ฐ’์ž…๋‹ˆ๋‹ค).
    • <span>{"Hello World"}</span>๊ฐ€ ์ถ”์ถœ๋˜๋‚˜์š”? (JS ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค).
    • <span>Hello {name}. How are you?</span>๊ฐ€ ์ถ”์ถœ๋˜๋‚˜์š”? (๋ณด๊ฐ„๋ฒ•์ด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค).
    • <span aria-label="Image of cat"></span>๊ฐ€ ์ถ”์ถœ๋˜๋‚˜์š”? (์ ‘๊ทผ์„ฑ ์†์„ฑ์€ ๋ฒˆ์—ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค).
    • <span data-testid="my-element"></span>๋Š” ์ถ”์ถœ๋˜๋‚˜์š”? (ํ…Œ์ŠคํŠธ ID๋Š” ๋ฒˆ์—ญํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค).
    • <MyComponent errorMessage="An error occurred" />๋Š” ์ถ”์ถœ๋˜๋‚˜์š”?
    • <p>This is a paragraph{" "}\n containing multiple lines</p>๋Š” ์ถ”์ถœ๋˜๋‚˜์š”?
    • <p>{getStatusMessage()}</p> ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋Š” ์ถ”์ถœ๋˜๋‚˜์š”?
    • <div>{isLoading ? "The page is loading" : <MyComponent/>} </div>๋Š” ์ถ”์ถœ๋˜๋‚˜์š”?
    • <span>AX-99</span>์™€ ๊ฐ™์€ ์ œํ’ˆ ID๋Š” ์ถ”์ถœ๋˜๋‚˜์š”?

    ๊ฒฐ๊ตญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ํŠน์ • ์ฃผ์„(// ignore-translation ๊ฐ™์€)์ด๋‚˜ ํŠน์ • props(data-compiler-ignore="true" ๊ฐ™์€)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    Intlayer๋Š” ์ด ๋ณต์žก์„ฑ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋‚˜์š”?

    Intlayer๋Š” ํ•„๋“œ๊ฐ€ ๋ฒˆ์—ญ์„ ์œ„ํ•ด ์ถ”์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ผํ•ฉ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜คํƒ(false positives)์„ ์ตœ์†Œํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค:

    1. AST ๋ถ„์„: ์š”์†Œ ํƒ€์ž…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: reactNode, label, ๋˜๋Š” title prop์„ ๊ตฌ๋ถ„).
    2. ํŒจํ„ด ์ธ์‹: ๋ฌธ์ž์—ด์ด ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์„ ํฌํ•จํ•˜๋Š”์ง€ ๊ฐ์ง€ํ•˜์—ฌ, ์ฝ”๋“œ ์‹๋ณ„์ž๋ณด๋‹ค๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

    ๋™์  ๋ฐ์ดํ„ฐ์˜ ํ•œ๊ณ„

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

    ์ฒญํ‚น ๋ถ€์กฑ

    ์ผ๋ถ€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŽ˜์ด์ง€๋ณ„๋กœ ๋ฒˆ์—ญ์„ ์ฒญํ‚นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ธ์–ด๋ณ„๋กœ ํฐ JSON ํŒŒ์ผ(e.g., ./lang/en.json, ./lang/fr.json ๋“ฑ)์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ๋‹จ์ผ ๋ฐฉ๋ฌธ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•„์š” ์ด์ƒ์œผ๋กœ ๋งŽ์€ ์ฝ˜ํ…์ธ ๋กœ ํ•˜์ด๋“œ๋ ˆ์ด์…˜๋˜์–ด ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ฒˆ์—ญ์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•  ๋•Œ๋„ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด, ํ˜„์žฌ ์–ธ์–ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์–ธ์–ด์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ•จ๊ป˜ ๋กœ๋“œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด, 10๊ฐœ์˜ ํŽ˜์ด์ง€์™€ 10๊ฐœ์˜ ์–ธ์–ด(๋ชจ๋‘ 100% ๊ณ ์œ ํ•œ ๊ฒฝ์šฐ)๋ฅผ ๊ฐ€์ง„ ์‚ฌ์ดํŠธ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. ์ด ๊ฒฝ์šฐ 99๊ฐœ์˜ ์ถ”๊ฐ€ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค (10 ร— 10 - 1).

    "์ฒญํฌ ํญ๋ฐœ"๊ณผ ๋„คํŠธ์›Œํฌ ์›Œํ„ฐํด

    ์ฒญํ‚น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ผ๋ถ€ ์†”๋ฃจ์…˜์€ ์ปดํฌ๋„ŒํŠธ๋ณ„ ๋˜๋Š” ํ‚ค๋ณ„๋กœ ์ฒญํฌ๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ๋งŒ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์˜ ํŒ๋งค ํฌ์ธํŠธ๋Š” ์ข…์ข… "๋‹น์‹ ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ํŠธ๋ฆฌ ์‰์ดํ‚น๋œ๋‹ค"๋Š” ์ ์ž…๋‹ˆ๋‹ค.

    ์‹ค์ œ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ •์ ์œผ๋กœ ๋กœ๋“œํ•˜๋ฉด, ์†”๋ฃจ์…˜์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ํŠธ๋ฆฌ ์‰์ดํ‚นํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋ชจ๋“  ์–ธ์–ด์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•จ๊ป˜ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜์ง€ ์•Š์„๊นŒ์š”? ๋„ค, ๊ทธ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•˜๊ฒŒ ๋˜์ง€๋งŒ, ์ด๋Š” ๋‹จ์ ์ด ์ „ํ˜€ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

    ์ฝ˜ํ…์ธ ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋ฉด ๊ฐ ์ฝ˜ํ…์ธ  ์กฐ๊ฐ์ด ์ž์ฒด ์ฒญํฌ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…์ŠคํŠธ ๋ธ”๋ก๋‹น ํ•˜๋‚˜์˜ HTTP ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์— 1,000๊ฐœ์˜ ํ…์ŠคํŠธ ๋ธ”๋ก์ด ์žˆ๋‹ค๋ฉด? โ†’ ์„œ๋ฒ„์— 1,000๊ฐœ์˜ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”ผํ•ด๋ฅผ ์ค„์ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒซ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Suspense ๊ฒฝ๊ณ„๋‚˜ Skeleton Loader๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ : Next.js์™€ SSR์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋กœ๋”ฉ ํ›„์— ํ•˜์ด๋“œ๋ ˆ์ด์…˜๋˜๋ฏ€๋กœ HTTP ์š”์ฒญ์€ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ํ•ด๊ฒฐ์ฑ…? i18next, next-intl, ๋˜๋Š” intlayer์™€ ๊ฐ™์ด ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์ฝ˜ํ…์ธ  ์„ ์–ธ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ฐธ๊ณ : i18next์™€ next-intl์€ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ๋„ค์ž„์ŠคํŽ˜์ด์Šค/๋ฉ”์‹œ์ง€ ์ž„ํฌํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. rollup-plugin-visualizer(vite), @next/bundle-analyzer(next.js), ๋˜๋Š” webpack-bundle-analyzer(React CRA / Angular ๋“ฑ)์™€ ๊ฐ™์€ ๋ฒˆ๋“ค ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฒˆ์—ญ์œผ๋กœ ๋ฒˆ๋“ค์ด ์˜ค์—ผ๋˜๊ณ  ์žˆ๋Š”์ง€ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ

    ๋ฒˆ์—ญ์„ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๋งŒ๋“ค์–ด(์–ธ์–ด๋ฅผ ์ „ํ™˜ํ•  ๋•Œ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋˜๋„๋ก) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ข…์ข… ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ ๊ด€๋ฆฌ ํ›…์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

    • ๋น„์šฉ: 5,000๊ฐœ์˜ ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๊ฒฝ์šฐ, ํ…์ŠคํŠธ๋งŒ์„ ์œ„ํ•ด 5,000๊ฐœ์˜ useState์™€ useEffect ํ›…์„ ์ดˆ๊ธฐํ™”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. React๋Š” ๋ชจ๋“  5,000๋ช…์˜ ์†Œ๋น„์ž๋ฅผ ๋™์‹œ์— ์‹๋ณ„ํ•˜๊ณ  ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋Œ€๊ทœ๋ชจ์˜ "๋ฉ”์ธ ์Šค๋ ˆ๋“œ" ๋ธ”๋ก์ด ๋ฐœ์ƒํ•˜์—ฌ ์–ธ์–ด ์ „ํ™˜ ์‹œ UI๊ฐ€ ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ ์–ธํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ผ Context ์ œ๊ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š”)๊ฐ€ ์ ˆ์•ฝํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ์‚ฌ์ดํด์„ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค.
    React ์™ธ์˜ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

    ํ•จ์ •: ๋ฒค๋” ๋ฝ์ธ(Vendor Lock-in)

    ๋ฒˆ์—ญ ํ‚ค์˜ ์ถ”์ถœ ๋˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅํ•œ i18n ์†”๋ฃจ์…˜์„ ์„ ํƒํ•  ๋•Œ ์ฃผ์˜ํ•˜์„ธ์š”.

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

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

    ์ผ๋ถ€ ์†”๋ฃจ์…˜์€ ๋ฒˆ์—ญ ์ƒ์„ฑ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋ ˆ๋”ง์ด ์—†์œผ๋ฉด? ๋ฒˆ์—ญ๋„ ์—†์Šต๋‹ˆ๋‹ค.

    ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ข…์ข… ํ…์ŠคํŠธ๋ฅผ ํ•ด์‹œํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: "Hello World" -> x7f2a). ๋ฒˆ์—ญ ํŒŒ์ผ์€ { "x7f2a": "Hola Mundo" }์™€ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•จ์ •: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” "Hello World"๋ฅผ ๋ณด๊ณ  ํ•ด๋‹น ํ‚ค๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฒˆ์—ญ ํŒŒ์ผ์ด ํ•ด์‹œ(x7f2a)๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ํ”Œ๋žซํผ ์ข…์†์„ฑ

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

    ๋ฐ˜๋Œ€ํŽธ: ์„ ์–ธ์  ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์œ„ํ—˜

    ๊ณต์ •ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ์ „ํ†ต์ ์ธ ์„ ์–ธ์  ๋ฐฉ์‹๋„ ์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์ฒด์ ์ธ "ํ•จ์ •"์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

    1. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ง€์˜ฅ: ์–ด๋–ค JSON ํŒŒ์ผ์„ ๋กœ๋“œํ• ์ง€ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค(common.json, dashboard.json, footer.json). ํ•˜๋‚˜๋ผ๋„ ์žŠ์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” ์›์‹œ ํ‚ค๋ฅผ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    2. ๊ณผ๋„ํ•œ ๋กœ๋“œ: ์‹ ์ค‘ํ•œ ์„ค์ • ์—†์ด ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ๋ฒˆ์—ญ ํ‚ค๋ฅผ ์‹ค์ˆ˜๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ผ์ด ๋งค์šฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3. ๋™๊ธฐํ™” ๋ถˆ์ผ์น˜: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ญ์ œ๋œ ํ›„์—๋„ ํ•ด๋‹น ํ‚ค๊ฐ€ JSON ํŒŒ์ผ์— ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฒˆ์—ญ ํŒŒ์ผ์ด ๋ฌดํ•œํžˆ ์ปค์ง€๋ฉฐ "์ข€๋น„ ํ‚ค"๋กœ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    Intlayer์˜ ์ค‘๊ฐ„ ์ง€์ 

    ์ด๊ฒƒ์ด ๋ฐ”๋กœ Intlayer์™€ ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ํ˜์‹ ์„ ์‹œ๋„ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. Intlayer๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์•”๋ฌต์ ์ธ ๋งˆ๋ฒ•์€ ์œ„ํ—˜ํ•˜๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

    Intlayer๋Š” ์„ ์–ธ์  ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ์˜ ์žฅ์ ๊ณผ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํ˜ธํ™˜์„ฑ์„ ๋ชจ๋‘ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋Š” ํ˜ผํ•ฉ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

    ์ด๋กœ์จ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ๋ฒ•์˜ ์žฅ์ ์„ ๋ชจ๋‘ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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

    ๊ฒฐ๋ก 

    ๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ์š”?

    MVP๋ฅผ ๊ตฌ์ถ• ์ค‘์ด๊ฑฐ๋‚˜ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด: ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ๋ฒ•์ด ์œ ํšจํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ตฌ์กฐ๋‚˜ ํ‚ค์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋นŒ๋“œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ๋ถ€์ฑ„๋Š” "๋ฏธ๋ž˜์˜ ๋‹น์‹ "์ด ํ•ด๊ฒฐํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

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

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

    ์ „๋ฌธ์ ์ด๊ณ  ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ: ๋งˆ๋ฒ• ๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

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

    ๋Œ“๊ธ€

    ์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ ์˜๊ฒฌ์„ ๋‚˜๋ˆ ๋ณด์„ธ์š”.

    ๊ด€๋ จ ๊ฒŒ์‹œ๋ฌผ

    ์ตœ๊ทผ ๊ฒŒ์‹œ๋ฌผ