Skip to content

umsungjun/new-portfolio-next

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

152 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

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-react) ๋ฅผ Next.js๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์•ฝ 3๋…„๊ฐ„์˜ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ํ†ตํ•ด ์Šต๋“ํ•œ ๊ธฐ์ˆ ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ๋ Œ๋”๋ง ์ตœ์ ํ™”์— ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ ์ ‘ํ•  ์ˆ˜ ์—†์—ˆ๋˜ Next.js๋ฅผ ํ•™์Šตํ•˜๊ณ  ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors