An open API service indexing awesome lists of open source software.

https://github.com/umsungjun/new_portfolio_next

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

next portfolio react umsungjun

Last synced: 5 months ago
JSON representation

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

Awesome Lists containing this project

README

          

# 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λ₯Ό ν•™μŠ΅ν•˜κ³  ν™œμš©ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€.

## κΈ°μ‘΄ 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 등을 μ„€μ •
```