Skip to content

πŸ˜— Next PortfolioλŠ” 기쑴에 React둜 개발된 New Portfolio(https://github.com/umsungjun/new_portfolio) λ₯Ό Next.js둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€. 2λ…„κ°„μ˜ 싀무 κ²½ν—˜μ„ 톡해 μŠ΅λ“ν•œ κΈ°μˆ λ“€μ„ λ°”νƒ•μœΌλ‘œ μ œμž‘λ˜μ—ˆμœΌλ©°, 데이터 관리와 λ Œλ”λ§ μ΅œμ ν™”μ— 쀑점을 λ‘μ—ˆμŠ΅λ‹ˆλ‹€. μ‹€λ¬΄μ—μ„œ μ ‘ν•  수 μ—†μ—ˆλ˜ Next.jsλ₯Ό ν•™μŠ΅ν•˜κ³  ν™œμš©ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€.

Notifications You must be signed in to change notification settings

umsungjun/new_portfolio_next

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ν”„λ‘œμ νŠΈ μ†Œκ°œ

Next PortfolioλŠ” 기쑴에 React둜 개발된 New Portfolio(https://github.com/umsungjun/new_portfolio)λ₯Ό Next.js둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

2λ…„κ°„μ˜ 싀무 κ²½ν—˜μ„ 톡해 μŠ΅λ“ν•œ κΈ°μˆ λ“€μ„ λ°”νƒ•μœΌλ‘œ μ œμž‘λ˜μ—ˆμœΌλ©°, 데이터 관리와 λ Œλ”λ§ μ΅œμ ν™”μ— 쀑점을 λ‘μ—ˆμŠ΅λ‹ˆλ‹€. μ‹€λ¬΄μ—μ„œ μ ‘ν•  수 μ—†μ—ˆλ˜ Next.jsλ₯Ό ν•™μŠ΅ν•˜κ³  ν™œμš©ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€.

κΈ°μ‘΄ React ν”„λ‘œμ νŠΈμ™€μ˜ 차이점 및 κ°œμ„ μ 

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Β : μ½”λ“œ(파일) μ‚­μ œ

νŠΈλŸ¬λΈ” μŠˆνŒ… 기둝

1. Hydration failed 였λ₯˜ ν•΄κ²°

문제점: .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)

2. next-intl의 getTranslations μž‘λ™ 였λ₯˜ ν•΄κ²°

문제점: μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ getTranslations() μž‘λ™ 였λ₯˜

ν•΄κ²° 방법
- getTranslations()에 locale 값을 λͺ…μ‹œμ μœΌλ‘œ 전달

export default async function Side({ params }: SideProps) {
  const { locale } = await params;
  const t = await getTranslations({ locale });
}

3. Next.js 15.2.3μ—μ„œ generateMetadata ν•¨μˆ˜ μž‘λ™ 였λ₯˜ ν•΄κ²°

문제점: Next.js 15.2.3μ—μ„œ generateMetadata ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” 문제 λ°œμƒ

ν•΄κ²° 방법
- Next.js 버전을 15.1.4둜 λ‹€μš΄κ·Έλ ˆμ΄λ“œν•˜μ—¬ 정상 λ™μž‘ 확인
- Next.js의 Metadata APIλ₯Ό ν™œμš©ν•˜μ—¬ SEO 메타데이터λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•˜λ„λ‘ μˆ˜μ •
- λ‹€κ΅­μ–΄ 지원을 μœ„ν•΄ locale에 따라 title, description, keywords 등을 μ„€μ •

About

πŸ˜— Next PortfolioλŠ” 기쑴에 React둜 개발된 New Portfolio(https://github.com/umsungjun/new_portfolio) λ₯Ό Next.js둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€. 2λ…„κ°„μ˜ 싀무 κ²½ν—˜μ„ 톡해 μŠ΅λ“ν•œ κΈ°μˆ λ“€μ„ λ°”νƒ•μœΌλ‘œ μ œμž‘λ˜μ—ˆμœΌλ©°, 데이터 관리와 λ Œλ”λ§ μ΅œμ ν™”μ— 쀑점을 λ‘μ—ˆμŠ΅λ‹ˆλ‹€. μ‹€λ¬΄μ—μ„œ μ ‘ν•  수 μ—†μ—ˆλ˜ Next.jsλ₯Ό ν•™μŠ΅ν•˜κ³  ν™œμš©ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •