Next Portfolio(https://next-umsungjun.vercel.app/)
Next Portfolio๋ ๊ธฐ์กด์ React๋ก ๊ฐ๋ฐ๋ New Portfolio(https://github.com/umsungjun/new_portfolio)๋ฅผ Next.js๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ํ๋ก์ ํธ์ ๋๋ค.
2๋ ๊ฐ์ ์ค๋ฌด ๊ฒฝํ์ ํตํด ์ต๋ํ ๊ธฐ์ ๋ค์ ๋ฐํ์ผ๋ก ์ ์๋์์ผ๋ฉฐ, ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋ ๋๋ง ์ต์ ํ์ ์ค์ ์ ๋์์ต๋๋ค. ์ค๋ฌด์์ ์ ํ ์ ์์๋ Next.js๋ฅผ ํ์ตํ๊ณ ํ์ฉํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ๊ฐ๋ฐํ์ต๋๋ค.
1. ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐฉ์ ๊ฐ์
๊ธฐ์กด์๋ Google Cloud Sheet๋ฅผ ๋ฐ์ดํฐ ์ ์ฅ์์ฒ๋ผ ํ์ฉํ์์ผ๋, ์ค๋ฌด ๊ฒฝํ์ ์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ ๊ด๋ฆฌ ๋ฐฉ์์ด ๋ ํจ์จ์ ์ด๋ผ๋ ์ ์ ๊นจ๋ฌ์์ต๋๋ค.
์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด Supabase๋ฅผ ๋์
ํ์ฌ Question, Answer ํ
์ด๋ธ์ ์์ฑํ๊ณ Prisma ORM์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ์กฐ์์ ๋ณด๋ค ์ฝ๊ฒ ์ํํ ์ ์๋๋ก ํ์ต๋๋ค.
2. CSR๊ณผ SSR์ ์ ์ ํ ์กฐํฉ
SSR(Server-Side Rendering): ์น ํ๋ฉด์ ์ข์ธก ์๊ฐ ์์ญ์ SSR์ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ๋ ๋๋ง๋๋๋ก ๊ตฌํํ์์ต๋๋ค.
CSR(Client-Side Rendering): ์ฐ์ธก ์ง๋ฌธ-๋ต๋ณ UI(์ฑํ
์์ญ)์ CSR ๋ฐฉ์์ ์ ์ฉํ์ฌ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด ์ํํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
3. Next.js ํ์ฉ ๊ทน๋ํ
๊ธฐ์กด React ํ๋ก์ ํธ๋ CSR ์ค์ฌ์ด์์ง๋ง, Next.js์ ์๋ฒ ์ปดํฌ๋ํธ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ฑ๋ฅ๊ณผ SEO๋ฅผ ์ต์ ํํ์์ต๋๋ค.
Next.js์ Metadata API๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ธ์ด๋ณ title, description, keywords๋ฅผ ๋์ ์ผ๋ก ์ค์ ํ์ฌ SEO๋ฅผ ๊ฐํํ์ต๋๋ค.
4. ๋ชจ๋ฐ์ผ ๋ฐ์ํ ๋์
๋ฐ์คํฌํ์์๋ ์ข์ธก ์๊ฐ ์์ญ(@side)๊ณผ ์ฐ์ธก ์ฑํ
(@chat)์ 2๋จ์ผ๋ก ๋ฐฐ์นํ์ง๋ง, ๋ชจ๋ฐ์ผ(1055px ๋ฏธ๋ง)์์๋ ์๊ฐ ์์ญ์ด ์จ๊ฒจ์ ธ ๋ฐฉ๋ฌธ์๊ฐ ํ๋กํ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ฑํ
์๋จ์ ํ๋กํ ์ด๋ฏธ์งยท์๊ฐยท์ฐ๋ฝ์ฒยท์์
๋งํฌ์ "๋ํ ์์ํ๊ธฐ" CTA๋ฅผ ๋ด์ ๋ชจ๋ฐ์ผ ์ ์ฉ ํ์ด๋ก ์ธํธ๋ก๋ฅผ ์ถ๊ฐํ๊ณ , ๊ณ ์ ๋๋น์๋ ์ฑํ
์ปจํ
์ด๋๋ฅผ ํ๋ฉด์ ๋ง๊ฒ ๋ฐ์ํ์ผ๋ก ์กฐ์ ํ์ต๋๋ค.
Next.js(15.1.4), TypeScript, Tailwind CSS, Zustand, next-intl, Prisma, Supabase
Featย : ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ
Fixย : ๋ฒ๊ทธ๋ฅผ ๊ณ ์น๊ฒฝ์ฐ
Docsย : ๋ฌธ์๋ฅผ ์์ ํ ๊ฒฝ์ฐ
Styleย : ์ฝ๋ ํฌ๋งท ๋ณ๊ฒฝ, ์ธ๋ฏธ์ฝ๋ก ๋๋ฝ, ์ฝ๋ ์์ ์ด ์๋๊ฒฝ์ฐ
Refactorย : ์ฝ๋ ๋ฆฌํํ ๋ง
Test : ํ
์คํธ ์ฝ๋ ์ถ๊ฐ ๋ฐ ๋ฆฌํฉํ ๋ง
Choreย : ๋น๋ ์
๋ฌด ์์ , ํจํค์ง ๋งค๋์ ์์
Designย : CSS ๋ฑ UI ๋์์ธ ๋ณ๊ฒฝ
Renameย : ํ์ผ๋ช
(or ํด๋๋ช
) ์์
Removeย : ์ฝ๋(ํ์ผ) ์ญ์
๋ฌธ์ ์ : .env ํ์ผ์์ PUBLIC_PHONE_NUMBER๋ฅผ ์ฌ์ฉํ์ ๋ Hydration ์ค๋ฅ ๋ฐ์
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ๊ธฐ์กด `.env` ํ์ผ์ ์์๋ ์์ `PUBLIC_PHONE_NUMBER`๋ฅผ `NEXT_PUBLIC_PHONE_NUMBER`๋ก ๋ณ๊ฒฝํ์ฌ ํด๊ฒฐ
- `NEXT_PUBLIC_PHONE_NUMBER`๋ ํด๋ผ์ด์ธํธ์์ ์ ๊ทผ ๊ฐ๋ฅ, `PHONE_NUMBER`๋ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ ๊ทผ ๊ฐ๋ฅ
๐ ์ฐธ๊ณ ๋ฌธ์: [Next.js Hydration Error] (https://nextjs.org/docs/messages/react-hydration-error)
๋ฌธ์ ์ : ์๋ฒ ์ปดํฌ๋ํธ์์ getTranslations() ์๋ ์ค๋ฅ
ํด๊ฒฐ ๋ฐฉ๋ฒ
- getTranslations()์ locale ๊ฐ์ ๋ช
์์ ์ผ๋ก ์ ๋ฌ
export default async function Side({ params }: SideProps) {
const { locale } = await params;
const t = await getTranslations({ locale });
}
๋ฌธ์ ์ : Next.js 15.2.3์์ generateMetadata ํจ์๊ฐ ํธ์ถ๋์ง ์๋ ๋ฌธ์ ๋ฐ์
ํด๊ฒฐ ๋ฐฉ๋ฒ
- Next.js ๋ฒ์ ์ 15.1.4๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ์ฌ ์ ์ ๋์ ํ์ธ
- Next.js์ Metadata API๋ฅผ ํ์ฉํ์ฌ SEO ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋๋ก ์์
- ๋ค๊ตญ์ด ์ง์์ ์ํด locale์ ๋ฐ๋ผ title, description, keywords ๋ฑ์ ์ค์