์ฃผ๋ฌธ์ ์ ์ผ์ดํฌ, ๋น๊ต๋ ๋ฌ์ฝคํ๊ฒ ํ์ ์! ๐
์ผ์ดํค Cakey๋ ์ฃผ๋ฌธ์ ์ ์ผ์ดํฌ์ ๋ํ ์ ๋ณด๋ฅผ ํ ๋์ ๋ชจ์๋ณด๊ณ ๋น๊ตํ ์ ์๋ ์๋น์ค ์ ๋๋ค ๐
- ์ ๋ณด์ ๋ถ์ฐ์ผ๋ก ์ฌ๋ฌ SNS(์ธ์คํ๊ทธ๋จ, ์นด์นด์คํก)๋ ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐฉ๋ฌธํด์ผ ํ๋ฉฐ, ์
์ฒด๋ณ๋ก ๊ฐ๊ฒฉ, ์คํ์ผ, ์ต์
์ ํ์ธํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํ๊ฒ ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด์์.
- ํฉ์ด์ ธ ์๋
๋์์ธ/๊ฐ๊ฒฉ ๋ฑ์ ๋ํ ์ ๋ณด
๋ฅผ ํ๋์ ์๋น์ค๋ก ๋ชจ์์. ํํฐ๋ง ๊ธฐ๋ฅ
์ ํตํด ์ฌ์ฉ์์ ์ ๋ณด ๋น๊ต๋ฅผ ์ฉ์ดํ๊ฒ ํด์.์ฐ ๊ธฐ๋ฅ
์ ํตํด ๋ง์์ ๋๋ ์คํ ์ด ๋ฐ ๋์์ธ์ ์ ์ฅํ ์ ์์ด์.
- ํฉ์ด์ ธ ์๋
- ํ๋๋ฅผ ๊ฒ์ํ๋ฉด ํฉ์ ์คํ ์ด๊ฐ ๋์ค๋ ๊ฒ๊ณผ ๊ฐ์ ๊ด๋ฒ์ํ ์์น ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด์์.
ํ ๊ธฐ๋ฅ
์ ํตํด ๋ชฉ์ ์ง ๋ฐ ์ฝ์์ฅ์๋ฅผ ์ ๋ ฅํ๋ฉด ์ฃผ์์ ์คํ ์ด๋ค์ ์ ์ ์์ด์.
- ์ธ๊ธฐ ์คํ ์ด๋ง ์ ํ์ ์ผ๋ก ๋จ๋ ์ธ์คํ ๊ฒ์์ฐฝ์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด์์.
- ์ง์ญ์ผ๋ก ๊ฒ์ ์ (ex. ํ๋์ ๊ตฌ์ญ)
ํ์ | ๐ ์ ์์ฐ |
๐ฑ ์์ง์ |
๐ป ์ํ๋ |
๐ฅจ ๋ฐ์ฑ์ฐ |
---|---|---|---|---|
ํ์ ์๊ฐ | ||||
์ญํ |
WEB FRONTEND |
WEB FRONTEND |
WEB FRONTEND |
WEB FRONTEND |
์ญํ | ์ข ๋ฅ |
---|---|
Library | |
Programming Language | |
Styling | |
Data Fetching | |
Formatting | |
Package Manager | |
Version Control | |
Test | |
Deploy |
|-- ๐ 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
- main: ์ ํ์ ๋ฐฐํฌํ๋ ๋ธ๋์น
- develop: ๊ฐ๋ฐ ๋ธ๋์น๋ก ๊ฐ๋ฐ์๋ค์ด ์ด ๋ธ๋์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ์์
ํ ๊ธฐ๋ฅ๋ค์ Merge
develop
๋ธ๋์น๋ฅผ ๊ธฐ์ค์ผ๋กfeature
๋ธ๋์น๋ฅผ ๋ถ๊ธฐํ๊ณ , ๊ฐfeature
๋ธ๋์น๋ฅผ ํฉ์นจdevelop
๋ธ๋์น์์main
๋ธ๋์น๋ก ๋ณํฉ
- feature: ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๋ธ๋์น๋ก ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ์๋ฃ๋๋ฉด
develop
๋ธ๋์น์ Merge- ๋ฐ๋์
develop
์์ ๋ถ๊ธฐํด์ผ ๋จ. ๋ถ๊ธฐ ๋ ๋ค๋ฅธfeature
๋ธ๋์น์์ ๋ ๋ค๋ฅธfeature
๋ธ๋์น๋ฅผ ๋ถ๊ธฐํ๋ฉด ์ ๋ ์๋จ.
- ๋ฐ๋์
ํ ํ๋ก์ ํธ์์๋ release, hotfix ๋ธ๋์น๋ ์ฌ์ฉํ์ง ์์.
๊ธฐ๋ฅ ๊ตฌํ ์ ์์ ์ด ๊ตฌํํ ๋ถ๋ถ์ ์ด์๋ก ๊ด๋ฆฌ
์ด์ํ ํ๋ฆฟ
์ ํ์ฉํ์ฌ ์ด์ ์์ฑ- 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 โ)
-
develop, feature ๋ธ๋์น ์ต์ ํ
-
develop โ feature merge ํ๊ณ ์ถฉ๋ ์ฒ๋ฆฌ
- feature ๋ธ๋์น๋ก checkout ํด์
git merge develop
- feature ๋ธ๋์น๋ก checkout ํด์
-
PRํ ํ๋ฆฟ
์ ํ์ฉํ์ฌ PR ์์ฑ- PR ์์ฑ์ ์ด์๋ฒํธ ์ ๋๋ก ๊ธฐ์ ํด์ผ ์ด์๊ฐ ํจ๊ป ๋ซํ(ํ ํ๋ฆฟ๋๋ก ํ๋ฉด ๋จ)
- ํ์๋ค์ review & approve(2๋ช ) ํ ์ค์ฟผ์ ๋จธ์ง
์ฃผ์
โ ๏ธ - review & approve ๊ณผ์ ์์ ๋ค๋ฅธ PR ๋จธ์ง ๋ฑ develop์ ์์ ์ฌํญ์ด ์๊ฒผ๋ค๋ฉด, 2๋ฒ๊ณผ์ ์ ๋ค์ ํด์ค์ผ ํจ. -
์ ์์ ์ผ๋ก ๋จธ์ง ๋์๋ค๋ฉด feature ๋ธ๋์น ์ญ์