์ด ํ์ด์ง์๋ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ์ด ์ ๊ณต๋ฉ๋๋ค.
์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- ์ด๊ธฐ ๋ฒ์ v7.0.02025. 11. 1.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
2025๋ ์ next-intl์ ์ฌ์ฉํ์ฌ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตญ์ ํํ๋ ๋ฐฉ๋ฒ
๋ชฉ์ฐจ
next-intl์ด๋?
next-intl์ Next.js App Router๋ฅผ ์ํด ํน๋ณํ ์ค๊ณ๋ ์ธ๊ธฐ ์๋ ๊ตญ์ ํ(i18n) ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ฐ์ด๋ TypeScript ์ง์๊ณผ ๋ด์ฅ ์ต์ ํ๋ฅผ ์ ๊ณตํ์ฌ ๋ค๊ตญ์ด Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํํ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ํ์ ๋ค๋ฉด next-i18next ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ๊ฑฐ๋, ์ง์ Intlayer๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๋น๊ต ๋ด์ฉ์ next-i18next vs next-intl vs Intlayer์์ ํ์ธํ์ธ์.
๋ฐ๋ผ์ผ ํ ๋ชจ๋ฒ ์ฌ๋ก
๊ตฌํ์ ๋ค์ด๊ฐ๊ธฐ ์ ์, ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค:
- HTML
lang๋ฐdir์์ฑ ์ค์ ๋ ์ด์์์์getLocaleDirection(locale)๋ฅผ ์ฌ์ฉํ์ฌdir์ ๊ณ์ฐํ๊ณ , ์ฌ๋ฐ๋ฅธ ์ ๊ทผ์ฑ๊ณผ SEO๋ฅผ ์ํด<html lang={locale} dir={dir}>๋ฅผ ์ค์ ํ์ธ์. - ๋ค์์คํ์ด์ค๋ณ ๋ฉ์์ง ๋ถ๋ฆฌ
๋ก์ผ์ผ๊ณผ ๋ค์์คํ์ด์ค๋ณ๋ก JSON ํ์ผ์ ๊ตฌ์ฑํ์ฌ (์:
common.json,about.json) ํ์ํ ๊ฒ๋ง ๋ก๋ํ๋๋ก ํ์ธ์. - ํด๋ผ์ด์ธํธ ํ์ด๋ก๋ ์ต์ํ
ํ์ด์ง์์
NextIntlClientProvider์ ํ์ํ ๋ค์์คํ์ด์ค๋ง ์ ์กํ์ธ์ (์:pick(messages, ['common', 'about'])). - ์ ์ ํ์ด์ง ์ ํธ ์ฑ๋ฅ๊ณผ SEO ํฅ์์ ์ํด ๊ฐ๋ฅํ ํ ์ ์ ํ์ด์ง๋ฅผ ์ฌ์ฉํ์ธ์.
- ์๋ฒ ์ปดํฌ๋ํธ์์์ i18n
์๋ฒ ์ปดํฌ๋ํธ๋ ํ์ด์ง๋ client๋ก ํ์๋์ง ์์ ๋ชจ๋ ์ปดํฌ๋ํธ์ฒ๋ผ ์ ์ ์ด๋ฉฐ ๋น๋ ์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฒ์ญ ํจ์๋ฅผ props๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
- TypeScript ํ์
์ค์
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ก์ผ์ผ์ ๋ํ ํ์ ์ ์ค์ ํ์ธ์. - ๋ฆฌ๋๋ ์
์ ์ํ ํ๋ก์
๋ก์ผ์ผ ๊ฐ์ง์ ๋ผ์ฐํ ์ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์๋ฅผ ์ ์ ํ ๋ก์ผ์ผ ์ ๋์ฌ๊ฐ ๋ถ์ URL๋ก ๋ฆฌ๋๋ ์ ํ๊ธฐ ์ํด ํ๋ก์๋ฅผ ์ฌ์ฉํ์ธ์. - ๋ฉํ๋ฐ์ดํฐ, ์ฌ์ดํธ๋งต, robots.txt์ ๊ตญ์ ํ
Next.js์์ ์ ๊ณตํ๋generateMetadataํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํ๋ฐ์ดํฐ, ์ฌ์ดํธ๋งต, robots.txt๋ฅผ ๊ตญ์ ํํ์ฌ ๋ชจ๋ ๋ก์ผ์ผ์์ ๊ฒ์ ์์ง์ด ๋ ์ ์ธ์ํ๋๋ก ํ์ธ์. - ๋งํฌ ํ์งํ
Link์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋งํฌ๋ฅผ ํ์งํํ๊ณ ์ฌ์ฉ์๋ฅผ ์ ์ ํ ๋ก์ผ์ผ ์ ๋์ฌ๊ฐ ๋ถ์ URL๋ก ๋ฆฌ๋๋ ์ ํ์ธ์. ์ด๋ ๋ชจ๋ ๋ก์ผ์ผ์์ ํ์ด์ง์ ๊ฒ์ ๊ฐ๋ฅ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค. - ํ ์คํธ ๋ฐ ๋ฒ์ญ ์๋ํ ํ ์คํธ์ ๋ฒ์ญ ์๋ํ๋ ๋ค๊ตญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๊ด๋ฆฌํ๋ ๋ฐ ์์๋๋ ์๊ฐ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ตญ์ ํ ๋ฐ SEO์ ๋ํด ์์์ผ ํ ๋ชจ๋ ๋ด์ฉ์ ์ ๋ฆฌํ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์: next-intl๊ณผ ํจ๊ปํ๋ ๊ตญ์ ํ(i18n).
Next.js ์ ํ๋ฆฌ์ผ์ด์ ์์ next-intl ์ค์ ๋จ๊ณ๋ณ ๊ฐ์ด๋
GitHub์์ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ์ ์ฐธ์กฐํ์ธ์.
๋ค์์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๋๋ค:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์์กด์ฑ ์ค์น
npm์ ์ฌ์ฉํ์ฌ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ์ธ์:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
- next-intl: Next.js App Router์ฉ ํต์ฌ ๊ตญ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ฒ์ญ ๊ด๋ฆฌ๋ฅผ ์ํ ํ , ์๋ฒ ํจ์, ํด๋ผ์ด์ธํธ ํ๋ก๋ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์ฑ
์ง์ํ๋ ๋ก์ผ์ผ์ ์ ์ํ๊ณ next-intl์ ์์ฒญ ๊ตฌ์ฑ์ ์ค์ ํ๋ ๊ตฌ์ฑ ํ์ผ์ ๋ง๋์ธ์. ์ด ํ์ผ์ i18n ์ค์ ์ ๋จ์ผ ์ง์ค ์์ค๋ก ์๋ํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ํ์ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋ก์ผ์ผ ๊ตฌ์ฑ์ ์ค์ ์ง์คํํ๋ฉด ๋ถ์ผ์น๋ฅผ ๋ฐฉ์งํ๊ณ ํฅํ ๋ก์ผ์ผ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
getRequestConfigํจ์๋ ๋ชจ๋ ์์ฒญ ์ ์คํ๋๋ฉฐ ๊ฐ ํ์ด์ง์ ํ์ํ ๋ฒ์ญ๋ง ๋ก๋ํ์ฌ ์ฝ๋ ๋ถํ ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.src/i18n.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋์ ๋ก์ผ์ผ ๋ผ์ฐํธ ์ ์
์ฑ ํด๋์
[locale]๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ๋ก์ผ์ผ ๊ธฐ๋ฐ ๋์ ๋ผ์ฐํ ์ ์ค์ ํ์ธ์. ์ด๋ฅผ ํตํด Next.js๋ ๊ฐ ๋ก์ผ์ผ์ด URL ์ธ๊ทธ๋จผํธ๊ฐ ๋๋ ๋ก์ผ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค (์:/en/about,/fr/about).๋์ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํ๋ฉด Next.js๊ฐ ๋น๋ ์ ๋ชจ๋ ๋ก์ผ์ผ์ ๋ํด ์ ์ ํ์ด์ง๋ฅผ ์์ฑํ ์ ์์ด ์ฑ๋ฅ๊ณผ SEO๊ฐ ํฅ์๋ฉ๋๋ค. ๋ ์ด์์ ์ปดํฌ๋ํธ๋ ๋ก์ผ์ผ์ ๋ฐ๋ผ HTML์
lang๋ฐdir์์ฑ์ ์ค์ ํ๋๋ฐ, ์ด๋ ์ ๊ทผ์ฑ๊ณผ ๊ฒ์ ์์ง ์ดํด์ ๋งค์ฐ ์ค์ํฉ๋๋ค.src/app/[locale]/layout.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
src/app/[locale]/about/page.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ฒ์ญ ํ์ผ ์์ฑํ๊ธฐ
๊ฐ ๋ก์ผ์ผ๊ณผ ๋ค์์คํ์ด์ค๋ณ๋ก JSON ํ์ผ์ ์์ฑํ์ธ์. ์ด ๊ตฌ์กฐ๋ ๋ฒ์ญ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ ๊ฐ ํ์ด์ง์ ํ์ํ ๋ฒ์ญ๋ง ๋ก๋ํ ์ ์๊ฒ ํด์ค๋๋ค.
๋ค์์คํ์ด์ค๋ณ๋ก ๋ฒ์ญ์ ๊ตฌ์ฑํ๋ ๊ฒ(e.g.,
common.json,about.json)์ ์ฝ๋ ๋ถํ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ค๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ํ์ด์ง์ ํ์ํ ๋ฒ์ญ๋ง ๋ก๋ํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.locales/en/common.json์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
locales/fr/common.json์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
locales/en/about.json์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
locales/fr/about.json์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํ์ด์ง์์ ๋ฒ์ญ ํ์ฉํ๊ธฐ
์๋ฒ์์ ๋ฒ์ญ์ ๋ก๋ํ๊ณ ์ด๋ฅผ ์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ชจ๋์ ์ ๋ฌํ๋ ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๋ง๋์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋๋ง ์ ์ ๋ฒ์ญ์ด ๋ก๋๋์ด ์ฝํ ์ธ ๊น๋ฐ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์๋ฒ ์ธก์์ ๋ฒ์ญ์ ๋ก๋ํ๋ฉด SEO๊ฐ ํฅ์๋๊ณ FOUC(๋ฒ์ญ๋์ง ์์ ์ฝํ ์ธ ๊น๋ฐ์)๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
pick์ ์ฌ์ฉํ์ฌ ํ์ํ ๋ค์์คํ์ด์ค๋ง ํด๋ผ์ด์ธํธ ํ๋ก๋ฐ์ด๋์ ์ ๋ฌํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ์ ์ ์ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ต์ํํฉ๋๋ค.src/app/[locale]/about/page.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ๋ฒ์ญ ์ฌ์ฉํ๊ธฐ
ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋
useTranslations๋ฐuseFormatterํ ์ ์ฌ์ฉํ์ฌ ๋ฒ์ญ ๋ฐ ํฌ๋งทํ ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด ํ ๋ค์NextIntlClientProvider์ปจํ ์คํธ์์ ๊ฐ์ ์ฝ์ด์ต๋๋ค.ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ๋ฒ์ญ์ ์ ๊ทผํ๊ธฐ ์ํด React ํ ์ด ํ์ํฉ๋๋ค.
useTranslations์useFormatterํ ์ next-intl๊ณผ ์ํํ๊ฒ ํตํฉ๋๋ฉฐ, ๋ก์ผ์ผ์ด ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.ํ์ด์ง์ ํด๋ผ์ด์ธํธ ๋ฉ์์ง์ ํ์ํ ๋ค์์คํ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ธ์ (ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์ค์ ๋ก ํ์๋ก ํ๋ ๋ค์์คํ์ด์ค๋ง ํฌํจํ์ธ์).
src/components/ClientComponent.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์๋ฒ ์ปดํฌ๋ํธ์์ ๋ฒ์ญ ์ฌ์ฉํ๊ธฐ
์๋ฒ ์ปดํฌ๋ํธ๋ React ํ ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ props๋ฅผ ํตํด ๋ฒ์ญ๊ณผ ํฌ๋งคํฐ๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ ์งํ๋ฉฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ค์ฒฉ๋ ์ ์๊ฒ ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ๊ฒฝ๊ณ ๋ด์ ์ค์ฒฉ๋ ์ ์๋ ์๋ฒ ์ปดํฌ๋ํธ๋ ๋๊ธฐ์ ์ด์ด์ผ ํฉ๋๋ค. ๋ฒ์ญ๋ ๋ฌธ์์ด๊ณผ ํฌ๋งท๋ ๊ฐ์ props๋ก ์ ๋ฌํจ์ผ๋ก์จ ๋น๋๊ธฐ ์์ ์ ํผํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ ๋๋ง์ ๋ณด์ฅํฉ๋๋ค. ๋ถ๋ชจ ํ์ด์ง ์ปดํฌ๋ํธ์์ ๋ฒ์ญ๊ณผ ํฌ๋งท์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ธ์.
src/components/ServerComponent.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํ์ด์ง๋ ๋ ์ด์์์์
next-intl/server์getTranslations์getFormatter๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๊ณผ ํฌ๋งทํ ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ ํ, ์ด๋ฅผ props๋ก ์๋ฒ ์ปดํฌ๋ํธ์ ์ ๋ฌํ์ธ์.์ฝํ ์ธ ์ ์ธ์ด ๋ณ๊ฒฝํ๊ธฐ
์ ํ์ฌํญnext-intl์ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ์ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด, ๋์ผํ ๊ฒฝ๋ก๋ช ์ ๊ฐ๋ฆฌํค๋ฉด์ ๋ก์ผ์ผ์ ์ ํํ๋ ๋ก์ผ์ผ ์ธ์ ๋งํฌ๋ฅผ ๋ ๋๋งํ์ธ์. ํ๋ก๋ฐ์ด๋๊ฐ URL์ ์๋์ผ๋ก ์ฌ์์ฑํ๋ฏ๋ก ํ์ฌ ๊ฒฝ๋ก๋ง ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
src/components/LocaleSwitcher.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํ์งํ๋ Link ์ปดํฌ๋ํธ ์ฌ์ฉํ๊ธฐ
์ ํ์ฌํญnext-intl์ ํ์ฑ ๋ก์ผ์ผ์ ์๋์ผ๋ก ์ ์ฉํ๋ ํ์งํ๋ ๋งํฌ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ ์๋ธํจํค์งnext-intl/navigation์ ์ ๊ณตํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ@/i18nํ์ผ์์ ์ด๋ฅผ ์ถ์ถํด ๋์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค:src/components/MyComponent.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์๋ฒ ์ก์ ๋ด์์ ํ์ฑ ๋ก์ผ์ผ ์ ๊ทผํ๊ธฐ
์ ํ์ฌํญ์๋ฒ ์ก์ ์
next-intl/server๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ก์ผ์ผ์ ์ฝ์ ์ ์์ต๋๋ค. ์ด๋ ํ์งํ๋ ์ด๋ฉ์ผ์ ๋ณด๋ด๊ฑฐ๋ ์ ์ถ๋ ๋ฐ์ดํฐ์ ํจ๊ป ์ธ์ด ์ ํธ๋๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.src/app/actions/get-current-locale.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
getLocale๋next-intlํ๋ก์๊ฐ ์ค์ ํ locale์ ์ฝ๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ด๋์๋ ์๋ํฉ๋๋ค: Route Handlers, Server Actions, ๊ทธ๋ฆฌ๊ณ edge functions.๋ฉํ๋ฐ์ดํฐ ๊ตญ์ ํํ๊ธฐ
์ ํ์ฌํญ์ฝํ ์ธ ๋ฒ์ญ๋ ์ค์ํ์ง๋ง, ๊ตญ์ ํ์ ์ฃผ์ ๋ชฉํ๋ ์น์ฌ์ดํธ๋ฅผ ์ ์ธ๊ณ์ ๋ ์ ๋ณด์ด๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. I18n์ ์ ์ ํ SEO๋ฅผ ํตํด ์น์ฌ์ดํธ ๊ฐ์์ฑ์ ํฅ์์ํค๋ ๋๋ผ์ด ์๋จ์ ๋๋ค.
์ ์ ํ๊ฒ ๊ตญ์ ํ๋ ๋ฉํ๋ฐ์ดํฐ๋ ๊ฒ์ ์์ง์ด ํ์ด์ง์์ ์ด๋ค ์ธ์ด๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์ดํดํ๋ ๋ฐ ๋์์ ์ค๋๋ค. ์ฌ๊ธฐ์๋ hreflang ๋ฉํ ํ๊ทธ ์ค์ , ์ ๋ชฉ๊ณผ ์ค๋ช ๋ฒ์ญ, ๊ฐ ๋ก์ผ์ผ์ ๋ํด ์ ๊ทํ๋ URL์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํ๋ ์์ ์ด ํฌํจ๋ฉ๋๋ค.
src/app/[locale]/about/layout.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ฌ์ดํธ๋งต ๊ตญ์ ํํ๊ธฐ
์ ํ์ฌํญ๋ชจ๋ ๋ก์ผ์ผ ๋ฒ์ ์ ํ์ด์ง๋ฅผ ํฌํจํ๋ ์ฌ์ดํธ๋งต์ ์์ฑํ์ธ์. ์ด๋ ๊ฒ์ ์์ง์ด ๋ชจ๋ ์ธ์ด ๋ฒ์ ์ ์ฝํ ์ธ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์์ธํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ ์ ํ๊ฒ ๊ตญ์ ํ๋ ์ฌ์ดํธ๋งต์ ๊ฒ์ ์์ง์ด ๋ชจ๋ ์ธ์ด ๋ฒ์ ์ ํ์ด์ง๋ฅผ ์ฐพ๊ณ ์์ธํํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ตญ์ ๊ฒ์ ๊ฒฐ๊ณผ์์ ๊ฐ์์ฑ์ ํฅ์์ํต๋๋ค.
src/app/sitemap.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
robots.txt ๊ตญ์ ํํ๊ธฐ
์ ํ์ฌํญ๋ณดํธ๋ ๊ฒฝ๋ก์ ๋ชจ๋ ๋ก์ผ์ผ ๋ฒ์ ์ ์ ์ ํ ์ฒ๋ฆฌํ๋ robots.txt ํ์ผ์ ๋ง๋์ธ์. ์ด๋ฅผ ํตํด ๊ฒ์ ์์ง์ด ์ด๋ค ์ธ์ด๋ก๋ ๊ด๋ฆฌ์(admin)๋ ๋์๋ณด๋ ํ์ด์ง๋ฅผ ์ธ๋ฑ์ฑํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
๋ชจ๋ ๋ก์ผ์ผ์ ๋ํด robots.txt๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํ๋ฉด, ๊ฐ ๋ก์ผ์ผ๋ณ๋ก ๊ฒฝ๋ก๊ฐ ๋ค๋ฅผ ๋ ๋ฏผ๊ฐํ ํ์ด์ง๊ฐ ๊ฒ์ ์์ง์ ์ธ๋ฑ์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
src/app/robots.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ก์ผ์ผ ๋ผ์ฐํ ์ ์ํ ํ๋ก์ ์ค์
์ ํ์ฌํญ์ฌ์ฉ์์ ์ ํธ ๋ก์ผ์ผ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์ ์ ํ ๋ก์ผ์ผ ์ ๋์ฌ๊ฐ ๋ถ์ URL๋ก ๋ฆฌ๋๋ ์ ํ๋ ํ๋ก์๋ฅผ ๋ง๋์ธ์. next-intl์ ์ด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ํธ๋ฆฌํ ํ๋ก์ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์๋ ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋ ์๋์ผ๋ก ์ ํธํ๋ ์ธ์ด๋ก ๋ฆฌ๋๋ ์ ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ํ ์ฌ์ฉ์์ ์ ํธ๋๋ฅผ ์ ์ฅํ์ฌ ํฅํ ๋ฐฉ๋ฌธ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
src/proxy.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ก์ผ์ผ์ ๋ํ TypeScript ํ์ ์ค์
์ ํ์ฌํญTypeScript ์ค์ ์ ํค์ ๋ํ ์๋์์ฑ๊ณผ ํ์ ์์ ์ฑ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์ global.ts ํ์ผ์ ์์ฑํ๊ณ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
global.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ด ์ฝ๋๋ ๋ชจ๋ ํ์ฅ(Module Augmentation)์ ์ฌ์ฉํ์ฌ locales์ messages๋ฅผ next-intl์ AppConfig ํ์ ์ ์ถ๊ฐํฉ๋๋ค.
Intlayer๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ ์๋ํํ๊ธฐ
์ ํ์ฌํญIntlayer๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์งํ ๊ณผ์ ์ ์ง์ํ๊ธฐ ์ํด ์ค๊ณ๋ ๋ฌด๋ฃ์ด์ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. next-intl์ด ๋ฒ์ญ ๋ก๋ฉ๊ณผ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๋ฐ๋ฉด, Intlayer๋ ๋ฒ์ญ ์ํฌํ๋ก์ฐ๋ฅผ ์๋ํํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
๋ฒ์ญ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ์๊ฐ ์๋ชจ๊ฐ ํฌ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. Intlayer๋ ๋ฒ์ญ ํ ์คํธ, ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์๋ํํ์ฌ ์๊ฐ์ ์ ์ฝํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
Intlayer๋ ๋ค์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
์ฝ๋๋ฒ ์ด์ค ๋ด ์ํ๋ ์์น์ ์ฝํ ์ธ ์ ์ธํ๊ธฐ
Intlayer๋.content.{ts|js|json}ํ์ผ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฒ ์ด์ค ๋ด ์ํ๋ ์์น์ ์ฝํ ์ธ ๋ฅผ ์ ์ธํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝํ ์ธ ๋ฅผ ๋ ์ ์กฐ์งํ ์ ์์ผ๋ฉฐ, ์ฝ๋๋ฒ ์ด์ค์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.๋๋ฝ๋ ๋ฒ์ญ ํ ์คํธํ๊ธฐ
Intlayer๋ CI/CD ํ์ดํ๋ผ์ธ์ด๋ ๋จ์ ํ ์คํธ์ ํตํฉํ ์ ์๋ ํ ์คํธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ฒ์ญ ํ ์คํธ์ ๋ํด ์์ธํ ์์๋ณด์ธ์.๋ฒ์ญ ์๋ํ Intlayer๋ ๋ฒ์ญ์ ์๋ํํ ์ ์๋ CLI์ VSCode ํ์ฅ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ ์ ์์ต๋๋ค. ๋ฒ์ญ ์๋ํ์ ๋ํด ์์ธํ ์์๋ณด์ธ์. ์ฌ์ฉ์๋ ์์ ์ API ํค์ ์ํ๋ AI ์ ๊ณต์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ์ํฉ์ ๋ง๋ ๋ฒ์ญ์ ์ ๊ณตํ๋ฏ๋ก, ๋ด์ฉ ์ฑ์ฐ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ธ๋ถ ์ฝํ ์ธ ์ฐ๊ฒฐ Intlayer๋ ์ธ๋ถ ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS)์ ์ฝํ ์ธ ๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ์ต์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์ JSON ๋ฆฌ์์ค์ ์ฝ์ ํ ์ ์์ต๋๋ค. ์ธ๋ถ ์ฝํ ์ธ ๊ฐ์ ธ์ค๊ธฐ์์ ์์ธํ ์์๋ณด์ธ์.
๋น์ฃผ์ผ ์๋ํฐ
Intlayer๋ ๋น์ฃผ์ผ ์๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ๋ฅผ ํธ์งํ ์ ์๋ ๋ฌด๋ฃ ๋น์ฃผ์ผ ์๋ํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฒ์ญ ๋น์ฃผ์ผ ํธ์ง์์ ์์ธํ ์์๋ณด์ธ์.
๊ทธ๋ฆฌ๊ณ ๋ ๋ง์ ๊ธฐ๋ฅ๋ค์ด ์์ต๋๋ค. Intlayer๊ฐ ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ์ธํ๋ ค๋ฉด Intlayer์ ๊ด์ฌ์ฌ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๋๊ธ
์์ง ๋๊ธ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ก ์๊ฒฌ์ ๋๋ ๋ณด์ธ์.
