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

    Svelte i18n ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - 2026 ๋ฒค์น˜๋งˆํฌ ๋ฆฌํฌํŠธ

    ์ด ํŽ˜์ด์ง€๋Š” Svelte i18n ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๋ฒค์น˜๋งˆํฌ ๋ฆฌํฌํŠธ์ž…๋‹ˆ๋‹ค.

    ๋ชฉ์ฐจ

    ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฒค์น˜๋งˆํฌ

    ๋™์  JSON ๋กœ๋“œ

    ๋Ÿฐํƒ€์ž„์— ๋ฒˆ์—ญ์„ ์ง€์—ฐ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค

    ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ JSON (๋„ค์ž„์ŠคํŽ˜์ด์‹ฑ)

    ํŽ˜์ด์ง€๋ณ„ ๋ฒˆ์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

    I18n ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ

    ์ด ์ธก์ •ํ•ญ๋ชฉ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

    ๊ตญ์ œํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒˆ๋“ค์˜ ์ด gzip ์••์ถ• ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น ๋ฐ ๋ฏธ๋‹ˆํ”ผ์ผ€์ด์…˜ ํ›„์˜ ํ”„๋กœ๋ฐ”์ด๋” ๋ฐ ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰ ๋กœ์ง๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”?

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฉด ์ดˆ๊ธฐ JavaScript ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์ค„์–ด๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

    ๋ณด๊ธฐ ํ˜•์‹

    ๊ฒฐ๊ณผ ์ฐธ์กฐ:

    ์ „์ฒด ๋ฒค์น˜๋งˆํฌ ๋ฐ์ดํ„ฐ ๋ณด๊ธฐ

    ์ „์ฒด ๋ฒค์น˜๋งˆํฌ ์ €์žฅ์†Œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์„œ๋ก 

    ๊ตญ์ œํ™” ์†”๋ฃจ์…˜์€ Svelte ์•ฑ์—์„œ ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์˜์กด์„ฑ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ์œ„ํ—˜์€ ๋ถˆํ•„์š”ํ•œ ์ฝ˜ํ…์ธ , ์ฆ‰ ๋‹จ์ผ ๊ฒฝ๋กœ์˜ ๋ฒˆ๋“ค์— ๋‹ค๋ฅธ ํŽ˜์ด์ง€์™€ ๋‹ค๋ฅธ ๋กœ์ผ€์ผ์˜ ๋ฒˆ์—ญ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์•ฑ์ด ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๋ฌธ์ œ๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก๋˜๋Š” JavaScript๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒฝ์ฐฝ์‹œํ‚ค๊ณ  ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์‹ค์ œ๋กœ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€์žฅ ๋œ ๋œ ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ, ๊ตญ์ œํ™”๋œ ํŽ˜์ด์ง€๊ฐ€ i18n์ด ์—†๋Š” ๋ฒ„์ „๋ณด๋‹ค ๋ช‡ ๋ฐฐ๋‚˜ ๋ฌด๊ฑฐ์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋˜ ๋‹ค๋ฅธ ์˜ํ–ฅ์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜(DX)์ž…๋‹ˆ๋‹ค: ์ฝ˜ํ…์ธ  ์„ ์–ธ ๋ฐฉ์‹, ํƒ€์ž…, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ตฌ์„ฑ, ๋™์  ๋กœ๋”ฉ, ๋กœ์ผ€์ผ ๋ณ€๊ฒฝ ์‹œ์˜ ๋ฐ˜์‘์„ฑ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    TL;DR

    • Intlayer: ๊ฐ€์žฅ ์„ฑ๋Šฅ ํšจ์œจ์ ์ธ ์„ ํƒ(v8.7.12)์œผ๋กœ, ๋ฐœ์ž๊ตญ(footprint)์ด ๊ฐ€์žฅ ์ž‘์Šต๋‹ˆ๋‹ค.
    • Paraglide: ํŠธ๋ฆฌ ์‰์ดํ‚น(tree-shaking)์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ํ›„๋ณด์ด์ง€๋งŒ, ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ด ๋” ๋ณต์žกํ•˜๊ณ  ๋ฐ˜์‘์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • svelte-i18n: Svelte๋ฅผ ์œ„ํ•œ ํ‘œ์ค€์ ์ด๊ณ  ๊ธฐ๋Šฅ์ด ์™„๋น„๋œ ์†”๋ฃจ์…˜์ด์ง€๋งŒ, ๋ฒˆ๋“ค ๋ฌด๊ฒŒ๊ฐ€ ํ›จ์”ฌ ๋” ํฝ๋‹ˆ๋‹ค(Intlayer์˜ ์•ฝ 7๋ฐฐ).

    ์•ฑ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

    i18n ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌด๋ฃŒ ์Šค์บ๋„ˆ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๋ฌธ์ œ์ 

    ๋‹ค๊ตญ์–ด ์•ฑ์˜ ๋น„์šฉ์„ ์ œํ•œํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€ ๋ ˆ๋ฒ„๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค:

    • ํŽ˜์ด์ง€ / ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ณ„๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ „์ฒด ์‚ฌ์ „์„ ๋กœ๋“œํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์š”ํ•  ๋•Œ๋งŒ ์˜ฌ๋ฐ”๋ฅธ ๋กœ์ผ€์ผ์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ธฐ์ˆ ์  ํ•œ๊ณ„ ์ดํ•ด:

    ๋™์  ๋กœ๋”ฉ

    ๋™์  ๋กœ๋”ฉ์ด ์—†์œผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์†”๋ฃจ์…˜์€ ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•˜๋ฏ€๋กœ ๊ฒฝ๋กœ์™€ ๋กœ์ผ€์ผ์ด ๋งŽ์€ ์•ฑ์˜ ๊ฒฝ์šฐ ์ƒ๋‹นํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ๋™์  ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ดˆ๊ธฐ JS๋Š” ์ค„์–ด๋“ค์ง€๋งŒ ์–ธ์–ด ์ „ํ™˜ ์‹œ ์ถ”๊ฐ€ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ๋‹จ์ ์„ ์ˆ˜์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    ์ฝ˜ํ…์ธ  ๋ถ„๋ฆฌ

    t('a.b.c')๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•๋œ ๊ตฌ๋ฌธ์€ ๋งค์šฐ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— ํฐ JSON ๊ฐ์ฒด๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์กฐ์žฅํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‹ค์ œ ํŽ˜์ด์ง€๋ณ„ ๋ถ„๋ฆฌ ์ „๋žต์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ•œ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ์—ฐ๊ตฌ ๋ฐฉ๋ฒ•๋ก 

    ์ด ๋ฒค์น˜๋งˆํฌ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค:

    • Base App (i18n ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์Œ)
    • svelte-intlayer (v8.7.12)
    • svelte-i18n (v4.0.1)
    • @inlang/paraglide-js (v2.17.0)

    ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Svelte์ด๋ฉฐ 10๊ฐœ์˜ ํŽ˜์ด์ง€์™€ 10๊ฐœ์˜ ์–ธ์–ด๋ฅผ ๊ฐ€์ง„ ๋‹ค๊ตญ์–ด ์•ฑ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๋„ค ๊ฐ€์ง€ ๋กœ๋”ฉ ์ „๋žต์„ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค:

    ์ „๋žต ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์—†์Œ (๊ธ€๋กœ๋ฒŒ) ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํฌํ•จ (์Šค์ฝ”ํ”„)
    ์ •์  ๋กœ๋”ฉ Static: ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ. Scoped static: ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ณ„ ๋ถ„๋ฆฌ; ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ๊ฒƒ์„ ๋กœ๋“œ.
    ๋™์  ๋กœ๋”ฉ Dynamic: ๋กœ์ผ€์ผ๋ณ„ ์˜จ๋””๋งจ๋“œ ๋กœ๋”ฉ. Scoped dynamic: ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฐ ๋กœ์ผ€์ผ๋ณ„ ์„ธ๋ถ„ํ™”๋œ ๋กœ๋”ฉ.

    ์ „๋žต ์š”์•ฝ

    • Static: ๊ฐ„๋‹จํ•จ. ์ดˆ๊ธฐ ๋กœ๋“œ ํ›„ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์—†์Œ. ๋‹จ์ : ํฐ ๋ฒˆ๋“ค ํฌ๊ธฐ.
    • Dynamic: ์ดˆ๊ธฐ ๋ฌด๊ฒŒ ๊ฐ์†Œ(์ง€์—ฐ ๋กœ๋”ฉ). ๋กœ์ผ€์ผ์ด ๋งŽ์„ ๋•Œ ์ ํ•ฉํ•จ.
    • Scoped static: ๋ณต์žกํ•œ ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์—†์ด ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€(๋…ผ๋ฆฌ์  ๋ถ„๋ฆฌ).
    • Scoped dynamic: ์ฝ”๋“œ ๋ถ„ํ•  ๋ฐ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ์ตœ์„ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹. ํ˜„์žฌ ๋ทฐ์™€ ํ™œ์„ฑ ๋กœ์ผ€์ผ์— ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋กœ๋“œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•จ.

    ์ธก์ •ํ•œ ํ•ญ๋ชฉ:

    ๋™์ผํ•œ ๋‹ค๊ตญ์–ด ์•ฑ์„ ๋ชจ๋“  ์Šคํƒ์—์„œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์‹คํ–‰ํ•˜๊ณ , ์‹ค์ œ๋กœ ์ „์†ก๋œ ๋‚ด์šฉ๊ณผ ์†Œ์š” ์‹œ๊ฐ„์„ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์ธ ์›น ์••์ถ• ํ›„ ๋ณด๊ณ ๋˜๋ฉฐ, ์ด๋Š” ์›๋ณธ ์†Œ์Šค ํฌ๊ธฐ๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋‚ด์šฉ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

    • ๊ตญ์ œํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๊ธฐ: ๋ฒˆ๋“ค๋ง, ํŠธ๋ฆฌ ์‰์ดํ‚น ๋ฐ ์ตœ์†Œํ™” ํ›„, i18n ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํฌ๊ธฐ๋Š” ๋นˆ ์ปดํฌ๋„ŒํŠธ์˜ providers + stores ์ฝ”๋“œ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋ฒˆ์—ญ ํŒŒ์ผ ๋กœ๋”ฉ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋˜๊ธฐ ์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋น„์šฉ์ด ์–ด๋А ์ •๋„์ธ์ง€ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    • ํŽ˜์ด์ง€๋‹น JavaScript: ๊ฐ ๋ฒค์น˜๋งˆํฌ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ฐฉ๋ฌธ์—์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ์–‘์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์Šค์œ„ํŠธ์˜ ํŽ˜์ด์ง€๋“ค๊ณผ ๋ฆฌํฌํŠธ๊ฐ€ ๋กค์—…ํ•˜๋Š” ๋กœ์ผ€์ผ๋“ค ์ „์ฒด์—์„œ ํ‰๊ท ํ™”๋ฉ๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด ํŽ˜์ด์ง€๋Š” ๋А๋ฆฐ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

    • ๋‹ค๋ฅธ ๋กœ์ผ€์ผ์—์„œ์˜ ๋ˆ„์ˆ˜: ๊ฐ์‚ฌ๋œ ํŽ˜์ด์ง€์—์„œ ์‹ค์ˆ˜๋กœ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋™์ผํ•œ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ˜ํ…์ธ ๋Š” ๋ถˆํ•„์š”ํ•˜๋ฉฐ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: /en/about ํŽ˜์ด์ง€ ๋ฒˆ๋“ค์—์„œ /fr/about ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ )

    • ๋‹ค๋ฅธ ๊ฒฝ๋กœ์—์„œ์˜ ๋ˆ„์ˆ˜: ๋‹ค๋ฅธ ํ™”๋ฉด์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํ•œ ํŽ˜์ด์ง€๋งŒ ์—ด์—ˆ์„ ๋•Œ ํ•ด๋‹น ๋ณต์‚ฌ๋ณธ์ด ํ•จ๊ป˜ ๋กœ๋“œ๋˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. (์˜ˆ: /en/contact ํŽ˜์ด์ง€ ๋ฒˆ๋“ค์—์„œ /en/about ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ). ๋†’์€ ์ ์ˆ˜๋Š” ์•ฝํ•œ ๋ถ„ํ•  ๋˜๋Š” ๊ณผ๋„ํ•˜๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฒˆ๋“ค์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

    • ์–ธ์–ด ์ „ํ™˜ ๋ฐ˜์‘์„ฑ: ์•ฑ์˜ ์ž์ฒด ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ธ์–ด๋ฅผ ์ „ํ™˜ํ•˜๊ณ  ํŽ˜์ด์ง€๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „ํ™˜๋  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋ˆˆ์œผ๋กœ ๋ณด๊ฒŒ ๋˜๋Š” ์‹œ๊ฐ„์ด์ง€, ๋žฉ ๋งˆ์ดํฌ๋กœ ์Šคํ…์ด ์•„๋‹™๋‹ˆ๋‹ค.

    • ์–ธ์–ด ๋ณ€๊ฒฝ ํ›„ ๋ Œ๋”๋ง ์ž‘์—…: ๋” ์ข์€ ํ›„์† ์กฐ์น˜์ž…๋‹ˆ๋‹ค. ์ „ํ™˜์ด ์ง„ํ–‰ ์ค‘์ธ ์ƒํƒœ์—์„œ ์ƒˆ ์–ธ์–ด๋ฅผ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค์‹œ ์น ํ•˜๋Š” ๋ฐ ์†Œ์š”๋œ ๋…ธ๋ ฅ์˜ ์ •๋„์ž…๋‹ˆ๋‹ค. "๋А๊ปด์ง€๋Š”" ์‹œ๊ฐ„๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ ๋น„์šฉ์ด ๋‹ค๋ฅผ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„: ํ…Œ์ŠคํŠธํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ๋กœ๋“œ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ฝœ๋“œ ์‹œ์ž‘์„ ๋น„๊ตํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • Hydration ์‹œ๊ฐ„: ์•ฑ์ด ๋…ธ์ถœํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„ HTML์„ ์‹ค์ œ๋กœ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ํ‘œ์˜ ๋Œ€์‹œ๋Š” ํ•ด๋‹น ๊ตฌํ˜„์ด ์ด ๋ฒค์น˜๋งˆํฌ์—์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” hydration ์ˆ˜์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    GitHub ์Šคํƒ€

    GitHub ์Šคํƒ€๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ธ๊ธฐ, ์ปค๋ฎค๋‹ˆํ‹ฐ ์‹ ๋ขฐ ๋ฐ ์žฅ๊ธฐ์ ์ธ ๊ด€๋ จ์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ•๋ ฅํ•œ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์  ํ’ˆ์งˆ์„ ์ง์ ‘์ ์œผ๋กœ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ง„ํ–‰ ์ƒํ™ฉ์„ ํŒ”๋กœ์šฐํ•˜๋ฉฐ ์ฑ„ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์น˜๋ฅผ ํ‰๊ฐ€ํ•  ๋•Œ ์Šคํƒ€๋Š” ๋Œ€์•ˆ ๊ฐ„์˜ ๊ฒฌ์ธ๋ ฅ์„ ๋น„๊ตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ ์ƒํƒœ๊ณ„ ์„ฑ์žฅ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    Star History Chart

    ๊ฒฐ๊ณผ ์ƒ์„ธ

    1 - ํ”ผํ•ด์•ผ ํ•  ์†”๋ฃจ์…˜

    Svelte ์—์ฝ”์‹œ์Šคํ…œ์—์„œ ๋ถ„๋ช…ํ•˜๊ฒŒ ํ”ผํ•ด์•ผ ํ•  ์†”๋ฃจ์…˜์€ ์—†์Šต๋‹ˆ๋‹ค.

    2 - ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜

    (Paraglide) (@inlang/paraglide-js@2.17.0):

    Paraglide๋Š” ํ˜์‹ ์ ์ด๊ณ  ์ž˜ ์„ค๊ณ„๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Vite + Svelte ์•ฑ์˜ ๋งฅ๋ฝ์—์„œ ๊ทธ๋“ค์ด ํ™๋ณดํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ๊ธฐ๋Œ€๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ React + TanStack Start์˜ ๊ฒฝ์šฐ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ๊ธฐ๋Œ€๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ Next.js๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Svelte ๋ฐ TanStack Start ํ”„๋กœ์ ํŠธ์—์„œ์˜ Paraglide ์‚ฌ์šฉ์€ ํ™•์ธํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ์šฐ์™€ DX ๋˜ํ•œ ๋‹ค๋ฅธ ์˜ต์…˜๋ณด๋‹ค ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค JS ํŒŒ์ผ์„ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋Š” PR์„ ํ†ตํ•œ ๊ฐœ๋ฐœ์ž๋“ค ๊ฐ„์˜ ์ง€์†์ ์ธ ๋จธ์ง€ ์ถฉ๋Œ ์œ„ํ—˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋„๊ตฌ๋Š” Next.js๋ณด๋‹ค Vite์— ๋” ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜๊ณผ ๋น„๊ตํ•˜์—ฌ Paraglide๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•œ ํ˜„์žฌ ๋กœ์ผ€์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์Šคํ† ์–ด(์˜ˆ: Svelte store)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์‹ฑ๋˜๋Š” ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด localStorage / ์ฟ ํ‚ค ๋“ฑ์—์„œ ๋กœ์ผ€์ผ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ปดํฌ๋„ŒํŠธ ๋ฐ˜์‘์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์ฃผ๋Š” ๋ถˆํ•„์š”ํ•œ ๋กœ์ง ์‹คํ–‰์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

    paraglide์— ๊ด€ํ•œ ์ฐธ๊ณ : ์ด ์†”๋ฃจ์…˜์€ ์ž„ํฌํŠธ๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๋ฏ€๋กœ, ๋ฒค์น˜๋งˆํฌ ๋ฆฌํฌํŠธ์˜ 'lib size' ๋ฉ”ํŠธ๋ฆญ์€ ๊ฑฐ์˜ 0์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์„ฑ(Code generation)์€ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์— ํ•„์š”ํ•œ ๋กœ์ง(๋ชจ๋“  ์ ‘๋‘์‚ฌ vs ์ ‘๋‘์‚ฌ ์—†์Œ, ์ฟ ํ‚ค vs ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ)๋งŒ ํฌํ•จ๋˜๋ฏ€๋กœ ์ข‹์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด์— ๋น„ํ•ด Intlayer๋Š” ๋นŒ๋“œ ์‹œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฃผ์ž…์„ ํ†ตํ•ด ์ด ํ•„ํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋กœ์ง์— ๋”ฐ๋ผ ์ฝ˜ํ…์ธ ๋ฅผ ํŠธ๋ฆฌ ์‰์ดํ‚นํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— paraglide์™€ intlayer๋Š” i18next๋‚˜ next-intl๋ณด๋‹ค 6~10๋ฐฐ ๋” ๊ฐ€๋ฒผ์šด ์†”๋ฃจ์…˜์ด ๋ฉ๋‹ˆ๋‹ค.

    (svelte-i18n) (svelte-i18n@3.4.0):

    ์ด ์†”๋ฃจ์…˜์€ Svelte ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  i18n ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ i18next๋‚˜ ๋‹ค๋ฅธ ์ฃผ์š” i18n ์†”๋ฃจ์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์กฐ๊ธˆ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค (~15.9kb, svelte-intlayer์˜ ์•ฝ 7๋ฐฐ).

    3 - ์ถ”์ฒœ ์‚ฌํ•ญ

    (Intlayer) (svelte-intlayer@8.7.12):

    ๊ฐ๊ด€์„ฑ์„ ์œ„ํ•ด ๋‚˜์˜ ์†”๋ฃจ์…˜์ธ svelte-intlayer์— ๋Œ€ํ•ด์„œ๋Š” ์ง์ ‘ ํŒ๋‹จํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

    ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ

    ์ด ์˜๊ฒฌ์€ ๊ฐœ์ธ์ ์ธ ๊ฒƒ์ด๋ฉฐ ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  i18n ์„ธ๊ณ„์—์„œ๋Š” ๋ฒˆ์—ญ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์œ„ํ•ด const t = useTranslation('xx') + <>{t('xx.xx')}</>์™€ ๊ฐ™์€ ํŒจํ„ด์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์ž์ฃผ ๋ณด์ž…๋‹ˆ๋‹ค.

    Svelte ์•ฑ์—์„œ ํ•จ์ˆ˜๋ฅผ Slot์œผ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ๊ฒฌํ•ด๋กœ๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต์žก์„ฑ๊ณผ JavaScript ์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ(๊ฑฐ์˜ ๋ˆˆ์— ๋„์ง€ ์•Š๋”๋ผ๋„)๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.