Skip to content

theSnackOverflow/Omechu-web

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

2,110 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿฝ๏ธ ์˜ค๋ฉ”์ถ” (์˜ค๋Š˜ ๋ญ ๋จน์ง€?)

์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์ƒํƒœ์™€ ์ทจํ–ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒํ™ฉ ๋งž์ถค ๋ฉ”๋‰ด/๋ง›์ง‘์„ ์ถ”์ฒœํ•˜๋Š” ์›น ์„œ๋น„์Šค

๐Ÿฅ ๋ฐฐํฌ URL ยท ๋ฐ๋ชจ ๊ณ„์ •: user@example.com / User1234!


๐Ÿ“Œ ๊ฐœ์š”

์˜ค๋ฉ”์ถ”๋Š” ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ์ƒํƒœยท์ทจํ–ฅยท์ปจ๋””์…˜ ๊ฐ™์€ ๋งฅ๋ฝ์„ ๋ฐ˜์˜ํ•ด ๋งž์ถค ๋ฉ”๋‰ด์™€ ๊ทผ์ฒ˜ ๋ง›์ง‘์„ ๋น ๋ฅด๊ฒŒ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ฏผ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ์„ ํƒ์„ ๋” ์ฆ๊ฒ๊ฒŒ ๋งŒ๋“ค๊ธฐ.

๋ฌธ์ œ ์ธ์‹

  • ๋ฐ˜๋ณต๋˜๋Š” โ€œ์˜ค๋Š˜ ๋ญ ๋จน์ง€?โ€์—์„œ ์˜ค๋Š” ์˜์‚ฌ๊ฒฐ์ • ํ”ผ๋กœ
  • ๊ด‘๊ณ /๊ฒ€์ƒ‰ ์ค‘์‹ฌ ๋ฆฌ์ŠคํŠธ๋กœ ์ธํ•œ ์ •๋ณด ๊ณผ์ž‰๊ณผ ๊ฐœ์ธ ๋งฅ๋ฝ ๋ฏธ๋ฐ˜์˜
  • ์ƒˆ๋กœ๊ณ ์นจ/์ดํƒˆ ์‹œ ์ƒํƒœ ์œ ์‹ค, ๋А๋ฆฐ ์‘๋‹ต, ๋นˆ์•ฝํ•œ ํด๋ฐฑ ๋“ฑ UX ๋Š๊น€

์ ‘๊ทผ

  1. ์˜จ๋ณด๋”ฉ 5๋‹จ๊ณ„๋กœ ์ตœ์†Œ ์ž…๋ ฅ์œผ๋กœ ํ•ต์‹ฌ ์‹ ํ˜ธ ์ˆ˜์ง‘
  2. ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํƒ์ƒ‰: ํƒœ๊ทธยท๊ฐ€๊ฒฉยท์ •๋ ฌยท๊ฒ€์ƒ‰(๋””๋ฐ”์šด์Šค) + ๋ฌดํ•œ ์Šคํฌ๋กค
  3. ์ƒ์„ธ ํŽ˜์ด์ง€ ์‹ค์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค: ๋ฆฌ๋ทฐ ์ •๋ ฌ/ํ•„ํ„ฐ, ์‹ ๊ณ , ์ด๋ฏธ์ง€ ํด๋ฐฑ, ํ‰์  ์š”์•ฝ
  4. ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ƒํƒœ/์ทจํ–ฅ ์žฌ์„ค์ • โ†’ ์ถ”์ฒœ ํ’ˆ์งˆ ์ˆœํ™˜ ๊ฐœ์„ 

ํ˜„์žฌ ์ถ”์ฒœ์€ ๊ทœ์น™ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ+์ •๋ ฌ๋กœ ์•ˆ์ • ์šด์˜ ์ค‘์ด๋ฉฐ, ์ดํ›„ ๊ฐœ์ธํ™” ์ ์ˆ˜/๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ๋กœ ๊ณ ๋„ํ™” ์˜ˆ์ •.


๐Ÿงญ ๋น ๋ฅธ ๋งํฌ


๐Ÿงฉ ์•„ํ‚คํ…์ฒ˜

  • ์„œ๋ฒ„ ์ƒํƒœ: TanStack Query๋กœ ์บ์‹ฑ/๋ฌดํšจํ™”/๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ/๋ฌดํ•œ ์Šคํฌ๋กค ๊ด€๋ฆฌ
  • ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ: Zustand๋กœ ์˜จ๋ณด๋”ฉ ์ง„ํ–‰/๋ชจ๋‹ฌ/๋ทฐ ๋กœ์ปฌ ์ƒํƒœ ๊ด€๋ฆฌ
  • ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ๋ถ„๋ฆฌ: axiosInstance(์ธ์ฆ) ยท axiosPublicInstance(๊ณต๊ฐœ ์—…๋กœ๋“œ)
  • ์ด๋ฏธ์ง€ ์•ˆ์ •ํ™”: ํ•œ๊ธ€ ํŒŒ์ผ๋ช… NFC ์ •๊ทœํ™”, ํ™•์žฅ์ž ์†Œ๋ฌธ์ž, onError ํด๋ฐฑ/์žฌ์‹œ๋„
flowchart LR
  UI[Next.js App Router UI] -->|useQuery| RQ[React Query Cache]
  RQ -->|Axios| API[(REST API)]
  UI -->|Zustand| CS[Client State]
  subgraph Client
    UI
    RQ
    CS
  end
  subgraph Server
    API
  end
Loading

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

1) ์˜จ๋ณด๋”ฉ 5๋‹จ๊ณ„ + ์ง„ํ–‰๋„ ๋ฐ”

  • ๊ฐ€์น˜: ์ตœ์†Œ ์ž…๋ ฅ์œผ๋กœ ๋งž์ถค ์ดˆ๊ธฐ ์ถ”์ฒœ ์ƒ์„ฑ, ์žฌ๋ฐฉ๋ฌธ ๋ณต์›
  • ๊ธฐ์ˆ : Zustand ์ƒํƒœ/๊ฒ€์ฆ, ๋กœ์ปฌ ์Šค๋ƒ…์ƒท, ์„œ๋ฒ„ ๋™๊ธฐํ™”
  • ํ…Œ์ŠคํŠธ: ์ƒˆ๋กœ๊ณ ์นจ/๋’ค๋กœ๊ฐ€๊ธฐ ์•ˆ์ „, ๋ชจ๋ฐ”์ผ ํ‚ค๋ณด๋“œ UX

2) ๋ฉ”๋‰ด/๋ง›์ง‘ ์ถ”์ฒœ (๊ฒ€์ƒ‰ยทํ•„ํ„ฐยท์ •๋ ฌยท๋ฌดํ•œ ์Šคํฌ๋กค)

  • ๊ฐ€์น˜: ์กฐ๊ฑด ๋ณ€๊ฒฝ์—๋„ ๋Š๊ธฐ์ง€ ์•Š๋Š” ํƒ์ƒ‰ ๋ฆฌ๋“ฌ
  • ๊ธฐ์ˆ : useInfiniteQuery, ์ฟผ๋ฆฌํ‚ค/staleTimeยทgcTime ์„ค๊ณ„, ํ”„๋ฆฌํŒจ์นญ
  • ํ…Œ์ŠคํŠธ: ํ•„ํ„ฐ ์กฐํ•ฉ ์บ์‹œ ๋ฌดํšจํ™”, ์Šคํฌ๋กค ๊ฒฝ๊ณ„, ์‹คํŒจ ํด๋ฐฑ

3) ๋ง›์ง‘ ์ƒ์„ธ

  • ๊ฐ€์น˜: ์‚ฌ์ง„ยท๋ฆฌ๋ทฐยทํ‰์ ์„ ํ•œ ํ™”๋ฉด์—์„œ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จ
  • ๊ธฐ์ˆ : ์ด๋ฏธ์ง€ ํด๋ฐฑ/NFC ์ •๊ทœํ™”, ์ ‘๊ทผ์„ฑ alt, ๋”ฅ๋งํฌ ๊ฒฝ๋กœ
  • ํ…Œ์ŠคํŠธ: ๋นˆ ์ƒํƒœ/์ง€์—ฐ/์‹คํŒจ ํด๋ฐฑ, ๋ชจ๋‹ฌ ํฌ์ปค์Šค ํŠธ๋žฉ

4) ์ฐœ(Like) & ์ถ”์ฒœ ๋ชฉ๋ก

  • ๊ฐ€์น˜: ์ฆ‰์‹œ ๋ฐ˜์‘/๋กค๋ฐฑ์œผ๋กœ ์ผ๊ด€ UX
  • ๊ธฐ์ˆ : useMutation ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ + ์˜ค๋ฅ˜ ๋กค๋ฐฑ, ์ฟผ๋ฆฌ ๋™๊ธฐํ™”
  • ํ…Œ์ŠคํŠธ: ์—ฐ์† ํ† ๊ธ€/401 ๋งŒ๋ฃŒ/๋กค๋ฐฑ ์ฒดํฌ

5) ๋งˆ์ดํŽ˜์ด์ง€ (ํ”„๋กœํ•„/๊ธฐ๋ณธ ์ƒํƒœ/FoodieLog/ํ™œ๋™)

  • ๊ฐ€์น˜: ์ง€์† ๋ณด์ •์œผ๋กœ ๊ฐœ์ธํ™” ํ’ˆ์งˆ ํ–ฅ์ƒ
  • ๊ธฐ์ˆ : ๋ณดํ˜ธ ๋ผ์šฐํŒ…, ์„œ๋ฒ„/ํด๋ผ ์ƒํƒœ ๋ถ„๋ฆฌ ์ €์žฅ, ํŽ˜์ด์ง€๋„ค์ด์…˜

6) ์ธ์ฆ (3๋‹จ๊ณ„ ๊ฐ€์ž…ยท๋ณดํ˜ธ ๋ผ์šฐํŒ…)

  • ๊ฐ€์น˜: ๋ช…ํ™•ํ•œ ๊ฐ€์ž… ํ”Œ๋กœ์šฐ, ๋ณด์•ˆ ์œ ์ง€๋œ ๊ฐœ์ธํ™”
  • ๊ธฐ์ˆ : JWT, ์ธํ„ฐ์…‰ํ„ฐ ํ† ํฐ ๋ถ€์ฐฉ/์—๋Ÿฌ ๊ณตํ†ต ์ฒ˜๋ฆฌ, ๋ผ์šฐํŠธ ๊ฐ€๋“œ

7) ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ (๊ณต๊ฐœ/์ธ์ฆ ๋ถ„๋ฆฌยทํด๋ฐฑ)

  • ๊ฐ€์น˜: ์‹คํŒจ ํ™•๋ฅ โ†“, ์‚ฌ์šฉ์ž ํ˜ผ๋ž€ ์ตœ์†Œํ™”
  • ๊ธฐ์ˆ : /v1/uploads/public vs /v1/uploads, ํŒŒ์ผ๋ช… ์ •๊ทœํ™”/์†Œ๋ฌธ์žํ™”, ์ธ๋„ค์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

๐Ÿ›  ์„ค์น˜ ๋ฐ ์‹คํ–‰

# 1) ํด๋ก 
git clone <your-repo-url>
cd omechu

# 2) ํŒจํ‚ค์ง€ ์„ค์น˜
yarn install

# 3) ๊ฐœ๋ฐœ ์„œ๋ฒ„
yarn dev # http://localhost:3000

# 4) ๋นŒ๋“œ/๋ฏธ๋ฆฌ๋ณด๊ธฐ
yarn build
yarn start

๐Ÿ” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ (.env.local)

NEXT_PUBLIC_API_BASE_URL=https://api.example.com
NEXT_PUBLIC_KAKAO_MAP_API_KEY=...
NEXT_PUBLIC_GOOGLE_PLACE_API_KEY=...
GOOGLE_MAP_SERVER_API_KEY=...

์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด sharp ์„ค์น˜๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค: pnpm add sharp.


๐Ÿ“ ํด๋” ๊ตฌ์กฐ

.
โ”œโ”€โ”€ (auth)             # ์ธ์ฆ ์ „์šฉ ๋ผ์šฐํŠธ ๊ทธ๋ฃน(์‹ค์ œ URL ๋…ธ์ถœ ์—†์Œ)
โ”œโ”€โ”€ api/               # Next.js Route Handler: ์„œ๋ฒ„ API ํ”„๋ก์‹œ/์œ ํ‹ธ(์˜ˆ: ์ง€์˜ค์ฝ”๋“œ)
โ”œโ”€โ”€ auth/              # ์ธ์ฆ ๊ด€๋ จ ํŽ˜์ด์ง€ ๋ฌถ์Œ(์ฝœ๋ฐฑ, ์žฌ์„ค์ • ๋“ฑ)
โ”œโ”€โ”€ components/        # ๊ณต์šฉ UI ์ปดํฌ๋„ŒํŠธ(๋ชจ๋‹ฌ/์ž…๋ ฅ/์Šค์ผˆ๋ ˆํ†ค/ํ—ค๋” ๋“ฑ)
โ”œโ”€โ”€ constant/          # ๋”๋ฏธ ๋ฐ์ดํ„ฐยท์ƒ์ˆ˜ยท์˜ต์…˜
โ”œโ”€โ”€ fullmenu/          # ์ „์ฒด ๋ฉ”๋‰ด ํƒ์ƒ‰(ํ•„ํ„ฐ/๊ฒ€์ƒ‰/๋ฆฌ์ŠคํŠธ)
โ”œโ”€โ”€ lib/               # API ์ธ์Šคํ„ด์Šค, ๊ณต์šฉ ํ›…, ํ”„๋กœ๋ฐ”์ด๋”, ์ƒํƒœ ์Šคํ† ์–ด, ํƒ€์ž…
โ”œโ”€โ”€ mainpage/          # ์งˆ๋ฌธ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ํ”Œ๋กœ์šฐ(์˜ˆ์‚ฐ/๋ชฉ์ /๋ฌด๋“œ ๋“ฑ)
โ”œโ”€โ”€ mypage/            # ํ”„๋กœํ•„/๊ธฐ๋ณธ ์ƒํƒœ/๋จน๋ถ€๋ฆผ ๊ธฐ๋ก/์„ค์ •
โ”œโ”€โ”€ onboarding/        # 5๋‹จ๊ณ„ ์˜จ๋ณด๋”ฉ UI/ํ›…
โ”œโ”€โ”€ restaurant/        # ๋ง›์ง‘ ๋ฆฌ์ŠคํŠธยท์ƒ์„ธยท์ง€๋„(์นด์นด์˜ค ์ง€๋„ ํฌํ•จ)
โ”œโ”€โ”€ globals.css        # ์ „์—ญ ์Šคํƒ€์ผ
โ”œโ”€โ”€ layout.tsx         # ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ(App Router)
โ”œโ”€โ”€ ClientLayout.tsx   # ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๋ ˆ์ด์•„์›ƒ
โ””โ”€โ”€ page.tsx           # ๋ฃจํŠธ ํŽ˜์ด์ง€ ์—”ํŠธ๋ฆฌ

์›์น™: Server State=React Query, Client State=Zustand, ๊ณต์šฉ ๋กœ์ง=lib, ๊ณต์šฉ UI=components.


๐Ÿงฐ ๊ธฐ์ˆ  ์Šคํƒ

Core

State

Network

Tooling/Deploy


๐Ÿค ํ˜‘์—… ๊ทœ์น™

ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํƒœ๊ทธ ์„ค๋ช…
feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
fix ๋ฒ„๊ทธ ์ˆ˜์ •
docs ๋ฌธ์„œ ์ˆ˜์ •
style ์ฝ”๋“œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
design UI ๋””์ž์ธ ๋ณ€๊ฒฝ
test ํ…Œ์ŠคํŠธ ์ž‘์„ฑ/์ˆ˜์ •
refactor ๋ฆฌํŒฉํ† ๋ง(๊ธฐ๋Šฅ ๋ณ€ํ™” ์—†์Œ)
build ๋นŒ๋“œ ์„ค์ • ์ˆ˜์ •
ci CI ์„ค์ • ๋ณ€๊ฒฝ
perf ์„ฑ๋Šฅ ๊ฐœ์„ 
chore ์„ค์ •/ํŒจํ‚ค์ง€ ๋“ฑ ๊ธฐํƒ€
rename ํŒŒ์ผ/ํด๋”๋ช… ๋ณ€๊ฒฝ
remove ํŒŒ์ผ/๋ฆฌ์†Œ์Šค ์‚ญ์ œ
wip ์ง„ํ–‰ ์ค‘ ์ž„์‹œ ์ปค๋ฐ‹
hotfix ์šด์˜ ๊ธด๊ธ‰ ์ˆ˜์ •

์ž‘์„ฑ ๊ทœ์น™ ์˜ˆ์‹œ

feat: ๊ฐ์ • ์„ ํƒ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„ #12
fix: ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ์˜ค๋ฅ˜ ์ˆ˜์ • #7

๐Ÿงฏ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… & ํ•ด๊ฒฐ ๊ณผ์ •

  • ๊ฒ€์ƒ‰ ์งํ›„ ์ž๋™ ์žฌ๊ฒ€์ƒ‰: submittedTerm vs inputValue ๋ถ„๋ฆฌ, ์ดˆ๊ธฐํ™” ์งํ›„ ์ž…๋ ฅ ๋ฌด์‹œ ๊ฐ€๋“œ
  • ์ด๋ฏธ์ง€ ํ•œ๊ธ€ ํŒŒ์ผ๋ช…(NFC/NFD): ์—…๋กœ๋“œ NFC ์ •๊ทœํ™”, ํ™•์žฅ์ž ์†Œ๋ฌธ์ž, onError ์žฌ์‹œ๋„/ํด๋ฐฑ
  • ๊ณต๊ฐœ/์ธ์ฆ ์—…๋กœ๋“œ ๋ถ„๋ฆฌ: axiosPublicInstance + /v1/uploads/public ๋„์ž…์œผ๋กœ 401 ์ด์Šˆ ํ•ด์†Œ
  • ๋™์  ๋ผ์šฐํŒ… ํƒ€์ž… ์˜ค๋ฅ˜: ์ผ๋ถ€ ํŽ˜์ด์ง€ Client Component ์ „ํ™˜ + useParams() ์‚ฌ์šฉ
  • react-datepicker ๊ฒ€์ฆ: ์ œ์–ดํ˜• props๋กœ ๊ฐ•์ œ, setState ์ง์ „ ๊ฐ€๋“œ
  • ์ฐœ ํ† ๊ธ€ ์ง€์—ฐ: onMutate/onError/onSettled ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ + ๋กค๋ฐฑ

์ƒ์„ธ ๋กœ๊ทธ/์Šคํฌ๋ฆฐ์ƒท์€ ๋ณ„๋„ ๋ฌธ์„œ(๋…ธ์…˜) ์ฐธ๊ณ .


๐Ÿง  AI ํ™œ์šฉ ๋‚ด์—ญ

  • Gemini ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ: ์ปดํฌ๋„ŒํŠธ ๊ฒฝ๊ณ„, prop ๋“œ๋ฆด๋ง, ์ฟผ๋ฆฌํ‚ค/์—๋Ÿฌ ํŒจํ„ด ์ ๊ฒ€ ๋ฐ ๋ฆฌํŒฉํ„ฐ๋ง ์•„์ด๋””์–ด ๋„์ถœ

๐Ÿ—บ ๋กœ๋“œ๋งต

  • ๊ฐœ์ธํ™” ์ ์ˆ˜/๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ์—”์ง„ ๊ณ ๋„ํ™”
  • ๋ฆฌ๋ทฐ ํ’ˆ์งˆ ์‹ ๋ขฐ๋„(๊ฐ€์ค‘์น˜) ๋ฐ˜์˜ ์ •๋ ฌ
  • ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํŒŒ์ดํ”„๋ผ์ธ ๋ฆฌํŠธ๋ผ์ด/์ธ๋„ค์ผ ์›Œ์ปค
  • i18n(ํ•œ/์˜) ๋ฐ ์ ‘๊ทผ์„ฑ ๊ฐ์‚ฌ(a11y)
  • ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง(LCP/CLS/INP) ๋Œ€์‹œ๋ณด๋“œ

๐Ÿ™Œ ๊ธฐ์—ฌ์ž


Made with โค๏ธ ยฉ 2025 OMECHU Team

About

Before Refactoring v1.0

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • TypeScript 99.0%
  • Other 1.0%