μλ
νμΈμ μ ν¬λ ν UIVerseμ
λλ€.
UIverseλ κ°λ°κ³Ό λμμΈμ΄ μ‘°νλ‘μ΄ μ°μ£ΌλΌλ μλ―Έλ₯Ό λ΄κ³ μμ΅λλ€.
UIVerseλ λͺ¨λ μ¬λλ€μ κ°μΈνλ μΌν κ²½νμ λ§λ€μ΄ λκ°κΈ° μν΄ λ
Έλ ₯ν©λλ€.
| Frontend | Frontend | Frontend |
|---|---|---|
| λ°μ§ν | μλͺ κ· | μ΅μμ |
| Backend | Backend | Backend | Backend | Backend |
|---|---|---|---|---|
| κ³½μ§νΈ | μ§νμΌ | μ₯λ³μ€ | λ°μμ€ | λ°μμ° |
| UXUI | UXUI |
|---|---|
![]() |
![]() |
| λμλ | νμμ |
Oraλ μ΄ν리μμ΄λ‘ "μ§κΈ"μ λ»ν©λλ€.
νΈλ¦¬νκ³ λΉ λ₯΄κ² μΌννκ³ μ νλ μλΉμλ€μκ² μ€λΌλ μΈμ λ μ΄λ €μμμ μλ―Έν©λλ€.
μ€λΌλ κ³ κ° λ°μ΄ν° μμ§κ³Ό λΆμμ ν΅ν΄ μ¬μ©μ λ§μΆ€ν μΌν κ²½νμ μ 곡νλ κ²μ λͺ©νλ‘ νλ μΌν νλ«νΌμ
λλ€.
π§βπ»λ°μ§ν @rondido
-
Storybook chromatic λ°°ν¬λ₯Ό ν΅ν λμμ΄λ νμ κ°νν
-
λ©μΈ νμ΄μ§
- μ€λμ νΉκ°, μΈκΈ°μ, μ€μκ° κ²μ ν€μλ, 리뷰 μ κΈ°λ₯ ꡬν
-
μν
- μν μμΈ νμ΄μ§
-
μ₯λ°κ΅¬λ κΈ°λ₯ ꡬν
- λΉνμ, νμ μ₯λ°κ΅¬λ κΈ°λ₯ ꡬν
-
μ£Όλ¬Έ
- λΉνμ μ£Όλ¬Έ, νμ μ£Όλ¬Έ, μ₯λ°κ΅¬λμμ μ£Όλ¬Έ κΈ°λ₯ ꡬν
π§βπ»μλͺ κ· @mgYang53
-
λμμΈ μμ€ν
- Tailwindcss κ³΅ν΅ μ€μ (λ μ΄μμ, breakpoints, μ νΈλ¦¬ν° ν΄λμ€)
- νμ΄ν¬κ·ΈλνΌ λ° μμ μμ€ν μ€μ
- svgr νλ¬κ·ΈμΈ μ€μ λ° μμ΄μ½ μ»΄ν¬λνΈ μμ±
- λͺ¨λ°μΌ Viewport λΉμ¨ μλμ‘°μ κΈ°λ₯ κ°λ°
-
UI μ»΄ν¬λνΈ κ°λ°
- Atom λ¨μ μ»΄ν¬λνΈ κ°λ° (Button, Radio, Checkbox, Tag λ±)
- Molecule λ¨μ μ»΄ν¬λνΈ κ°λ° (Tab, Snackbar λ±)
- Organism λ¨μ μ»΄ν¬λνΈ κ°λ° (Header, Footer λ±)
- Storybookμ μ»΄ν¬λνΈ μ€ν 리 μΆκ°
-
κΈ°λ₯ κ°λ°
- κ³΅ν΅ κΈ°λ₯
- Data Fetching μ λ΅ μ μ
- Tanstack Query μ€μ
- μΏΌλ¦¬ν€ κ΄λ¦¬νλ μμ κ°μ²΄ μ€μ
- μλ² μ»΄ν¬λνΈμμμ λ°μ΄ν° Prefetching κ³΅ν΅ μ»΄ν¬λνΈ κ°λ°(PrefetchedQueryHydrationBoundary)
- ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈμμμ λ°μ΄ν° μ²λ¦¬ 컀μ€ν ν κ°λ°(useFetchData & useDataMutation)
- μλ²/ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈμμμ ν¨μ¨μ μΈ λ°μ΄ν° νμΉ μ λ΅ μ μ
- λΉλκΈ° μ²λ¦¬ κ³΅ν΅ μ€μ
- μλ²/ν΄λΌμ΄μΈνΈ μ¬μ© ꡬλΆμ λ°λ₯Έ Axios μΈμ€ν΄μ€ λ° μΈν°μ ν° μ€μ
- Next.js API Routeμ catch-all λμ μΈκ·Έλ¨ΌνΈ μ€μ νμ¬ κΈ°λ³Έ API μμ² λ‘μ§ μ΅μν
- Data Fetching μ λ΅ μ μ
- λλ©μΈλ³ κΈ°λ₯
- μν κ²μ κ²°κ³Ό ꡬν
- μν μ°νκΈ° κΈ°λ₯ ꡬν
- μ΄λ©μΌ/ν΄λν° μΈμ¦ κΈ°λ₯ ꡬν
- μμ΄λ/λΉλ°λ²νΈ μ°ΎκΈ° κΈ°λ₯ ꡬν
- κ³΅ν΅ κΈ°λ₯
π§βπ»μ΅μμ @choiyoungae
-
UI μ»΄ν¬λνΈ κ°λ°
- Atom λ¨μ μ»΄ν¬λνΈ κ°λ° (Input, Label, HelperLabel)
- Molecules λ¨μ μ»΄ν¬λνΈ κ°λ° (Modal, Select)
-
μΈμ¦μΈκ°
- νμκ°μ , λ‘컬/μμ λ‘κ·ΈμΈ, λ‘κ·Έμμ νλ©΄ λ§ν¬μ λ° κΈ°λ₯ ꡬν
- zustand persist, cookieλ₯Ό νμ©ν μν κ΄λ¦¬ λ° λ―Έλ€μ¨μ΄ μ€μ
-
λ§μ΄νμ΄μ§
- ν λ° λ μ΄μμ ꡬμ±
-
μ£Όλ¬Έ
- μ£Όλ¬Έ λͺ©λ‘/μμΈ νμ΄μ§ λ§ν¬μ λ° κΈ°λ₯ ꡬν
- λΉνμ μ£Όλ¬Έμ‘°ν λ§ν¬μ λ° κΈ°λ₯ ꡬν
νλ‘μ νΈ λλ©μΈ 첨λΆ
λΈλΌμ°μ μμ http://localhost:3000μ μ μ νΉμ
https://uiverse.shop/μμμ νμΈν μ μμ΅λλ€.
Yarn Version 1.22.22
Yarn λͺ λ Ήμ΄
yarn run devμ΄ νλ‘μ νΈλ₯Ό μ€ννλ €λ©΄, environment variablesκ° μλ .env νμΌμ΄ νμν©λλ€.
νμ΄μ§ νλ¨ νμ μ°λ½μ²λ‘ μ°λ½λ°λλλ€.
βββ π public/ # μ μ νμΌ (μ΄λ―Έμ§, ν°νΈ λ±)
β βββ π icons/ # νλ‘μ νΈμμ μ¬μ©νλ μμ΄μ½ μ΄λ―Έμ§
βββ π src/ # μμ€ μ½λ
β βββ π app/ # Next.js App Router (νμ΄μ§ λ° API λΌμ°νΈ)
β β βββ π (auth)/ # μΈμ¦ κ΄λ ¨ κ·Έλ£Ή λΌμ°νΈ (μ: λ‘κ·ΈμΈ, νμκ°μ
λ±)
β β β βββ π login/ # λ‘κ·ΈμΈ νμ΄μ§
β β βββ π guest/ # λΉνμ μ£Όλ¬Έμ‘°ν νμ΄μ§
β β β βββ π [orderNumber]/ # μ£Όλ¬Έλ²νΈλ₯Ό URL νλΌλ―Έν°λ‘ λ°λ λμ νμ΄μ§
β β βββ π api/ # API Route (μλ²μ¬μ΄λ API νΈλ€λ§)
β β β βββ π [...path]/ # λμ κ²½λ‘ API (catch-all λΌμ°νΈ)
β βββ π components/ # μ¬μ¬μ© κ°λ₯ν UI μ»΄ν¬λνΈ
β β βββ π common/ # νλ‘μ νΈ λ¨μ κ³΅ν΅ μ»΄ν¬λνΈ
β β β βββ π Button/ # λ²νΌ μ»΄ν¬λνΈ
β β β βββ π Label/ # λΌλ²¨ μ»΄ν¬λνΈ
β β βββ π layout/ # λ μ΄μμ κ΄λ ¨ μ»΄ν¬λνΈ
β β β βββ π Header/ # ν€λ μ»΄ν¬λνΈ
β β β βββ π Main/ # λ©μΈ μ½ν
μΈ μμ μ»΄ν¬λνΈ
β β β βββ π Container/ # νμ΄μ§ 컨ν
μ΄λ μ»΄ν¬λνΈ
β β βββ π order/ # μ£Όλ¬Έ κ΄λ ¨ UI μ»΄ν¬λνΈ
β βββ π constants/ # νλ‘μ νΈμμ μ¬μ©νλ μμ λͺ¨μ
β βββ π hooks/ # 컀μ€ν
ν
(μ: λ°μ΄ν° νμΉ, μν κ΄λ¦¬ λ±)
β βββ π lib/ # μΈλΆ μ νΈλ¦¬ν° λ° λΌμ΄λΈλ¬λ¦¬ μ€μ
β β βββ π axios/ # Axios μ€μ λ° μΈμ€ν΄μ€ κ΄λ¦¬
β β βββ π tanstackQuery/ # TanStack Query μ€μ λ° API κ΄λ ¨ μ νΈλ¦¬ν°
β βββ π utils/ # μ νΈλ¦¬ν° ν¨μ (μ: λ μ§ ν¬λ§· λ³ν, λ°μ΄ν° μ²λ¦¬ λ±)
β βββ π stores/ # Zustand μν κ΄λ¦¬ μ€ν μ΄
β βββ π stories/ # μ€ν λ¦¬λΆ (UI μ»΄ν¬λνΈ ν
μ€νΈ λ° λ¬Έμν)
β βββ π services/ # μλΉμ€ ν¨μ (λΉμ¦λμ€ λ‘μ§ μ²λ¦¬)
β βββ π serverActions/ # μλ² μ‘μ
ν¨μ (Next.js μλ² μ‘μ
API)
β βββ π providers/ # νλ‘λ°μ΄λ
β βββ π styles/ # κΈλ‘λ² λ° μ»΄ν¬λνΈ μ€νμΌ νμΌ
β βββ π types/ # TypeScript νμ
μ μ
β βββ π login/ # λ‘κ·ΈμΈ κ΄λ ¨ νμ
μ μ
β βββ π category/ # μΉ΄ν
κ³ λ¦¬ κ΄λ ¨ νμ
μ μ
βββ π .gitignore # Git 무μ νμΌ λͺ©λ‘
βββ π README.md # νλ‘μ νΈ κ°μ λ° κ°μ΄λ λ¬Έμ
βββ π package.json # νλ‘μ νΈ μ’
μμ± λ° μ€ν¬λ¦½νΈ
βββ π tsconfig.json # TypeScript μ€μ νμΌ
βββ π next.config.js # Next.js μ€μ νμΌ
βββ π yarn.lock # μ’
μμ± λ²μ κ΄λ¦¬ νμΌ
π§βπ»λ°μ§ν @rondido
- λ°°μ΄ μ
- Figmaλ₯Ό ν΅ν΄ λμ§μ΄λμ νμ , λ€μν μ§κ΅°λ€κ³Ό νμ μ ν΅ν΄ μν΅μ μ€μμ±μ λν΄ μκ² λμμ΅λλ€.
- 무λΆλ³ν μν κ΄λ¦¬λ₯Ό ν΅ν μ½λ 볡μ‘μ± μ¦κ°λ‘ μΈν μ μ§ λ³΄μμ± μ ν
- Next.js ssrμ csrμ λν΄ μκ² λμκ³ , srrλ₯Ό μ¬μ©ν΄μΌ νλ μ΄μ μ λν΄ μκ² λμμ΅λλ€.
- srrμμλ tanstackQuery 쿼리 μ¬μ©μ΄ csrκ³Ό λ€λ₯΄κ² μ μ© νλ κ²μ λν΄ μκ²λμμ΅λλ€.
- μ΄λ €μ λ μ
- μν κ΄λ ¨ κΈ°λ₯ ꡬν μ€ μν κ°κ°μΈμ λ§λ μλ κ΄λ¦¬
- μ₯λ°κ΅¬λμμ μλμ λ³κ²½νκ³ λ³κ²½ λ μλμ λ§λ μ€μκ° κΈμ‘ κ³μ°
- μ΄λ₯Ό ν΅ν΄ λ³΄λ€ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ΄ λμ λ°©μμΌλ‘ κ΄λ¦¬νκΈ° μν λ°©λ²μ λν κ³ λ―Ό
- ssrμ μ¬μ© ꡬ쑰 νλ¦ νμ
- server componentμ client componentλ₯Ό μ νλ κΈ°μ€
- κ°μ νκ³ μΆμ μ
- μ₯λ°κ΅¬λμ μ£Όλ¬Έμμ μ¬μ©λλ μν κ΄λ ¨ μνλ₯Ό λ‘μ§ κ°μ
- LCP,FCP μΈ‘μ μ ν΅ν λ λλ§ μλ κ°μ
- Next jsμ μ¬μ©λλ prefetching,ssgλ₯Ό ν΅ν λ λλ§ μλ κ°μ
- μμΌλ‘μ κ³ν
- λ€μν ν μ€νΈ λ°©μμ νμ©ν ν μ€ν¬ μ½λ λμ
- λΆνμν μ½λ μ κ±° λ° μ»΄ν¬λνΈ λΆλ¦¬
- κ²°μ , μ¬κ³ , μν μ΅μ κ΄λ ¨ κΈ°λ₯ λμ
- λ λλ§ μλ νΉμ λ° λ©λͺ¨λ¦¬ μ¬μ© κ΄λ ¨ μ΅μ ν
π§βπ»μλͺ κ· @mgYang53
- λ°°μ΄ μ
- Tailwind CSSλ₯Ό νμ©ν λμμΈ μμ€ν κ΅¬μΆ κ³Όμ μμ μ¬μ¬μ© κ°λ₯ν μ νΈλ¦¬ν° ν΄λμ€μ ν¨μ¨μ±κ³Ό νμ₯μ±μ κ²½ννμ΅λλ€.
- Atomic Design λ°©λ²λ‘ μ μ μ©ν΄ μ»΄ν¬λνΈλ₯Ό 체κ³μ μΌλ‘ μ€κ³νλ λ°©λ²μ μ΅λνμ΅λλ€.
- Next.jsμ μλ²/ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ₯Ό ν¨κ³Όμ μΌλ‘ ꡬλΆνμ¬ λ°μ΄ν° νμΉ μ λ΅μ μ΅μ ννλ λ°©λ²μ μ΅νμ΅λλ€.
- Tanstack Queryλ₯Ό νμ©ν μν κ΄λ¦¬μ μλ² μν λκΈ°νμ ν¨μ¨μ μΈ ν¨ν΄μ νμ΅νμ΅λλ€.
- μ΄λ €μ λ μ
- μλ² μ»΄ν¬λνΈμ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈ κ°μ λ°μ΄ν° μ λ¬ λ° hydration κ³Όμ μμ μμμΉ λͺ»ν λ¬Έμ λ€μ΄ λ°μνμ΅λλ€.
- Prefetching μ λ΅μ ꡬννλ©΄μ SSRκ³Ό CSRμ κ²½κ³μμ λ°μνλ μ±λ₯ μ΄μλ₯Ό ν΄κ²°νλ λ° μ΄λ €μμ΄ μμμ΅λλ€.
- μ¬λ¬ λλ©μΈλ³ κΈ°λ₯ κ°λ° μ μΌκ΄λ μλ¬ μ²λ¦¬ λ°©μμ μ 립νλ λ° μκ°μ΄ λ§μ΄ μμλμμ΅λλ€.
- λμμΈ μμ€ν μ μΌκ΄μ±μ μ μ§νλ©΄μλ κ° νμ΄μ§λ³ νΉμ±μ λ°μνλ μ μ°ν μ»΄ν¬λνΈ μ€κ³μ μ΄λ €μμ΄ μμμ΅λλ€.
- κ°μ νκ³ μΆμ μ
- μ»΄ν¬λνΈλ³ ν μ€νΈ μ½λ μμ±μ΄ λΆμ‘±νλ μ μ κ°μ νμ¬ μμ μ μΈ UIλ₯Ό ꡬμΆνκ³ μΆμ΅λλ€.
- λμμΈ ν ν° κ΄λ¦¬ 체κ³λ₯Ό λ μΈλΆννμ¬ ν λ§ λ³κ²½μ΄λ μ€νμΌ μμ μ μ μ§λ³΄μ ν¨μ¨μ λμ΄κ³ μΆμ΅λλ€.
- Storybook λ¬Έμνκ° μ»΄ν¬λνΈ κ°λ° μλμ λΉν΄ λ€μ²μ§ λΆλΆμ κ°μ νμ¬ ν λ΄ μ»΄ν¬λνΈ νμ©λλ₯Ό λμ΄κ³ μΆμ΅λλ€.
- API μμ² λ‘μ§κ³Ό μλ¬ νΈλ€λ§ ν¨ν΄μ λ 체κ³μ μΌλ‘ μ 립νμ¬ μ½λ μ€λ³΅μ μ€μ΄κ³ μΆμ΅λλ€.
- μ±λ₯ λͺ¨λν°λ§ λ° μ΅μ ν μ λ΅μ΄ λΆμ‘±νλ μ μ 보μνμ¬ μ¬μ©μ κ²½νμ ν₯μμν€κ³ μΆμ΅λλ€.
- μμΌλ‘μ κ³ν
- μ»΄ν¬λνΈ λ¨μ ν μ€νΈμ E2E ν μ€νΈλ₯Ό λμ νμ¬ UI νμ§μ 보μ₯νλ μμ€ν μ ꡬμΆν μμ μ λλ€.
- μ±λ₯ μΈ‘μ λ©νΈλ¦μ μ μνκ³ μ§μμ μΈ λͺ¨λν°λ§ 체κ³λ₯Ό ꡬμΆνμ¬ μΉ μ±λ₯μ μ΅μ νν μμ μ λλ€.
- Tanstack Queryμ κ³ κΈ κΈ°λ₯(Invalidation, Optimistic Updates)μ νμ©ν μ¬μ©μ κ²½ν ν₯μ μ λ΅μ μ μ©ν κ³νμ λλ€.
- μ»΄ν¬λνΈ λ²λ€ μ¬μ΄μ¦ λΆμ λ° μ΅μ νλ₯Ό ν΅ν΄ μ΄κΈ° λ‘λ© μλλ₯Ό κ°μ ν κ³νμ λλ€.
π§βπ»μ΅μμ @choiyoungae
- λ°°μ΄ μ
- Nextjsλ₯Ό κ²½νν΄λ³Ό μ μμκ³ zustand persist κΈ°λ₯κ³Ό λ―Έλ€μ¨μ΄ μ€μ μ νμ©ν μΈμ¦ νλ¦μ μμ νλ©΄μ λ§μ΄ λ°°μ μ΅λλ€.
- μ΄λ €μ λ μ
- μΈμ¦ κ΄λ ¨ λ‘μ§ μ²λ¦¬μ μ λ§ νμ λ§μ΄ λ€μμ΅λλ€. κ·Έλλ κ·Έλ§νΌ λ°°μ΄ μ μ΄ λ§μλ κ² κ°μ΅λλ€.
- κ°μ νκ³ μΆμ μ
- νμκ°μ μμ useStateλ₯Ό λ무 λ§μ΄ μ΄ κ² κ°μ react-hook-formμ νμ©ν΄λ³΄κ³ μΆμ΅λλ€.
- μμΌλ‘μ κ³ν
- μ½λ 리ν©ν λ§κ³Ό νμ μ 보 μμ λ± μΆκ° κΈ°λ₯μ ꡬνν μμ μ λλ€.
- [μν] κ²μ νν° κΈ°λ₯ μΆκ°
- [μν] μΉ΄ν κ³ λ¦¬λ³ μν νμ΄μ§
- [κ²°μ ] μν κ²°μ λ° κ²°μ μλ£ νμ΄μ§
- [μΌνλͺ°] μμΈ νμ΄μ§ ꡬν
- [λ‘κ·Έ] νμ΄μ§ λ°©λ¬Έ, μν ν΄λ¦, 리뷰 μ‘°ν λ‘κ·Έ μμ§
- [λ§μ΄νμ΄μ§] νμμ 보μμ , λ§μΆ€μ 보μ€μ , λ΄ μλΉ λ¦¬ν¬νΈ
- [λ§μ΄νμ΄μ§] κ²°μ μ·¨μ μμΈ νμ΄μ§
- [λ§μ΄νμ΄μ§] μ΅κ·Ό λ³Έ μν, μ°ν μν/μ€ν μ΄, λμ 리뷰, μ¬μ κ³ μλ¦Ό
- [λ§μ΄νμ΄μ§] 곡μ§μ¬ν, λ¬Έμμ¬ν, FAQ
- [μ»΄ν¬λνΈ κ΄λ¦¬ λ° ν μ€νΈ] Storybook 보μ λ° λ¨μ/E2E ν μ€νΈ λμ
- [μ΅μ ν] μ±λ₯ μΈ‘μ λ° μ΅μ ν
λ°μ§ν: rppr001@naver.com
μλͺ
κ·: mg960503@gmail.com
μ΅μμ : choiaeyoung@gmail.com
