λμκ² λ± λ§λ μ¬μ§κ΄μ μ°Ύμμ£Όλ μλΉμ€, PICDAYμ νλ‘ νΈμλ λ ν¬μ§ν 리μ
λλ€.
PICDAYλ μ¬μ©μκ° μ΄¬μ λͺ©μ , λ μ§, μ§μ λ±μ 쑰건μΌλ‘ μ¬μ§κ΄μ κ²μνκ³ μμ½ν μ μλ μΉ μλΉμ€μ
λλ€.
π₯ νμ λ° μν λΆλ΄
μ΄λ¦
μν
λ΄λΉ νμ΄μ§
κΉμ΄μ€ (νμ₯)
FE
A. λ‘κ·ΈμΈ/νμκ°μ
, B. κ²μ, G. μμ리μ€νΈ
λ¨νμ€
FE
C. μ¬μ§κ΄ νμ/μμΈ
μ μ§ν
FE
D. λΉκ΅, E. μμ½
μ μΉμ°
FE
F. λ§μ΄νμ΄μ§, 리뷰
μν
κΈ°μ
λ²λ€λ¬
Vite
UI
React + TypeScript
μ€νμΌλ§
Tailwind CSS v4
λΌμ°ν°
React Router v8
μ μ μν
Zustand v5
μλ² μν
TanStack Query v5
HTTP ν΄λΌμ΄μΈνΈ
axios
μ§λ
react-kakao-maps-sdk
src/
βββ components/
β βββ common/ # κ³΅ν΅ UI μ»΄ν¬λνΈ (Button, Card, Chip λ±)
β βββ layout/ # λ μ΄μμ μ»΄ν¬λνΈ (NavigationBar, AppTabBar λ±)
β βββ icons/ # μμ΄μ½ μ»΄ν¬λνΈ
βββ pages/
β βββ auth/ # A - λ‘κ·ΈμΈ/νμκ°μ
β βββ home/ # A-1/B-1 - ν
β βββ search/ # B - κ²μ
β βββ studio/ # C - μ¬μ§κ΄ λͺ©λ‘/μμΈ
β βββ compare/ # D - μ¬μ§κ΄ λΉκ΅
β βββ reservation/ # E - μμ½
β βββ mypage/ # F - λ§μ΄νμ΄μ§
β βββ wishlist/ # G-1 μμ리μ€νΈ
β βββ common/ # μ½κ΄ μμΈ λ± κ³΅μ© νλ©΄
βββ hooks/ # 컀μ€ν
ν
βββ stores/ # Zustand μ μ μν
βββ services/ # API νΈμΆ ν¨μ (axios ν΄λΌμ΄μΈνΈ + λλ©μΈλ³ ν¨μ)
βββ types/ # TypeScript νμ
/μΈν°νμ΄μ€
βββ constants/ # κ³΅μ© μμ (μ½κ΄ λͺ©λ‘ λ±)
βββ styles/ # λμμΈ ν ν°, νμ΄ν¬κ·ΈλνΌ CSS
βββ assets/ # μ΄λ―Έμ§, ν°νΈ λ± μ μ νμΌ
βββ App.tsx # λΌμ°νΈ μ€μ
βββ main.tsx # μ± μ§μ
μ
λ°μ΄νΒ·μΈλ―Έμ½λ‘ : μλ‘ μμ±νλ μ½λλ μμλ°μ΄ν(') + μΈλ―Έμ½λ‘ μμμ κΈ°λ³ΈμΌλ‘ ν©λλ€. components/common/ μ΄λ°μ λ§λ€μ΄μ§ μΌλΆ μ»΄ν¬λνΈ(μ: InputField.tsx, SearchField.tsx, Calendar.tsx λ±)λ ν°λ°μ΄ν+μΈλ―Έμ½λ‘ μ€νμΌλ‘ λ¨μμλλ°, ν ν©μλ‘ κΈ°μ‘΄ νμΌμ κ΅³μ΄ ν΅μΌνμ§ μκ³ κ·Έλλ‘ λ κ²μ
λλ€ β νμΌλ§λ€ μ€νμΌμ΄ μμΈ κ² μλλΌ "μ΄μ μ λ§λ νμΌ vs μ΄νμ λ§λ νμΌ" κΈ°μ€μΌλ‘ λλ©λλ€.
μ΄ μ μ₯μμ λ³λμ ESLint μ€μ μ΄ μκ³ oxlint(npm run lint)λ§ μ¬μ©ν©λλ€.
λΈλμΉ
μ€λͺ
main
μ€μ μλΉμ€μ λ°°ν¬λλ λΈλμΉ
develop
λͺ¨λ κΈ°λ₯ λΈλμΉκ° λ³ν©λλ κΈ°λ³Έ κ°λ° λΈλμΉ
feature/*
κΈ°λ₯ κ°λ° (developμμ λΆκΈ°)
bugfix/*
λ²κ·Έ μμ (developμμ λΆκΈ°)
hotfix/*
μ΄μ μ€ κΈ΄κΈ μμ (mainμμ λΆκΈ°)
design/*
λμμΈ λ°μ (developμμ λΆκΈ°)
fix/*
λ²κ·Έ μμ (developμμ λΆκΈ°, bugfix/*μ λμΌνκ² μ¬μ©)
refactor/*
리ν©ν λ§ (developμμ λΆκΈ°)
docs/*
λ¬Έμ μμ
(developμμ λΆκΈ°)
test/*
ν
μ€νΈ (developμμ λΆκΈ°)
chore/*
κΈ°ν μμ
(developμμ λΆκΈ°)
<type>/<issue-number>-<κ°λ¨νμ€λͺ
>
feature/12-login-form
bugfix/45-missing-data-sync
hotfix/73-server-crash-on-boot
design/21-studio-detail-ui
refactor/34-search-hook
docs/5-readme-update
λ¨κ³
μ€λͺ
feature/, bugfix/
developμμ λΆκΈ°νκ³ λ€μ developμΌλ‘ λ³ν©
develop β main
μ κΈ° λ¦΄λ¦¬μ¦ λλ QA μλ£ μμ μ λ³ν©
hotfix/
mainμμ μ§μ λΆκΈ°νμ¬ μ΄μ κΈ΄κΈ μμ λ§ μ²λ¦¬
main β develop
hotfix μ΄ν developκ³Όμ μν λκΈ°ν
<Gitmoji> <Type>. <μμ½ μ€λͺ
>
Why: λ³κ²½ μ΄μ
How: λ³κ²½ λ°©λ² (κ° μ€ 72μ μ΄λ΄)
Tag: #ν€μλ #κΈ°μ #ν¨ν΄
See: λ§ν¬ λλ μ΄μ λ²νΈ
Gitmoji
Type
μ€λͺ
π¨
Style
μ½λ ν¬λ§·, ꡬ쑰 κ°μ
β‘
Perf
μ±λ₯ κ°μ
π₯
Remove
λΆνμν μ½λ/νμΌ μμ
π
Fix
λ²κ·Έ μμ
π
Hotfix
κΈ΄κΈ μμ
β¨
Feat
μλ‘μ΄ κΈ°λ₯ μΆκ°
π
Docs
λ¬Έμ μμ± λ° μμ
π
Deploy
λ°°ν¬ κ΄λ ¨ μμ
π¨
UI
UI/μ€νμΌ λ³κ²½
β
Test
ν
μ€νΈ μ½λ μΆκ° λ° μμ
π
Security
보μ μ΄μ ν΄κ²°
β»οΈ
Refac
리ν©ν λ§
π§
Config
μ€μ νμΌ μμ
π¨
Script
λΉλ/κ°λ° μ€ν¬λ¦½νΈ
π‘
Comment
μ£Όμ μΆκ°/μμ
π
Move
리μμ€ μ΄λ/리λ€μ΄λ°
π±
Mobile
λ°μν/λλ°μ΄μ€ λμ
π©Ή
Patch
κ°λ¨ν μμ
βοΈ
Typo
μ€ν μμ
βͺ
Revert
μ΄μ μ»€λ° λ‘€λ°±
π
Ignore
.gitignore κ΄λ ¨ μμ
β¨ Feat. μ¬μ§κ΄ κ²μ νν° κΈ°λ₯ ꡬν
Why: μ¬μ©μκ° λͺ©μ /λ μ§/μ§μ 쑰건μΌλ‘ μ¬μ§κ΄μ νν°λ§ν μ μμ΄μΌ ν¨
How: FilterPageμ 쑰건 μν κ΄λ¦¬ μΆκ°,
TanStack Queryλ‘ νν° νλΌλ―Έν° API μ°λ
Tag: #feat #filter #react-query
See: #21
## κ΄λ ¨ μ΄μ
- Closes #μ΄μλ²νΈ
## μ£Όμ λ³κ²½ λ΄μ©
-
## μ€ν¬λ¦°μ· (μ ν)
## ν
μ€νΈ 체ν¬λ¦¬μ€νΈ
- [ ] μ μ λμ νμΈ
- [ ] λΈλΌμ°μ νΈνμ± νμΈ
## κΈ°ν 곡μ μ¬ν
# μμ‘΄μ± μ€μΉ
npm install
# νκ²½λ³μ μ€μ (.env.exampleμ 볡μ¬ν΄ κ° μ±μ°κΈ°)
cp .env.example .env
# κ°λ° μλ² μ€ν (λ°°ν¬λ λ°±μλλ‘ λΆμΌ λ λ°λμ 3000λ² ν¬νΈλ‘ β μλ μ°Έκ³ )
npm run dev -- --port 3000
.envμ νμν κ°:
λ³μ
μ€λͺ
VITE_API_BASE_URL
λ°±μλ API Base URL (μ€λ¦¬μ§λ§, μ: http://localhost:8080)
VITE_KAKAO_MAP_KEY
μΉ΄μΉ΄μ€λ§΅ JavaScript ν€. Kakao Developers μμ λ°κΈ, νλ«νΌμ http://localhost:3000 λ±λ‘ νμ
β οΈ CORS μ£Όμ : λ°°ν¬λ λ°±μλλ localhost:3000λ§ CORS νμ© λͺ©λ‘μ λ±λ‘λμ΄ μμ΅λλ€. Vite κΈ°λ³Έ ν¬νΈ(5173)λ‘ μ€ννλ©΄ VITE_API_BASE_URLμ λ°°ν¬ λ°±μλλ‘ μ€μ νμ λ CORS μλ¬κ° λ©λλ€. λ°λμ npm run dev -- --port 3000μΌλ‘ μ€ννμΈμ. (λ‘컬 λ°±μλλ₯Ό μ§μ λμμ λΆμ΄λ κ²½μ°λ ν΄λΉ μμ)
λͺ¨λ°μΌ UI νμΈμ Chrome DevToolsμμ Cmd + Shift + M (λλ°μ΄μ€ λͺ¨λ) μ¬μ©μ κΆμ₯ν©λλ€.
νλ‘λμ
: picday-fe.vercel.app β main λΈλμΉμ pushνλ©΄ Vercel(GitHub μ°λ)μ΄ μλμΌλ‘ λ°°ν¬ν©λλ€.
νκ²½λ³μ λ Vercel νλ‘μ νΈ μ€μ (Production/Preview)μμ λ³λλ‘ κ΄λ¦¬νλ©°, λ‘컬 .envμλ λ
립μ μ
λλ€.
π± νλ©΄ λͺ©λ‘ λ° νλ‘μ°
A. λ‘κ·ΈμΈ/νμκ°μ
Β· ν
νλ©΄
μ€λͺ
A-1 λΉλ‘κ·ΈμΈ ν
κ²μμ°½Β·μΊλ¬μ
Β·μ¬μ§κ΄ 리μ€νΈ (Guest νλ°)
B-1 λ‘κ·ΈμΈ ν ν
A-1κ³Ό λμΌ μ½ν
μΈ , User νλ°
A-2 λ‘κ·ΈμΈ
μμ΄λ/λΉλ°λ²νΈ λ‘κ·ΈμΈ, μμ
λ‘κ·ΈμΈ
A-2 μμ
μΈμ¦ μ²λ¦¬ μ€
μΉ΄μΉ΄μ€/κ΅¬κΈ μΈμ¦ μ½λ°± λκΈ° νλ©΄
A-3 μ체 νμκ°μ
μ΄λ¦/μμ΄λ/λΉλ°λ²νΈ/μ΄λ©μΌ/μ νλ²νΈ + μ½κ΄λμ
A-4 νμκ°μ
μλ£
κ°μ
μλ£ μλ΄, λ‘κ·ΈμΈ νλ©΄μΌλ‘ μ΄λ
A-5 μμ
μ κ·νμ μ½κ΄λμ
μμ
μ΅μ΄ λ‘κ·ΈμΈ μ μ½κ΄λμλ§ λ°λ νλ©΄
νλ©΄
μ€λͺ
B-2 ν΅ν©κ²μ
ν€μλ κ²μ λ©μΈ νλ©΄
B-2 μλμμ± λ
ΈμΆ
κ²μμ΄ μλμμ±
B-3 λ μ§ μ ν
촬μ λ μ§ μ ν
B-4 λͺ©μ μ ν
촬μ λͺ©μ μ ν
νλ©΄
μ€λͺ
C-1 μ§λ+리μ€νΈ
μ§λμ 리μ€νΈ ν΅ν© λ·°
C-2 μ§λ μ 체뷰
μ§λ μ 체 νλ©΄
C-3 κ²°κ³Ό μμ
κ²μ κ²°κ³Ό μμ
C-3 리μ€νΈ μ 체뷰
리μ€νΈ μ 체 νλ©΄
C-4 νν°
νν° μ€μ (κ°κ²©, μ€νμΌ λ±)
C-5 μ¬μ§κ΄ μμΈ
μ¬μ§κ΄ μμΈ μ 보
C-6 리뷰 μμΈ
리뷰 λͺ©λ‘ λ° μμΈ
C-7 컨μ
λͺ©λ‘
촬μ 컨μ
λͺ©λ‘
C-8 컨μ
μ¬μ§ μμΈ
컨μ
μ¬μ§ μμΈ
νλ©΄
μ€λͺ
D-1 λΉκ΅ν 촬μ λͺ©μ μ ν
λΉκ΅ λͺ©μ μ ν
D-2 λΉκ΅ 2κ°
μ¬μ§κ΄ 2κ° λΉκ΅
D-3 λΉκ΅ 3κ°
μ¬μ§κ΄ 3κ° λΉκ΅
νλ©΄
μ€λͺ
E-1 μμ½
μμ½ μ 보 μ
λ ₯
E-1 μ ν΄μ΅ μ ν
ν€μ΄λ©μ΄ν¬μ
μ ν΄μ΅ μ ν
E-3 μμ½ μλ£
μμ½ μλ£ νμΈ
νλ©΄
μ€λͺ
F-1 μμ½ λͺ©λ‘
μ 체/μμ½μλ£/촬μμλ£/μ·¨μ νλ³ μμ½ λ΄μ
F-1D μμ½ μμΈ
μμ½ μμΈ λ΄μ, μνλ³(μμ½μλ£/촬μμλ£/μ·¨μ) νλ©΄ λΆκΈ°
F-1C μμ½ μ·¨μ
μμ½ λ΄μΒ·νλΆ μλ΄ νμΈ ν μ·¨μ μ§ν
F-1C μ·¨μ μλ£
μ·¨μ μλ£ μλ΄, λ§μ΄νμ΄μ§/ν μ΄λ
F-1R 리뷰 μμ±
촬μ μλ£ κ±΄μ λν λ³μ Β·νκ·ΈΒ·νκΈ°Β·μ¬μ§ 첨λΆ
F-1R 리뷰 λ±λ‘ μλ£
리뷰 λ±λ‘ μλ£ μλ΄, λ§μ΄νμ΄μ§ μ΄λ
λ΄ λ¦¬λ·° μμΈ/μμ
μμ±ν 리뷰 μ‘°νΒ·μμ Β·μμ (/mypage/reviews/:reviewId)
F-3 νλ‘ν μ€μ
λλ€μΒ·μλ¦Ό μ€μ νΈμ§, μ°κ²° κ³μ νμΈ
F-3 νμνν΄
νν΄ νμΈ νμ
νλ‘μ°
F-3 νν΄ μλ£
νν΄ μλ£ μλ΄, νμΌλ‘ μ΄λ
νλ©΄
μ€λͺ
G-1 μμ리μ€νΈ
μ°ν μ¬μ§κ΄ λͺ©λ‘