8000 GitHub - tutti-tutti/tutti-client: ๐Ÿ›๏ธ์‚ฌ์šฉ์ž ํŒจํ„ด ๋ถ„์„์„ ํ™œ์šฉํ•œ ํ†ตํ•ฉํ˜• ์‡ผํ•‘ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ณผ ๋งž์ถคํ˜• ์ƒํ’ˆ ์ถ”์ฒœ ์„œ๋น„์Šค
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

๐Ÿ›๏ธ์‚ฌ์šฉ์ž ํŒจํ„ด ๋ถ„์„์„ ํ™œ์šฉํ•œ ํ†ตํ•ฉํ˜• ์‡ผํ•‘ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ณผ ๋งž์ถคํ˜• ์ƒํ’ˆ ์ถ”์ฒœ ์„œ๋น„์Šค

Notifications You must be signed in to change notification settings

tutti-tutti/tutti-client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์˜ค๋Š˜์˜ Tutti

๐ŸŽต ๋‹น์‹ ์˜ ์™„๋ฒฝํ•œ ์‡ผํ•‘์„ ์œ„ํ•ด ๋„์™€๋“œ๋ฆด๊ฒŒ์š”!

๋šœ๋ _ํ‘œ์ง€

ย 

๐Ÿ›๏ธ Service Overview

์‚ฌ์šฉ์ž ํŒจํ„ด ๋ถ„์„์„ ํ™œ์šฉํ•œ ํ†ตํ•ฉํ˜• ์‡ผํ•‘ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ณผ ๋งž์ถคํ˜• ์ƒํ’ˆ ์ถ”์ฒœ ์„œ๋น„์Šค

  • ํ•˜์ดํผ ๊ฐœ์ธํ™” (Hyper-personalization)๋œ ์‡ผํ•‘ ์„œ๋น„์Šค
    • AI์™€ CRM์„ ํ™œ์šฉํ•œ ์‚ฌ์šฉ์ž ๊ฐœ์ธ์„ ์œ„ํ•œ ๋งž์ถคํ˜• ๊ฒฝํ—˜
  • ์‚ฌ์šฉ์ž ๊ฐ์„ฑ ๋ถ„์„์„ ์ด์šฉํ•œ ๊นจ๋—ํ•œ ๋ฆฌ๋ทฐ ์ œ๊ณต
  • ๋ฐ˜์‘ํ˜• ๋Œ€์‘์œผ๋กœ ๋””๋ฐ”์ด์Šค ๋ณ„ ๋™์ผํ•œ ๊ฒฝํ—˜ ์ œ๊ณต
  • ์ƒํ’ˆ ๋ณ„ ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”

ย 

๐ŸŽต Tutti's FE Developers

ย 

๐Ÿš€ Project Setup Guide

  1. git clone ํ›„ pnpm ์„ค์น˜

  2. pnpm์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ ์„ค์น˜

    pnpm install
    
  3. lefthook ์„ค์น˜ ๋ฐ ์‹คํ–‰ (lint ๋ฐ prettier ๋™์ž‘)

    pnpm dlx lefthook install
    

ย 

๐Ÿ’ป Development Environment

  1. ํ•„์ˆ˜ ํ™•์ธ ์‚ฌํ•ญ

    Next.js: v15.2.3
    
    Node.js: v20.17.0 (Next.js 15๋Š” Node.js 20.x ์ด์ƒ์„ ๊ถŒ์žฅ)
    
    pnpm: v10.3.0 (v8.15.0 ์ด์ƒ์„ ๊ถŒ์žฅ)
    
  2. ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „

    tanstack query: v5.69.0
    
    zustand: v5.0.3
    
    tailwind: v4.0.9
    

ย 

๐Ÿ› ๏ธ Tech Stack & Why

๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ 
Next JS SSR, ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ, API ๋ผ์šฐํŠธ ๋“ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ SEO ํ–ฅ์ƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…, ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋“ฑ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜(DX)์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•ด์ค๋‹ˆ๋‹ค.
TypeScript ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ๊ณผ ํƒ€์ž… ์ถ”๋ก ์œผ๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋˜๋ฉฐ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
TailwindCSS ์ง๊ด€์ ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋กœ HTML ๋‚ด์—์„œ ๋ฐ”๋กœ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•ด ๋น ๋ฅธ UI ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์šฉ์ดํ•˜๊ณ  ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด ๋””์ž์ธ-๊ฐœ๋ฐœ ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.
Tanstack Query ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ์บ์‹ฑ, ๋™๊ธฐํ™”, ์—…๋ฐ์ดํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์—…๋ฐ์ดํŠธ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์„ ์–ธ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.
Axios ๋น„๋™๊ธฐ HTTP ์š”์ฒญ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‘๋‹ต ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ธํ„ฐ์…‰ํ„ฐ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„์–ด ์ธ์ฆ ํ† ํฐ์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๊ณตํ†ต์ ์ธ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
Zod ๋Ÿฐํƒ€์ž„์—์„œ ํƒ€์ž… ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด, ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. ํŠนํžˆ, ํผ ๊ฒ€์ฆ ๋ฐ API ์‘๋‹ต ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
Storybook ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์„ ์ด‰์ง„ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ํ™˜๊ฒฝ์—์„œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ ๋ฌธ์„œํ™”๋ฅผ ๋™์‹œ์— ์ง€์›ํ•˜์—ฌ ํŒ€ ํ˜‘์—…๊ณผ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
PNPM ์ค‘๋ณต ํŒจํ‚ค์ง€๋ฅผ ํ•˜๋“œ ๋งํฌ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ์„ค์น˜ ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋กœ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.
lefthook Git ํ›…์„ ํ†ตํ•œ ์ž๋™ํ™”๋œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ๋กœ ์ผ๊ด€๋œ ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ์ „ ๋ฆฐํŒ…, ํฌ๋งคํŒ…, ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ž๋™ํ™”ํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜๊ณ  CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.
zustand ๊ฐ„๊ฒฐํ•œ API์™€ ์ ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋กœ ์ง๊ด€์ ์ด๊ณ  ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Redux์™€ ๊ฐ™์€ ๊ธฐ์กด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๋ฉด์„œ TypeScript์™€์˜ ํ˜ธํ™˜์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ  ๋ฏธ๋“ค์›จ์–ด ์ง€์›์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

ย 

๐Ÿ“Œ Tutti's Convention

์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

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

ย 

โš™๏ธ CI/CD ํŒŒ์ดํ”„๋ผ์ธ

๐ŸŽจ ์Šคํ† ๋ฆฌ๋ถ CI/CD

  • ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค
    • ์Šคํ† ๋ฆฌ๋ถ ํŒŒ์ผ(.stories.ts, .stories.tsx)์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    • develop ๋ธŒ๋žœ์น˜๋กœ PR์ด ์ƒ์„ฑ๋˜๋ฉด ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
    • GitHub Actions๋ฅผ ํ†ตํ•ด Chromatic์— ์Šคํ† ๋ฆฌ๋ถ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
    • PR์— ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋œ ์Šคํ† ๋ฆฌ๋ถ ๋งํฌ๋ฅผ ๋Œ“๊ธ€๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ 
    • UI ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • PR ๋ฆฌ๋ทฐ ์‹œ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํŒ€์› ๊ฐ„ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ณต์œ ์— ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ CI/CD

  • ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค
    • 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

About

๐Ÿ›๏ธ์‚ฌ์šฉ์ž ํŒจํ„ด ๋ถ„์„์„ ํ™œ์šฉํ•œ ํ†ตํ•ฉํ˜• ์‡ผํ•‘ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ณผ ๋งž์ถคํ˜• ์ƒํ’ˆ ์ถ”์ฒœ ์„œ๋น„์Šค

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  
0