์ด ํ์ด์ง์๋ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ์ด ์ ๊ณต๋ฉ๋๋ค.
์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- "GitHub ์คํ ๋น๊ต ์ถ๊ฐ"v8.9.82026. 5. 18.
- "๋ฒค์น๋งํฌ ์ด๊ธฐํ"v8.7.122026. 1. 6.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
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 ์คํ๋ ํ๋ก์ ํธ์ ์ธ๊ธฐ, ์ปค๋ฎค๋ํฐ ์ ๋ขฐ ๋ฐ ์ฅ๊ธฐ์ ์ธ ๊ด๋ จ์ฑ์ ๋ํ๋ด๋ ๊ฐ๋ ฅํ ์งํ์ ๋๋ค. ๊ธฐ์ ์ ํ์ง์ ์ง์ ์ ์ผ๋ก ์ธก์ ํ๋ ๊ฒ์ ์๋์ง๋ง, ์ผ๋ง๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ๊ฐ ์ ์ฉํ๋ค๊ณ ์๊ฐํ๊ณ ์งํ ์ํฉ์ ํ๋ก์ฐํ๋ฉฐ ์ฑํํ ๊ฐ๋ฅ์ฑ์ด ์๋์ง๋ฅผ ๋ฐ์ํฉ๋๋ค. ํ๋ก์ ํธ์ ๊ฐ์น๋ฅผ ํ๊ฐํ ๋ ์คํ๋ ๋์ ๊ฐ์ ๊ฒฌ์ธ๋ ฅ์ ๋น๊ตํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ ์ํ๊ณ ์ฑ์ฅ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ฒฐ๊ณผ ์์ธ
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 ์คํ ์ค๋ฒํค๋(๊ฑฐ์ ๋์ ๋์ง ์๋๋ผ๋)๋ฅผ ์ถ๊ฐํฉ๋๋ค.
