Skip to content

llmojoll/WHYNE_FE

ย 
ย 

Repository files navigation

๐Ÿท๋‚˜๋งŒ์˜ ์™€์ธ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•, WINE

og-image

๋‹น์‹ ์˜ ์ทจํ–ฅ์— ๋”ฑ ๋งž๋Š” ์™€์ธ์„ ์ฐพ๊ณ , ๋‹ค์–‘ํ•œ ์‚ฌ๋žŒ๋“ค๊ณผ ์™€์ธ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ ๋ณด์„ธ์š”!
์™€์ธํŒŒ์ธ๋”๋Š” ์™€์ธ์— ๋Œ€ํ•œ ์ •๋ณด์™€ ๋ฆฌ๋ทฐ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ฐธ์—ฌํ˜• ์™€์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์„œ๋น„์Šค ๋ฐ”๋กœ๊ฐ€๊ธฐ


ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

WINE์€ ์™€์ธ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ ,
์ง์ ‘ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์™€์ธ ์ •๋ณด ๊ธฐ๋ฐ˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์ž์‹ ๋งŒ์˜ ๋ฆฌ๋ทฐ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์™€์ธ์„ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ์–ด์š”!

ํ”Œ๋ ˆ์ด๋ฒ„ ์Šฌ๋ผ์ด๋”, ํ–ฅ๋ฏธ ํƒœ๊ทธ, ๊ทธ๋ฆฌ๊ณ  AI ์ฑ—๋ด‡ ์ถ”์ฒœ ๊ธฐ๋Šฅ๊นŒ์ง€ ๋”ํ•ด
๋‹น์‹ ์˜ ์ทจํ–ฅ์— ๋”ฑ ๋งž๋Š” ์™€์ธ์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.


ํŒ€์› ์†Œ๊ฐœ

image

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ” ์™€์ธ ํƒ์ƒ‰ & ๊ฒ€์ƒ‰ (AI ์ฑ—๋ด‡ ์ถ”์ฒœ ํฌํ•จ)

๐Ÿ“ ์™€์ธ ์ •๋ณด ๋ฐ ๋ฆฌ๋ทฐ ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ (CRUD)

๐Ÿ’ฌ ์™€์ธ๋ณ„ ๋ฆฌ๋ทฐ ๋“ฑ๋ก ๊ธฐ๋Šฅ (ํ…์ŠคํŠธ + ํ–ฅ๋ฏธ ์ •๋ณด)

๐Ÿ” ํ•„ํ„ฐยท๊ฒ€์ƒ‰ยท๋ฌดํ•œ์Šคํฌ๋กค ๋“ฑ ํŽธ๋ฆฌํ•œ ํƒ์ƒ‰ ๊ธฐ๋Šฅ ์ œ๊ณต

๐Ÿ™‹ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ๋ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ์ œ๊ณต


1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

ํ•ญ๋ชฉ ์‚ฌ์šฉ ๊ธฐ์ˆ 
๊ฐœ๋ฐœ ์–ธ์–ด Typescript, HTML, CSS
์ฝ”๋“œ ์—๋””ํ„ฐ Visual Studio Code (VSC)
ํ”„๋ ˆ์ž„์›Œํฌ Next.js 13
ํฌ๋งคํ„ฐ ESLint, Prettier
๋ฒˆ๋“ค๋ง Webpack
ํ˜•์ƒ ๊ด€๋ฆฌ Git
์Šคํƒ€์ผ๋ง Tailwind 3.4 + shadcn/ui
๋ฐฐํฌ Vercel
๋ผ์šฐํŒ… React Router
๋ฐ์ดํ„ฐ ํŒจ์นญ axios
์ƒํƒœ๊ด€๋ฆฌ Zustand, TanStack Query


2. ์ฑ„ํƒํ•œ ๊ฐœ๋ฐœ ๊ธฐ์ˆ ๊ณผ ๋ธŒ๋žœ์น˜ ์ „๋žต

Next.js 13, Tailwind

  • Next.js 13

    • ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ์™€ URL ๊ฒฝ๋กœ๊ฐ€ 1:1๋กœ ๋งคํ•‘๋˜๋Š” ์ง๊ด€์ ์ธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    • getServerSideProps, getStaticProps ๋“ฑ์„ ํ†ตํ•ด ํŽ˜์ด์ง€ ๋ณ„๋กœ SSR๊ณผ SSG๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    • pages/api ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ†ตํ•œ API ๋ผ์šฐํŠธ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด
      ์ธ์ฆ๊ณผ์ •์—์„œ ๋Œ์•„์˜ค๋Š” ์‘๋‹ต์— setCookie๋ฅผ ๋‹ฌ์•„์ฃผ๋Š” BFF๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Tailwind + shadcn/ui

    • ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ์Šคํƒ€์ผ๋ง๊ณผ shadcn/ui์˜ ์ผ๊ด€๋œ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•ด, ๋น ๋ฅธ MVP ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ ‘๊ทผ์„ฑ๊ณผ ๋””์ž์ธ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ๋„ cnํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์œ ์—ฐํ•œ UI ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.
    • Next.js์™€์˜ ๊ถํ•ฉ์ด ์ข‹์•„ SSR ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ,
      ์‹ค์ œ ์‚ฌ์šฉ๋œ ํด๋ž˜์Šค๋งŒ ๋นŒ๋“œ ์‹œ์ ์— css๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ž‘์€ ๋ฒˆ๋“ค๋กœ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

Zustand + React Query

  • Zustand๋ฅผ ํ†ตํ•ด ์ „์—ญ ์‚ฌ์šฉ์ž ์ƒํƒœ, ํ•„ํ„ฐ ์ •๋ณด ๋“ฑ ํŽ˜์ด์ง€ ๊ฐ„ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํƒœ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • React Query๋ฅผ ํ†ตํ•ด ์บ์‹ฑ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ API ํ†ต์‹  ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

React Hook Form + zod

  • React Hook Form์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ์„ฑ๋Šฅ ์ข‹์€ ํผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ ,
    Zod์™€์˜ ์—ฐ๋™์„ ํ†ตํ•ด ์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ธํ’‹ ์ปดํฌ๋„ŒํŠธ์— ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ”๋กœ ํ‘œ์‹œํ•˜๊ณ , ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ์ง๊ด€์ ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค

eslint, prettier

  • ์ •ํ•ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž๋™์ ์œผ๋กœ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ •๋ฆฌํ•ด ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ๋Š” eslint์—, ์ฝ”๋“œ ํฌ๋งทํŒ…์€ prettier์— ์ผ์ž„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์™ธ ๊ทœ์น™์€ ํŒ€์›๋“ค๊ณผ ํ˜‘์˜ ํ›„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋žœ์น˜ ์ „๋žต

์ด๋ฆ„ ์—ญํ• 
main ๋ฐฐํฌ(ํ”„๋กœ๋•์…˜)์šฉ ์ฝ”๋“œ. ํ•ญ์ƒ ์•ˆ์ •๋œ ์ƒํƒœ ์œ ์ง€
dev ๊ฐœ๋ฐœ์šฉ ํ†ตํ•ฉ ๋ธŒ๋žœ์น˜. ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด ํ•ฉ์ณ์ง€๋Š” ๊ณณ
feature/xxx ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ, ์ž‘์—… ๋‹จ์œ„๋ณ„ ๋ธŒ๋žœ์น˜
fix/xxx ๋ฒ„๊ทธ ์ˆ˜์ • ๋ธŒ๋žœ์น˜
refactor/xxx ์ฝ”๋“œ ๊ฐœ์„  ๋ธŒ๋žœ์น˜


3. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

๐Ÿ“ฆsrc/
โ”œโ”€โ”€ assets/
โ”œโ”€โ”€ pages/
โ”‚   โ”œโ”€โ”€ _app.tsx        // ์ „์—ญ ์„ค์ • (Providers, ์Šคํƒ€์ผ)
โ”‚   โ”œโ”€โ”€ _document.tsx   // HTML ๋ฌธ์„œ ๊ตฌ์กฐ
โ”‚   โ”œโ”€โ”€ index.tsx       // ํ™ˆํŽ˜์ด์ง€
|   โ”œโ”€โ”€ wines/          // ์™€์ธ ๋ชฉ๋ก ๋ฐ ์ƒ์„ธ ํŽ˜์ด์ง€
|   โ”œโ”€โ”€ my-profile/     // ๋งˆ์ดํŽ˜์ด์ง€
|   โ”œโ”€โ”€ signin/         // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
|   โ”œโ”€โ”€ signup/         // ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
|   โ”œโ”€โ”€ oatuh/          // ์†Œ์…œ ๋กœ๊ทธ์ธ
โ”‚   โ””โ”€โ”€ api/            // API Routes
โ”œโ”€โ”€ components/
โ”‚   โ”œโ”€โ”€ ui/             // shadcn/ui ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ common/         // ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
โ”‚   โ””โ”€โ”€  ...
โ”œโ”€โ”€ lib/
โ”‚   โ”œโ”€โ”€ utils.ts        // ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
โ”‚   โ”œโ”€โ”€ api.ts          // API ํด๋ผ์ด์–ธํŠธ (axios)
โ”‚   โ””โ”€โ”€ auth.ts         // ์ธ์ฆ ๊ด€๋ จ
โ”œโ”€โ”€ stores/             // Zustand ์Šคํ† ์–ด
โ”œโ”€โ”€ hooks/              // ์ปค์Šคํ…€ ํ›… (TanStack Query)
โ”œโ”€โ”€ styles/
โ”‚   โ””โ”€โ”€ globals.css     // Tailwind CSS
โ””โ”€โ”€ types/              // TypeScript ํƒ€์ž… ์ •์˜


4. ํŽ˜์ด์ง€๋ณ„ ๊ธฐ๋Šฅ

[์ดˆ๊ธฐํ™”๋ฉด]

  • ์ดˆ๊ธฐ ์ง„์ž… ์‹œ ์Šคํ”Œ๋ž˜์‰ฌ ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์–ด gnb๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ชจ์Šต์„ ๊ฐ€๋ ธ์Šต๋‹ˆ๋‹ค.
  • framer motion์„ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€๋“œ๋Ÿฌ์šด ์ฒซ ์ธ์ƒ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

KakaoTalk_Recording_20250805_143950-ezgif com-video-to-gif-converter

[๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…]

  • ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…์ด ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
  • ๋ฏธ๋ฆฌ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์ธํ’‹๊ณผ rhf๋ฅผ ์—ฐ๊ฒฐํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์œ ์ €์—๊ฒŒ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ค๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ setCookieํ—ค๋”๊ฐ€ ๋‹ฌ๋ฆฐ ์‘๋‹ต์„ ๋ฐ›์•„ ์œ ์ €์˜ ์—‘์„ธ์Šคํ† ํฐ๊ณผ ๋ฆฌํ”„๋ ˆ์‰ฌ ํ† ํฐ์„ ์ฟ ํ‚ค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์นด์นด์˜ค ์†Œ์…œ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ezgif com-video-to-gif-converter (1)

[๋งˆ์ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€]

  • ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์™€ ๋‹‰๋„ค์ž„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
  • ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ์™€ ์™€์ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ์™€ ์™€์ธ๋“ค์„ ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

KakaoTalk_Recording_20250805_144908-ezgif com-video-to-gif-converter

[์™€์ธ ๋ชฉ๋ก ํŽ˜์ด์ง€]

  • ๋“ฑ๋ก๋œ ์™€์ธ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰ ๋ฐ”์™€ ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์กฐ๊ฑด์˜ ์™€์ธ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ๋‹จ์˜ ์ถ”์ฒœ์™€์ธ์„ ํ†ตํ•ด ํ‰์ ์ด ๋†’์€ ์™€์ธ์„ ์ถ”์ฒœ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™€์ธ ๋“ฑ๋กํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์™€์ธ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™€์ธ ์นด๋“œ๋ฅผ ํด๋ฆญํ•ด ์™€์ธ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

KakaoTalk_Recording_20250805_145151-ezgif com-video-to-gif-converter

[์™€์ธ ์ƒ์„ธ ํŽ˜์ด์ง€]

  • ์™€์ธ์˜ ๊ธฐ๋ณธ ์ •๋ณด์™€ ํ•ด๋‹น ์™€์ธ์— ๋‹ฌ๋ฆฐ ๋ฆฌ๋ทฐ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
  • ํ‰๊ท  ๋ณ„์ ์ด ํ‘œ์‹œ๋˜๊ณ , ๋ฆฌ๋ทฐํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๋ฆฌ๋ทฐ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด€์‹ฌ์žˆ๋Š” ๋ฆฌ๋ทฐ๋Š” ์—ด์–ด์„œ ์ƒ์„ธํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์ข‹์•„์š”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ๋Š” ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

KakaoTalk_Recording_20250805_135143-ezgif com-video-to-gif-converter (1)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 93.7%
  • JavaScript 4.7%
  • CSS 1.6%