๐ต ๋น์ ์ ์๋ฒฝํ ์ผํ์ ์ํด ๋์๋๋ฆด๊ฒ์!
ย
์ฌ์ฉ์ ํจํด ๋ถ์์ ํ์ฉํ ํตํฉํ ์ผํ ํ๋ซํผ ๊ตฌ์ถ๊ณผ ๋ง์ถคํ ์ํ ์ถ์ฒ ์๋น์ค
- ํ์ดํผ ๊ฐ์ธํ (Hyper-personalization)๋ ์ผํ ์๋น์ค
- AI์ CRM์ ํ์ฉํ ์ฌ์ฉ์ ๊ฐ์ธ์ ์ํ ๋ง์ถคํ ๊ฒฝํ
- ์ฌ์ฉ์ ๊ฐ์ฑ ๋ถ์์ ์ด์ฉํ ๊นจ๋ํ ๋ฆฌ๋ทฐ ์ ๊ณต
- ๋ฐ์ํ ๋์์ผ๋ก ๋๋ฐ์ด์ค ๋ณ ๋์ผํ ๊ฒฝํ ์ ๊ณต
- ์ํ ๋ณ ์์ธ ํ์ด์ง์ ๊ฒ์ ์์ง ์ต์ ํ
ย
ย
-
git clone ํ pnpm ์ค์น
-
pnpm์ ์ฌ์ฉํ์ฌ ์์กด์ฑ ์ค์น
pnpm install
-
lefthook ์ค์น ๋ฐ ์คํ (lint ๋ฐ prettier ๋์)
pnpm dlx lefthook install
ย
-
ํ์ ํ์ธ ์ฌํญ
Next.js: v15.2.3 Node.js: v20.17.0 (Next.js 15๋ Node.js 20.x ์ด์์ ๊ถ์ฅ) pnpm: v10.3.0 (v8.15.0 ์ด์์ ๊ถ์ฅ)
-
์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์
tanstack query: v5.69.0 zustand: v5.0.3 tailwind: v4.0.9
ย
ย
featย : ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
fixย : ์์
docsย : ๋ฌธ์ ์์
styleย : ์ฝ๋ ์คํ์ผ ๋ณ๊ฒฝ (์ฝ๋ ๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์๋ ๋ณ๊ฒฝ)
refactorย : ์ฝ๋ ๋ฆฌํฉํ ๋ง
perfย : (Performance) ์ฑ๋ฅ ๊ฐ์
testย : ํ
์คํธ ์์
๊ด๋ จ
choreย : ํจํค์ง, ์ค์ ํ์ผ, ํ๊ฒฝ ๋ณ์ ๋ฑ ๊ธฐ๋ฅ/๋ฒ๊ทธ ์์ ์ธ์ ์ก์ผ
buildย : ๋น๋๋ ๋ฐฐํฌ์ ํ์ํ ์ค์ /ํจํค์ง ๋ณ๊ฒฝ
ciย : CI ์ค์ ํ์ผ ๋ฐ ์คํฌ๋ฆฝํธ ๋ณ๊ฒฝ
revertย : ์ด์ ์ปค๋ฐ ๋๋๋ฆฌ๊ธฐ
main
branch
- ๋ฐฐํฌ ๊ฐ๋ฅํ ์์ ์ ์ธ ์ํ์ ์ฝ๋๋ฅผ ์ ์งํฉ๋๋ค.
- ์ผ์ฃผ์ผ ๋ง๋ค ๋ง์ผ์คํค์ด ์ข ๋ฃ๋๋ฉด ์ด ๊ณณ์์ ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
develop
branch
- ๊ฐ๋ฐ ์ค์ธ ํ์ด์ง ๋ฐ ๊ธฐ๋ฅ์ด ํตํฉ๋๋ ๋ธ๋์น์ ๋๋ค.
- ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ์๋ฃ๋ ์ฝ๋๊ฐ ๋จธ์ง๋๋ ๊ณณ์ ๋๋ค.
feature
branch
- ๊ฐ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ํ ๋ธ๋์น์ ๋๋ค.
- issue ํ๋ ๋น-branch ํ๋, PR ํ๋
- ๊ฐ ๋ธ๋์น๋ ์์ฑ๋ ์ด์์ ๋ฒํธ(issue number)๋ฅผ ํฌํจํฉ๋๋ค.
-
ํด๋๋ช
kebab-case
โ ex)navigation-bar
,server-actions
- ์ต์์ ํด๋ ๊ฒฝ๋ก์์
barrel export
-
ํ์ผ๋ช
- ๊ธฐ๋ณธ ํ์ผ:
camelCase
โ ex)calculate.ts
,apiClient.ts
- ์ปดํฌ๋ํธ ํ์ผ:
PascalCase
โ ex)Button.tsx
,ProductList.tsx
- ์ด๋ฏธ์ง ํ์ผ:
snake_case
โ ex)background_image.png
,profile_avatar.svg
- ๊ธฐ๋ณธ ํ์ผ:
-
๋ณ์ ๋ฐ ํจ์
-
๋ณ์๋ช :
camelCase
โ ex)userName
,itemCount
-
ํจ์๋ช :
camelCase
โ ex)fetchProducts()
,handleSubmit()
-
ํ์ดํ ํจ์
-
์ปดํฌ๋ํธ: ํ๋จ์ export default
const ProductList = () => { return <div>์ํ ๋ฆฌ์คํธ</div>; }; export default ProductList;
-
์ฌ๋ฌ ๊ฐ์ง ํจ์: const ์์ export
export const fetchItems = () => { /* ... */ }; export const updateUser = () => { /* ... */ };
-
-
-
์ปดํฌ๋ํธ
- ์ปดํฌ๋ํธ๋ช
:
PascalCase
โ ex)Header
,LoginForm
- ํ์ด์ง ์ปดํฌ๋ํธ:
Page
์ ๋ฏธ์ฌ ์ฌ์ฉ โ ex)HomePage
,CartPage
- ์ปดํฌ๋ํธ๋ช
:
ย
- ์๋ํ ํ๋ก์ธ์ค
- ์คํ ๋ฆฌ๋ถ ํ์ผ(
.stories.ts
,.stories.tsx
)์ ๋ณ๊ฒฝ์ ๊ฐ์งํฉ๋๋ค. develop
๋ธ๋์น๋ก PR์ด ์์ฑ๋๋ฉด ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.- GitHub Actions๋ฅผ ํตํด Chromatic์ ์คํ ๋ฆฌ๋ถ์ ๋ฐฐํฌํฉ๋๋ค.
- PR์ ์๋์ผ๋ก ๋ฐฐํฌ๋ ์คํ ๋ฆฌ๋ถ ๋งํฌ๋ฅผ ๋๊ธ๋ก ์ถ๊ฐํฉ๋๋ค.
- ์คํ ๋ฆฌ๋ถ ํ์ผ(
- ์ด์
- UI ์ปดํฌ๋ํธ์ ๋ํ ๋ณ๊ฒฝ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
- PR ๋ฆฌ๋ทฐ ์ ์๊ฐ์ ์ผ๋ก ํ์ธํ๊ณ ํผ๋๋ฐฑ์ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
- ํ์ ๊ฐ ๋์์ธ ์์คํ ๊ณต์ ์ ์ฉ์ดํฉ๋๋ค.
- ์๋ํ ํ๋ก์ธ์ค
main
๋ธ๋์น๋ก ์ฝ๋๊ฐ ๋จธ์ง๋ ๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.- Github Actions ์ํฌํ๋ก์ฐ๊ฐ ์คํ๋๊ณ ๋น๋ ๋ฐ ํ ์คํธ ๊ณผ์ ์ด ์๋ํ๋ฉ๋๋ค.
- Vercel์ ํตํด ์๋ ๋ฐฐํฌ๋ฉ๋๋ค.
ย
๐งโ๐ป ๊น๊ธ๋ @goldegg127
- ํ๊ฐ์ ํ์ ๋ฐ ์ํต
- ํ์ ์งํ ๋ฐ ์๊ธฐ
- ๋์์ธ ํ ํฐ ํ์ ๋ฐ ์ ํธ ํด๋์ค ์ ์
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์๋ฒ ์ปดํฌ๋ํธ์ ์ผ๊ด์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ต์ ์ ์
- ๊ธฐํ ๊ณตํต ์ปดํฌ๋ํธ ์ ์
- ์ฃผ๋ฌธ/๊ฒฐ์ ๋๋ฉ์ธ ๋ด๋น
- ์ฃผ๋ฌธ ํ๋ก์ธ์ค ์ค๊ณ ๋ฐ ๊ธฐ๋ฅ ๊ตฌํ
- ํ ์คํ์ด๋จผ์ธ ๊ฒฐ์ flow ์ ์ฉ
- ์ฃผ๋ฌธ ๋ด์ญ ๋ฐ ์์ธ ์กฐํ
- ์ฃผ๋ฌธ/๊ฒฐ์ , ์ฃผ๋ฌธ ๋ด์ญ, ์ฃผ๋ฌธ ์์ธ ํ์ด์ง ๋ฐ์ํ UI
๐งโ๐ป ์ด์น๊ฑด @vgotu99
- axios
- interceptor๋ฅผ ํ์ฉํ JWT silence refresh ์ธ์ฆ
- next.js์ fetch api๋ฅผ ์ ์ฉํด next.js์ ์บ์ฑ ์ง์
- next.js
- ์๋ฒ ์ก์ ๊ณผ api route๋ฅผ ํ์ฉํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ณด์
- ํ์ ๋๋ฉ์ธ ๋ด๋น
- JWT๋ฅผ ์ฟ ํค์ ์์ ํ๊ฒ ์ ์ฅ
- next-auth๋ฅผ ํ์ฉํ ์์ ๋ก๊ทธ์ธ ๊ตฌํ
- ๋ฆฌ๋ทฐ ๋๋ฉ์ธ ๋ด๋น
- ์๋ฒ/ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ ์ ํ ํผํฉํด ์ฑ๋ฅ๊ณผ ์ธํฐ๋์ ์ง์
- FAQ ๋๋ฉ์ธ ๋ด๋น
- ์๊ฐ ๊ธฐ๋ฐ ์ฌ๊ฒ์ฆ ์๋ฒ ์บ์ฑ์ ํ์ฉํ ์ ์ ํ์ด์ง ๊ตฌํ
- ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ฉํ ์ฌ์ฉ์ ์ธํฐ๋์ ์ฒ๋ฆฌ
๐งโ๐ป ์กฐ๋ณ์ฐฌ @bbjbc
- ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ (lefthook, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น, ์ฝ๋ ํ์ง ๊ด๋ฆฌ ๋๊ตฌ)
- CI/CD ๊ตฌ์ถ
- UI ์ปดํฌ๋ํธ ์๊ฐํ๋ฅผ ์ํ github actions๋ฅผ ํตํ chromatic์ ์๋ ๋ฐฐํฌ
- main ๋ธ๋์น๋ก์ ๋จธ์ง๋ ๋ github actions ํธ๋ฆฌ๊ฑฐ
- github actions๋ฅผ ํตํ ๋น๋ ๋ฐ ๋ฐฐํฌ
- vercel์ ํตํ ์๋ ๋ฐฐํฌ
- ๋ค์์ UI atom component ์ค๊ณ
- Header, Footer ๋ ์ด์์
- ์ํ ๋๋ฉ์ธ ๋ด๋น
- ๋ฉ์ธ ํ์ด์ง
- ์นดํ ๊ณ ๋ฆฌ ๋ณ ์ํ
- ์ํ ์์ธ ์ ๋ณด
- ์ถ์ฒ ์ํ ์บ๋ฌ์ ์ ์
- ๋ชฉ๋ก ๊ฐ์ํ๋ฅผ ํตํ ์ต์ ํ
- ์ฅ๋ฐ๊ตฌ๋ ๋๋ฉ์ธ ๋ด๋น
- ๋นํ์/ํ์์ ๋ฐ๋ฅธ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๋ ๋ก์ง ๊ตฌ๋ถ
ย
๐src
โโ๐apis
โโ๐app
โ โโ๐(auth)
โ โ โโreset-password
โ โ โโsignin
โ โ โโsignup
โ โโ๐(root)
โ โ โโcart
โ โ โโcheckout
โ โ โ โโfail
โ โ โ โโsuccess
โ โ โโfaqs
โ โ โโmy
โ โ โ โโorders
โ โ โ โ โโ[orderId]
โ โ โ โโreview
โ โ โ โโwrite
โ โ โ โโ[orderId]
โ โ โ โโ[productItemId]
โ โ โโproducts
โ โ โโ[productId]
โ โโ๐api
โ โ โโauth
โ โ โ โโ[...nextauth]
โ โ โโcart
โ โ โ โโ[cartItemId]
โ โ โโcategories
โ โ โ โโ[categoryId]
โ โ โ โโproducts
โ โ โโmembers
โ โ โ โโmypage
โ โ โโorders
โ โ โ โโcheckout
โ โ โโpayments
โ โ โ โโconfirm
โ โ โ โโsuccess
โ โ โโproducts
โ โ โ โโlatest-list
โ โ โ โ โโpage
โ โ โ โโrecommend
โ โ โ โโ[productId]
โ โ โโrefund
โ โ โโrequest
โ โโ๐fonts
โโ๐assets
โ โโimages
โโ๐components
โ โโ๐auth
โ โโ๐cart
โ โโ๐category
โ โโ๐common
โ โ โโbutton
โ โ โโheader
โ โโ๐faqs
โ โโ๐icons
โ โโ๐layout
โ โ โโfooter
โ โ โโheader
โ โโ๐main
โ โโ๐mypage
โ โโ๐orders-payments
โ โ โโOrderHistoryList
โ โ โโOrderProductList
โ โโ๐products
โ โ โโproduct-detail
โ โ โโskeleton
โ โโ๐reviews
โ โโcreate-review
โ โโproduct-review
โโ๐constants
โโ๐hooks
โ โโ๐common
โ โโ๐queries
โโ๐lib
โ โโ๐msw
โ โโhandlers
โโ๐mocks
โโ๐providers
โโ๐queries
โโ๐schemas
โ โโ๐auth
โโ๐server-actions
โ โโ๐auth
โ โโ๐faq
โ โโ๐review
โโ๐services
โโ๐stores
โโ๐stories
โ โโ๐button
โ โโ๐cart
โ โโ๐orders
โ โโproduct
โโ๐styles
โ โโ๐feature
โ โโ๐token
โ โโcolors
โ โโfont
โโ๐types
โโ๐utils