์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- "Solid useIntlayer API ์ฌ์ฉ๋ฒ์ ์ง์ ์์ฑ ์ก์ธ์ค๋ก ์
๋ฐ์ดํธ"v8.9.02026. 5. 4.
- "Init doc"v8.4.52026. 3. 20.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Storybook๊ณผ ํจ๊ปํ๋ Intlayer
๋ชฉ์ฐจ
๋์๋ณด๋ค Intlayer๋ฅผ ์ ํํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
'storybook-react-i18next' ๋๋ 'i18next'์ ๊ฐ์ ์ฃผ์ ์๋ฃจ์ ๊ณผ ๋น๊ตํ ๋ Intlayer๋ ๋ค์๊ณผ ๊ฐ์ ํตํฉ ์ต์ ํ๊ฐ ์ ๊ณต๋๋ ์๋ฃจ์ ์ ๋๋ค.
Intlayer๋ ๋ค๊ตญ์ด ์คํ ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ, ๋ก์ผ์ผ ์ ํ ๋ฐ ๋์์ธ ์์คํ ์ ๋ฐ์ ๊ฑธ์ณ ๊ตญ์ ํ(i18n)๋ฅผ ํ์ฅํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ Storybook๊ณผ ์๋ฒฝํ๊ฒ ์๋ํ๋๋ก ์ต์ ํ๋์์ต๋๋ค.
๋์ฉ๋ JSON ํ์ผ์ ํ์ด์ง์ ๋ก๋ํ๋ ๋์ ํ์ํ ์ฝํ ์ธ ๋ง ๋ก๋ํ์ธ์. Intlayer๋ ๋ฒ๋ค ๋ฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ต๋ 50% ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ฝํ ์ธ ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ฉด ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด์ง๋๋ค. ์ ์ฒด ์ฝํ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฒํ ํด์ผ ํ๋ ์ ์ ์ ๋ถ๋ด ์์ด ๋จ์ผ ๊ธฐ๋ฅ ํด๋๋ฅผ ๋ณต์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๋ํ Intlayer๋ ์์ ํ ์ ํ๋์ด ์ฝํ ์ธ ์ ์ ํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์ฝํ ์ธ ๋ฅผ ๊ฐ์ ์์น์ ๋ฐฐ์นํ๋ฉด LLM(๋ํ ์ธ์ด ๋ชจ๋ธ)์ ํ์ํ ์ปจํ ์คํธ๊ฐ ์ค์ด๋ญ๋๋ค. Intlayer์๋ ๋๋ฝ๋ ๋ฒ์ญ์ ํ ์คํธํ๊ธฐ ์ํ CLI, LSP, MCP ๋ฐ agent skills, AI ์์ด์ ํธ๋ฅผ ์ํ ๊ฐ๋ฐ์ ๊ฒฝํ(DX)์ ๋์ฑ ์ํํ๊ฒ ๋ง๋ญ๋๋ค.
AI ๊ณต๊ธ์์ ๋น์ฉ์ผ๋ก ์ ํํ LLM์ ์ฌ์ฉํ์ฌ CI/CD ํ์ดํ๋ผ์ธ์ ๋ฒ์ญํ๋ ค๋ฉด ์๋ํ๋ฅผ ์ฌ์ฉํ์ธ์. Intlayer๋ ๋ํ ์ฝํ ์ธ ์ถ์ถ์ ์๋ํํ๋ ์ปดํ์ผ๋ฌ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฒ์ญ์ ๋๋ ์น ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
๋๊ท๋ชจ JSON ํ์ผ์ ๊ตฌ์ฑ ์์์ ์ฐ๊ฒฐํ๋ฉด ์ฑ๋ฅ ๋ฐ ๋ฐ์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Intlayer๋ ๋น๋ ์ ์ฝํ ์ธ ๋ก๋ฉ์ ์ต์ ํํฉ๋๋ค.
Intlayer๋ ๋จ์ํ i18n ์๋ฃจ์ ๊ทธ ์ด์์ผ๋ก ๊ด๋ฆฌ์ ๋์์ด ๋๋ ์์ฒด ํธ์คํ ๋น์ฃผ์ผ ํธ์ง๊ธฐ ๋ฐ ์ ์ฒด CMS๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค๊ตญ์ด ์ฝํ ์ธ ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๊ณตํ์ฌ ๋ฒ์ญ๊ฐ, ์นดํผ๋ผ์ดํฐ, ๊ธฐํ ํ์๊ณผ ์ํํ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ์ฝํ ์ธ ๋ ๋ก์ปฌ ๋ฐ/๋๋ ์๊ฒฉ์ผ๋ก ์ ์ฅ๋ ์ ์์ต๋๋ค.
์ Storybook์์ Intlayer๋ฅผ ์ฌ์ฉํด์ผ ํ๋์?
Storybook์ UI ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ๋ฌธ์ํํ๊ธฐ ์ํ ์ ๊ณ ํ์ค ๋๊ตฌ์ ๋๋ค. Intlayer์ ๊ฒฐํฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์์ต๋๋ค:
- ๋ชจ๋ ๋ก์ผ์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: ๋๊ตฌ ๋ชจ์ ์ค์์ฒ๋ฅผ ์ฌ์ฉํ์ฌ Storybook ์บ๋ฒ์ค ๋ด๋ถ์์ ์ง์ ํ์ธํ ์ ์์ต๋๋ค.
- ๋๋ฝ๋ ๋ฒ์ญ ๊ฐ์ง: ํ๋ก๋์ ์ ๋๋ฌํ๊ธฐ ์ ์ ๋ฒ์ญ ๋๋ฝ์ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ค๊ตญ์ด ์ปดํฌ๋ํธ ๋ฌธ์ํ: ํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด ๋์ ์ค์ ํ์์ด ์์ ํ(type-safe) ์ฝํ ์ธ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ํํ ์ ์์ต๋๋ค.
๋จ๊ณ๋ณ ์ค์
์ข ์์ฑ ์ค์น
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํ ์ด๋ธ์ ๋ชจ๋ ๋ด์ฉ ํ์ํ ์ด๋ธ์ ๋ชจ๋ฌ๋ก ์ด์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ํ์ธ
ํจํค์ง ์ญํ intlayer์ฝ์ด - ๊ตฌ์ฑ, ์ฝํ ์ธ ์ปดํ์ผ, CLI react-intlayerReact ๋ฐ์ธ๋ฉ - IntlayerProvider,useIntlayerํvite-intlayerVite ํ๋ฌ๊ทธ์ธ - ์ฝํ ์ธ ์ ์ธ ํ์ผ์ ๊ฐ์ํ๊ณ ์ปดํ์ผ Intlayer ๊ตฌ์ฑ ์์ฑ
ํ๋ก์ ํธ ๋ฃจํธ(๋๋ ๋์์ธ ์์คํ ํจํค์ง ๋ด๋ถ)์
intlayer.config.ts๋ฅผ ์์ฑํฉ๋๋ค:intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ ์ฒด ์ต์ ๋ชฉ๋ก์ ๊ตฌ์ฑ ์ฐธ์กฐ๋ฅผ ํ์ธํ์ธ์.
Storybook์ Vite ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ
Storybook์
viteFinalํ ์ ์ฌ์ฉํ๋ฉด ๋ด๋ถ Vite ๊ตฌ์ฑ์ ํ์ฅํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์intlayer()ํ๋ฌ๊ทธ์ธ์ ๊ฐ์ ธ์์ ์ถ๊ฐํฉ๋๋ค:.storybook/main.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
intlayer()ํ๋ฌ๊ทธ์ธ์*.content.tsํ์ผ์ ๊ฐ์ํ๊ณ Storybook ๊ฐ๋ฐ ์ค์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธธ ๋๋ง๋ค ์๋์ผ๋ก ์ฌ์ ์ ๋ค์ ๋น๋ํฉ๋๋ค.`IntlayerProvider` ๋ฐ์ฝ๋ ์ดํฐ ๋ฐ ๋ก์ผ์ผ ๋๊ตฌ ๋ชจ์ ์ถ๊ฐ
Storybook์
previewํ์ผ์ ๋ชจ๋ ์คํ ๋ฆฌ๋ฅผIntlayerProvider๋ก ๊ฐ์ธ๊ณ ๋๊ตฌ ๋ชจ์์ ๋ก์ผ์ผ ์ค์์ฒ๋ฅผ ๋ ธ์ถํ๊ธฐ์ ์ ํฉํ ์ฅ์์ ๋๋ค:.storybook/preview.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
locale๊ฐ์intlayer.config.ts์ ์ ์ธ๋ ๋ก์ผ์ผ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
์ข ์์ฑ ์ค์น
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Intlayer ๊ตฌ์ฑ ์์ฑ
ํ๋ก์ ํธ ๋ฃจํธ์
intlayer.config.ts๋ฅผ ์์ฑํฉ๋๋ค:intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Storybook์ Webpack ๊ตฌ์ฑ
Webpack ๊ธฐ๋ฐ Storybook ์ค์ (์:
@storybook/react-webpack5)์ ๊ฒฝ์ฐ,webpackFinal์ ํตํด webpack ๊ตฌ์ฑ์ ํ์ฅํ์ฌ Intlayer ๋ณ์นญ(alias) ๋ฐ ๋ก๋๋ฅผ ์ถ๊ฐํฉ๋๋ค:.storybook/main.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
`IntlayerProvider` ๋ฐ์ฝ๋ ์ดํฐ ๋ฐ ๋ก์ผ์ผ ๋๊ตฌ ๋ชจ์ ์ถ๊ฐ
Vite ์ค์ ๊ณผ ๋์ผํ๊ฒ
.storybook/preview.tsx์ ๋ฐ์ฝ๋ ์ดํฐ์ ์ ์ญ ๋ก์ผ์ผ ์ ํ์ ์ถ๊ฐํฉ๋๋ค:.storybook/preview.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ฝํ ์ธ ์ ์ธ
๊ฐ ์ปดํฌ๋ํธ ์์ *.content.ts ํ์ผ์ ์์ฑํฉ๋๋ค. Intlayer๋ ์ปดํ์ผ ์ค์ ์ด๋ฅผ ์๋์ผ๋ก ๊ฐ์งํฉ๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
import { type Dictionary, t } from "intlayer";
const copyButtonContent = {
key: "copy-button",
content: {
label: t({
en: "Copy content",
fr: "Copier le contenu",
es: "Copiar contenido",
}),
},
} satisfies Dictionary;
export default copyButtonContent;
๋ ๋ง์ ์ฝํ ์ธ ์ ์ธ ํ์๊ณผ ๊ธฐ๋ฅ์ ์ฝํ ์ธ ์ ์ธ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ปดํฌ๋ํธ์์ useIntlayer ์ฌ์ฉํ๊ธฐ
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
useIntlayer๋ ๊ฐ์ฅ ๊ฐ๊น์ด IntlayerProvider์์ ์ ๊ณตํ๋ ํ์ฌ ๋ก์ผ์ผ์ ๋ํ ์ปดํ์ผ๋ ์ฌ์ ์ ๋ฐํํฉ๋๋ค. Storybook ๋๊ตฌ ๋ชจ์์์ ๋ก์ผ์ผ์ ์ ํํ๋ฉด ์
๋ฐ์ดํธ๋ ๋ฒ์ญ์ผ๋ก ์คํ ๋ฆฌ๊ฐ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
๊ตญ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ํ ์คํ ๋ฆฌ ์์ฑ
IntlayerProvider ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ค์ ๋๋ฉด ์คํ ๋ฆฌ๋ ์ด์ ๊ณผ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค. ๋ก์ผ์ผ ๋๊ตฌ ๋ชจ์์ ์ ์ฒด ์บ๋ฒ์ค์ ํ์ฑ ๋ก์ผ์ผ์ ์ ์ดํฉ๋๋ค:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๊ฐ ์คํ ๋ฆฌ๋ ๋๊ตฌ ๋ชจ์์์ locale ์ ์ญ ๋ณ์๋ฅผ ์์ํ๋ฏ๋ก ์คํ ๋ฆฌ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ชจ๋ ๋ก์ผ์ผ์ ํ์ธํ ์ ์์ต๋๋ค.
์คํ ๋ฆฌ์์ ๋ฒ์ญ ํ ์คํธํ๊ธฐ
Storybook์ play ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํน์ ๋ก์ผ์ผ์ ๋ํด ์ฌ๋ฐ๋ฅธ ๋ฒ์ญ ํ
์คํธ๊ฐ ๋ ๋๋ง๋์๋์ง ํ์ธํ์ธ์:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
