Next Portfolio(https://next-umsungjun.vercel.app/ko/home)
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λ₯Ό κ°ννμ΅λλ€.
Next.js(15.1.4), TypeScript, Tailwind CSS, Zustand, next-intl, Prisma, Supabase
ββ app
β ββ [locale]
β β ββ home
β β β ββ @chat
β β β β ββ _components
β β β β β ββ answer.tsx
β β β β β ββ question.tsx
β β β β β ββ selectQuestion.tsx
β β β β ββ _lib
β β β β β ββ constants.ts
β β β β ββ body.tsx
β β β β ββ header.tsx
β β β β ββ page.tsx
β β β ββ @side
β β β β ββ _components
β β β β β ββ contactInfo.tsx
β β β β β ββ profileSwiper.tsx
β β β β ββ page.tsx
β β β ββ layout.tsx
β β ββ layout.tsx
β ββ api
β β ββ answer
β β β ββ route.ts
β β ββ question
β β ββ route.ts
β ββ globals.css
ββ components
β ββ swrProvider.tsx
ββ i18n
β ββ loadSpreadSheet.js
β ββ request.ts
β ββ routing.ts
ββ lib
β ββ client
β β ββ constants.ts
β β ββ type.ts
β ββ server
β ββ prisma.ts
ββ messages
β ββ en.json
β ββ ko.json
ββ middleware.ts
ββ package.json
ββ postcss.config.mjs
ββ prisma
β ββ migrations
β β ββ migration_lock.toml
β ββ schema.prisma
ββ public
β ββ favicon.ico
β ββ robots.txt
ββ store
β ββ useChatStore.ts
ββ tailwind.config.ts
ββ tsconfig.json
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 λ±μ μ€μ