Skip to content

πŸ’› 🍰 λ§›μžˆλŠ” 것을 λ§Œλ“œλŠ” 것은 μƒκ°λ§Œ 해도 μž¬λ°Œμž–μ•„μš” 🍰 πŸ’›

Notifications You must be signed in to change notification settings

SOPT-all/35-APPJAM-WEB-CAKEY

Repository files navigation

WHIPEE πŸŽ‚

μ›ν•˜λŠ” μ£Όλ¬Έμ œμž‘ 케이크λ₯Ό 쉽고 λΉ λ₯΄κ²Œ!



πŸ₯„ WHIPEE!

🍰 νœ˜ν”Ό(WHIPEE)λŠ” μ£Όλ¬Έμ œμž‘ 케이크에 λŒ€ν•œ 정보λ₯Ό ν•œ λˆˆμ— λͺ¨μ•„보고 비ꡐ할 수 μžˆλŠ” μ„œλΉ„μŠ€ μž…λ‹ˆλ‹€ πŸŽ‚


πŸ₯¨ μ„œλΉ„μŠ€ μ†Œκ°œ



πŸ”¨ μ„œλΉ„μŠ€ μ£Όμš” κΈ°λŠ₯



πŸ‘©πŸ»β€πŸ³ WHIPEE νŒŒν‹°μ‹œμ—

νŒ€μ› πŸ‘» μž„ν™”λž‘
🐱 μ†μ§€μœ 
πŸ₯¨ 박채연
πŸ€ μœ μ„œμ—°
νŒ€μ› μ†Œκ°œ
μ—­ν• 

WEB FRONTEND, LEAD

WEB FRONTEND

WEB FRONTEND

WEB FRONTEND



🍴 기술 μŠ€νƒ

Node.js Badge Node.js Version Badge

μ—­ν•  μ’…λ₯˜
Library React VITE
Programming Language TypeScript
Styling Vanilla Extract Badge
Data Fetching Axios TanStack Query Badge
Formatting ESLint Prettier
Package Manager Yarn
Version Control Git GitHub
Test Storybook Badge
Deploy Vercel Badge

πŸ§‚ 라이브러리

라이브러리 버전 λ„μž…μ΄μœ 
React Badge ^18.3.1 μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ 기반 μ•„ν‚€ν…μ²˜μ™€ 가상 DOM을 ν™œμš©ν•œ μ„±λŠ₯ μ΅œμ ν™”λ‘œ 효율적이고 ν™•μž₯μ„± μžˆλŠ” UI 개발이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
TypeScript Badge ~5.6.2 정적 νƒ€μž… 검사λ₯Ό 톡해 μ½”λ“œ μ•ˆμ •μ„±μ„ 높이고, κ°•λ ₯ν•œ IDE μ§€μ›μœΌλ‘œ 개발 생산성을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
Vanilla Extract Badge ^1.17.0 정적 νƒ€μž… 기반 CSS-in-JS둜 μœ μ§€λ³΄μˆ˜μ„±κ³Ό μ„±λŠ₯을 λͺ¨λ‘ κ³ λ €ν•œ μŠ€νƒ€μΌ 관리가 κ°€λŠ₯ν•©λ‹ˆλ‹€.
Storybook Badge ^8.4.7 UI μ»΄ν¬λ„ŒνŠΈλ₯Ό λ…λ¦½μ μœΌλ‘œ κ°œλ°œν•˜κ³  ν…ŒμŠ€νŠΈν•˜λ©°, λ¬Έμ„œν™”λ₯Ό 톡해 ν˜‘μ—…μ„ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
TanStack Query Badge ^5.62.16 λ³΅μž‘ν•œ 비동기 μƒνƒœ 관리λ₯Ό κ°„μ†Œν™”ν•˜κ³ , μ„œλ²„ μƒνƒœλ₯Ό 효율적으둜 λ™κΈ°ν™”ν•˜μ—¬ 데이터 페칭과 캐싱을 μ΅œμ ν™”ν•©λ‹ˆλ‹€.


πŸ—‚οΈ ν”„λ‘œμ νŠΈ 폴더 ꡬ쑰

|-- πŸ“ node_modules
|-- πŸ“ public
    |-- πŸ“ svg
    |-- πŸ“ data
        |-- userData.json
|-- πŸ“ src
    |-- πŸ“ assets
        |-- πŸ“ svgs
        |-- πŸ“ images
    |-- πŸ“ components
        |-- πŸ“ common 
            |-- πŸ“ Button 
                |-- Button.tsx
                |-- Button.css.ts
            |-- index.ts 
    |-- πŸ“ pages
        |-- πŸ“onboarding
            |-- πŸ“components
            |-- πŸ“types
            |-- πŸ“hooks
            |-- πŸ“page
                |-- πŸ“OnboardingPage
                |-- OnboardingPage.tsx
                |-- OnboardingPage.css.ts
    |-- πŸ“ hooks
    |-- πŸ“ stories
        |-- πŸ“ Button.stories.ts
    |-- πŸ“ styles
    |-- πŸ“ utils 
    |-- πŸ“ constants
        |-- routePath.ts
    |-- πŸ“ apis
        |-- πŸ“ domains
        |-- πŸ“ queryKeys
    |-- πŸ“ types
    |-- πŸ“ routes
        |-- homeRoutes.tsx
        |-- adminRoutes.tsx
        |-- index.ts
|-- App.tsx
|-- main.tsx
|-- .eslintrc.json
|-- .gitignore
|-- .prettierrc
|-- README.md
|-- package.json
|-- tsconfig.json
|-- yarn.lock

πŸ“ μ»¨λ²€μ…˜

1️⃣ Coding

λ³€μˆ˜

  • var κΈˆμ§€.
  • const β†’ let μˆœμ„œλ‘œ μœ„λΆ€ν„° μ„ μ–Έ.
  • λ³€μˆ˜λ₯Ό μ‘°ν•©ν•˜μ—¬ λ¬Έμžμ—΄ μƒμ„±μ‹œ β€œ+ β€œ κΈˆμ§€. β†’ λ¦¬ν„°λŸ΄ μ‚¬μš©(λ°±ν‹± ```)
  • μƒμˆ˜λŠ” 영문 λŒ€λ¬Έμž μŠ€λ„€μ΄ν¬μΌ€μ΄μŠ€ : API_KEY
  • λ³€μˆ˜λͺ… : 의미λ₯Ό ν™•μ‹€νžˆ λ‚˜νƒ€λ‚Ό 수 μžˆλ„λ‘
    • μ˜ˆμ‹œ : 배열에 Arr λ³΄λ‹€λŠ” λ³€μˆ˜s = fruits, userlists λ“±λ“±
  • μ€„μž„λ§ 쓰지말기. 이름이 길어지더라도 μ–΄λ–€ λ³€μˆ˜μΈμ§€ μ •ν™•ν•˜κ²Œ
  • λ§Œμ•½ λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” 값이 boolean인 κ²½μš°μ—λŠ” isλ₯Ό μ ‘λ‘μ‚¬λ‘œ 뢙인닀.
    • isActive 같이 is ν‚€μ›Œλ“œλŠ” booleanμ—λ§Œ 적용
  • map μ‚¬μš©μ‹œ λ³€λ™λ˜λŠ” 리슀트라면 key값을 κ³ μœ ν•˜κ²Œ 잘 μ„€μ •ν•΄μ£ΌκΈ° indexμ‚¬μš©κΈˆμ§€
    • μ„œλ²„μ—μ„œ λ‚΄λ €μ£ΌλŠ” idκ°’ or uuid μ‚¬μš©

ν•¨μˆ˜

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜. function ν‚€μ›Œλ“œ 쓰지말기
  • ν•¨μˆ˜λͺ… : μ–΄λ–€ 일을 ν•˜λŠ”μ§€ λͺ…ν™•νžˆ λ¬˜μ‚¬. 동사+λͺ…μ‚¬μ˜ ν˜•μ‹.
    • get : μ–΄λ–€ 값을 μ–»λŠ” ν•¨μˆ˜
    • create : κ°–κ³  μžˆλŠ” λ³€μˆ˜λ₯Ό ν™œμš©, μƒˆλ‘œμš΄ κ°’κ³Ό λ³€μˆ˜λ₯Ό λ§Œλ“¦
    • check : ν•¨μˆ˜ μ•ˆμ˜ λ‘œμ§μ„ 확인.
    • κ·Έμ™Έ, κΈ°λŠ₯을 λΆ„λͺ…ν•˜κ²Œ λ“œλŸ¬λ‚΄λ„λ‘ 넀이밍
  • 이벀트 핸듀링 ν•¨μˆ˜λŠ” handle 둜 μ‹œμž‘. κ·Έ μ™Έμ—λŠ” κΈˆμ§€.
    • μ˜ˆμ‹œ: handleResetClick, handleSubmitClick
  • μœ ν‹Έν•¨μˆ˜λŠ” λ°˜ν™˜κ°’μ„ κΈ°μ€€μœΌλ‘œ 이름 넀이밍
    • booleanκ°’ λ°˜ν™˜μ‹œ hasβ€”- ex) hasEmail = email이 μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
  • μ€‘λ³΅ν•¨μˆ˜λŠ” utils 폴더에 λͺ¨μ•„μ„œ μž¬μ‚¬μš©ν•œλ‹€.

μ»΄ν¬λ„ŒνŠΈ

  • rafce

  • λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈλ§Œ PascalCase μ‚¬μš© : PascalCase

    • κ·Έ μ™Έμ—λŠ” camelCase ex) type, d.ts파일, ts파일
  • νƒ€μž… Interface μ„ μ–Έμ‹œ

    • μ»΄ν¬λ„ŒνŠΈμ˜ 인자 : ~Props (ex. HomeProps, AdminProps)
      • μ΄λ•Œμ˜ InterfaceλŠ” type ν΄λ”λ‘œ 뢄리 κΈˆμ§€
    • ex) MainComponent interface μ„ μ–Έμ‹œ = MainProps
  • propsλͺ…은 camelCase λŒ€λ¬Έμžμ‹œ 문제 생김

  • μ˜λ―Έμ—†λŠ” div λ˜λŠ” μ»΄ν¬λ„ŒνŠΈ μ΅œμƒλ‹¨μ€ fragment μ‚¬μš©ν•˜κΈ°

    const InfoText = () => {
      return (
        <>
          <h1>Welcome!</h1>
          <p>This our new page, we're glad you're are here!</p>
        </>
      );
    };
  • children이 λΆˆν•„μš”ν•  땐 selfClosingμ‚¬μš©ν•˜κΈ° <Component />


폴더λͺ…

  • 무쑰건 μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•˜κΈ°!
  • 뒀에 s뢙이기
  • μΉ΄λ©œμΌ€μ΄μŠ€!

νƒ€μž…

  • object β†’ interface
  • λ‹¨μΌλ³€μˆ˜ β†’ type
  • μ»΄ν¬λ„ŒνŠΈ μΈμžμ— λŒ€ν•œ νƒ€μž…μ€ μ»΄ν¬λ„ŒνŠΈ 상단에
  • κ·Έ μ™Έμ˜ νƒ€μž…λ“€μ€ types 폴더에(μ»΄ν¬λ„ŒνŠΈ μΈμžμ— λ°°μ—΄or객체 등이 μžˆλ‹€λ©΄ 이 νƒ€μž…λ„ types ν΄λ”λ‘œ)
  • prop의 νƒ€μž…λͺ…은 OOOProps
  • api response νƒ€μž…λͺ…은 OOOResponseTypes

λ©”μ†Œλ“œ

  • λ°°μ—΄ λ³΅μ‚¬μ‹œ β†’ μŠ€ν”„λ ˆλ“œ μ—°μ‚°μž(…) μ‚¬μš©

    • const copys = […originals]
  • for 보단, forEach/map을 μ‚¬μš©

  • ꡬ쑰 λΆ„ν•΄ 할당을 적극 이용

    interface userDataProps {
      userName: string;
      userBirth: string;
    }
    
    function checkIsUser({ userName, userBirth }: userDataProps) {}
  • λΆˆν•„μš”ν•œ 반볡문 지양 : filter, array.include() λ“±

    • μ‘°κ±΄λΆ€λ‘œ 데이터λ₯Ό ν™•μΈν•˜κ±°λ‚˜ λ½‘μ•„μ•Όν•˜λŠ” λ‘œμ§μ„ μ‚¬μš©ν•  λ•Œμ—λŠ” Map μ΄λ‚˜ Object처럼 key값을 μ΄μš©ν•΄μ„œ μ›μ†Œλ₯Ό μ°ΎλŠ” μžλ£Œν˜•μ„ μ΄μš©ν•˜λŠ”κ²ƒμ„ κ³ λ €ν•΄λ³΄κ±°λ‚˜, 배열을 μˆœνšŒν•˜μ§€ μ•Šκ³  index둜 λ°”λ‘œ μ ‘κ·Όν•  수 μžˆλŠ” 방법이 μ—†λŠ”μ§€ κ³ λ €.

2️⃣ Git & Github

Git Flow

  • main: μ œν’ˆμ„ λ°°ν¬ν•˜λŠ” 브랜치
  • develop: 개발 브랜치둜 κ°œλ°œμžλ“€μ΄ 이 브랜치λ₯Ό κΈ°μ€€μœΌλ‘œ 각자 μž‘μ—…ν•œ κΈ°λŠ₯듀을 Merge
    • develop 브랜치λ₯Ό κΈ°μ€€μœΌλ‘œ feature 브랜치λ₯Ό λΆ„κΈ°ν•˜κ³ , 각 feature 브랜치λ₯Ό ν•©μΉ¨
    • develop λΈŒλžœμΉ˜μ—μ„œ main 브랜치둜 병합
  • feature: κΈ°λŠ₯을 κ°œλ°œν•˜λŠ” 브랜치둜 κΈ°λŠ₯ 개발이 μ™„λ£Œλ˜λ©΄ develop λΈŒλžœμΉ˜μ— Merge
    • λ°˜λ“œμ‹œ develop μ—μ„œ λΆ„κΈ°ν•΄μ•Ό 됨. λΆ„κΈ° 된 λ‹€λ₯Έ feature λΈŒλžœμΉ˜μ—μ„œ 또 λ‹€λ₯Έ feature 브랜치λ₯Ό λΆ„κΈ°ν•˜λ©΄ μ ˆλŒ€ μ•ˆλ¨.

ν˜„ ν”„λ‘œμ νŠΈμ—μ„œλŠ” release, hotfix λΈŒλžœμΉ˜λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠμŒ.


브랜치 생성

κΈ°λŠ₯ κ΅¬ν˜„ μ „ μžμ‹ μ΄ κ΅¬ν˜„ν•  뢀뢄을 이슈둜 관리

  1. μ΄μŠˆν…œν”Œλ¦Ώ 을 ν™œμš©ν•˜μ—¬ 이슈 생성
  2. 1μ—μ„œ μƒμ„±λœ 이슈 번호λ₯Ό μ΄μš©ν•˜μ—¬ 브랜치 생성.
    1. 브랜치 이름은 feat/#<issued number>/example ex) feat/#18/common-button

μž‘μ—…

λͺ¨λ“  μž‘μ—…μ€ develop μ—μ„œ λΆ„κΈ°λœ feature λΈŒλžœμΉ˜μ—μ„œ 진행

  • 컀밋 λ©”μ‹œμ§€λŠ” μ»€λ°‹μœ ν˜•: <κ΅¬ν˜„, μˆ˜μ •, κ°œλ°œν•œ λ‚΄μš©μ— λŒ€ν•œ 컀밋 λ©”μ‹œμ§€> (#<issued number>) ex) feat: Button 곡톡 μ»΄ν¬λ„ŒνŠΈ μ œμž‘ (#18)
    μ»€λ°‹μœ ν˜• 의미
    feat μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
    fix 버그 μˆ˜μ •
    docs λ¬Έμ„œ μˆ˜μ •
    style μ½”λ“œ formatting, μ„Έλ―Έμ½œλ‘  λˆ„λ½, μ½”λ“œ 자체의 변경이 μ—†λŠ” 경우
    refactor μ½”λ“œ λ¦¬νŒ©ν† λ§
    test ν…ŒμŠ€νŠΈ μ½”λ“œ, λ¦¬νŒ©ν† λ§ ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
    chore νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € μˆ˜μ •, κ·Έ μ™Έ 기타 μˆ˜μ • ex) .gitignore
    design CSS λ“± μ‚¬μš©μž UI λ””μžμΈ λ³€κ²½
    comment ν•„μš”ν•œ 주석 μΆ”κ°€ 및 λ³€κ²½
    deploy 배포 κ΄€λ ¨
    setting 개발 ν™˜κ²½ μ„ΈνŒ…

브랜치 병합

feature λΈŒλžœμΉ˜μ—μ„œ develop 브랜치둜 mergeν•  λ•ŒλŠ” PR을 μ΄μš©ν•¨ (직접 merge ❌)

  1. develop, feature 브랜치 μ΅œμ‹ ν™”

  2. develop β†’ feature merge ν•˜κ³  좩돌 처리

    • feature 브랜치둜 checkout ν•΄μ„œ git merge develop
  3. PRν…œν”Œλ¦Ώ 을 ν™œμš©ν•˜μ—¬ PR μž‘μ„±

    • PR μž‘μ„±μ‹œ 이슈번호 μ œλŒ€λ‘œ κΈ°μž…ν•΄μ•Ό μ΄μŠˆκ°€ ν•¨κ»˜ λ‹«νž˜(ν…œν”Œλ¦ΏλŒ€λ‘œ ν•˜λ©΄ 됨)
    • νŒ€μ›λ“€μ˜ review & approve(2λͺ…) ν›„ μŠ€μΏΌμ‹œ 머지

    주의⚠️ - review & approve κ³Όμ •μ—μ„œ λ‹€λ₯Έ PR 머지 λ“± develop에 μˆ˜μ •μ‚¬ν•­μ΄ 생겼닀면, 2λ²ˆκ³Όμ •μ„ λ‹€μ‹œ ν•΄μ€˜μ•Ό 함.

  4. μ •μƒμ μœΌλ‘œ 머지 λ˜μ—ˆλ‹€λ©΄ feature 브랜치 μ‚­μ œ



πŸ“– WHIPEE νŒŒν‹°μ‹œμ—λ“€μ˜ 아티클 λͺ¨μŒ

πŸ‘» μž„ν™”λž‘: Compound Component Pattern
🐱 μ†μ§€μœ : μ΄ˆκΈ°μ„ΈνŒ… μ •λ³΅ν•˜κΈ° (prettier, eslint, theme, GlobalStyle)
πŸ₯¨ 박채연: Errorboundary
πŸ€ μœ μ„œμ—°: TanStack Query




About

πŸ’› 🍰 λ§›μžˆλŠ” 것을 λ§Œλ“œλŠ” 것은 μƒκ°λ§Œ 해도 μž¬λ°Œμž–μ•„μš” 🍰 πŸ’›

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •