Skip to content
10_2pang edited this page Dec 13, 2022 · 10 revisions

๐Ÿ“ ๊ฐ€์ ธ๋„๋Œ•๋ƒฅ ์œ„ํ‚ค

1. ์„œ๋น„์Šค ์†Œ๊ฐœ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-12-08 แ„‹แ…ฉแ„’แ…ฎ 2 43 11

๊ฐ€์ ธ๋„๋Œ•๋ƒฅ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ ค๋™๋ฌผ์šฉํ’ˆ์„ ํŒ๋งคํ•˜๋Š” ์ค‘๊ณ  ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.
๊ฐ€์ ธ๋„๋Œ•๋ƒฅ์˜ ์‚ฌ์šฉ์ž๋Š” ์ค‘๊ณ  ๊ฑฐ๋ž˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ์†Œํ†ตํ•˜๊ธฐ, ๋‚ ์”จ์— ๋”ฐ๋ฅธ ๋ฐ˜๋ ค๊ฒฌ ์‚ฐ์ฑ… ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ, ๊ฐ€๊นŒ์šด ๋™๋ฌผ๋ณ‘์› ํ™•์ธํ•˜๊ธฐ ๋“ฑ ๋ฐ˜๋ ค๋™๋ฌผ ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2. ๊ฐœ๋ฐœ ๊ทœ์น™

2-1. Git-flow ์ „๋žต

  • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š์œผ๋ฏ€๋กœ 3์ข…๋ฅ˜์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • main : ์ œํ’ˆ์œผ๋กœ ์ถœ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜
    • develop : ๋‹ค์Œ ์ถœ์‹œ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
    • feature : ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
      • ๋ธŒ๋žœ์น˜๋ช… ๊ทœ์น™ : feat/#์ด์Šˆ๋ฒˆํ˜ธ
      • ์˜ˆ) feat/#1

2-2. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜

  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ํƒ€์ž…: ์ฃผ์ œ (#์ด์Šˆ๋ฒˆํ˜ธ)์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.
    • ์˜ˆ) add: ListView์— ๋น ์ง„ ๋ฌธ๊ตฌ ์ถ”๊ฐ€ (#2)
  • ํƒ€์ž…์˜ ์ข…๋ฅ˜
    • fix: ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๋™์ž‘์„ ๊ณ ์นœ ๊ฒฝ์šฐ
    • feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ
    • refactor: ๋‚ด๋ถ€ ๋กœ์ง์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•œ ๊ฒฝ์šฐ
    • style: ์ฝ”๋“œ ๊ฐœ์„ ๊ณผ ์ƒ๊ด€์—†์ด ์‚ฌ์†Œํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
    • design: ์‚ฌ์šฉ์ž UI๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ (๋งˆํฌ์—…, ํผ๋ธ”๋ฆฌ์‹ฑ ์ž‘์—…)
    • add: ํด๋”, ํŒŒ์ผ ๋“ฑ์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ
    • move: ํด๋”, ํŒŒ์ผ, ์ฝ”๋“œ ๋“ฑ์˜ ์œ„์น˜๋ฅผ ์ด๋™ํ•œ ๊ฒฝ์šฐ
    • rename: ํด๋”๋ช…, ํŒŒ์ผ๋ช… ๋“ฑ์„ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
    • remove: ํด๋”, ํŒŒ์ผ, ์ฝ”๋“œ ๋“ฑ์„ ์‚ญ์ œํ•œ ๊ฒฝ์šฐ
    • assets: ์—์…‹์„ ์ถ”๊ฐ€, ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
    • docs: ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
    • chore: ์œ„์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ธฐํƒ€ ์ˆ˜์ •์‚ฌํ•ญ
  • ํƒ€์ž…์€ ์ข…๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•˜๋ฉฐ, ์˜์–ด ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • ์ฃผ์ œ๋Š” ํ•œ๊ธ€๋กœ ๊ฐ„๋‹จ๋ช…๋ฃŒํ•˜๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค.
  • ์ฃผ์ œ์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ .(๋งˆ์นจํ‘œ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฃผ์ œ๋Š” '-๋‹ค', '-์Œ'๊ณผ ๊ฐ™์€ ์–ด๋ฏธ๋กœ ๋๋‚ด์ง€ ์•Š๊ณ , ๊ณผ๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์˜ˆ) feat: ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์—ฐ๋™ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค (#3), feat: ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์—ฐ๋™ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ (#3)
    • ์˜ณ์€ ์˜ˆ) feat: ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์—ฐ๋™ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (#3)
  • ์ฃผ์ œ๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ ๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    • ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์˜ˆ) design: CSS ์กฐ์ • (#4)
    • ์˜ณ์€ ์˜ˆ) design: text box์™€ layout frame ์‚ฌ์ด์— left padding ์ถ”๊ฐ€ (#4)
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ์ œ์‚ผ์ž๊ฐ€ ๋ดค์„ ๋•Œ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž์„ธํžˆ ์ž‘์„ฑํ•œ๋‹ค.
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ์–ด๋–ป๊ฒŒ ๋ณด๋‹จ ๋ฌด์—‡๊ณผ ์™œ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.
  • ํ•œ ์ปค๋ฐ‹์—๋Š” ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋งŒ ๋‹ด๋Š”๋‹ค.
    • ์˜ˆ) ํ™”๋ฉด ๊ฐœ๋ฐœ์˜ ๊ฒฝ์šฐ : ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์ปค๋ฐ‹
    • ์˜ˆ2) ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์˜ ๊ฒฝ์šฐ : ๊ฐ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ปค๋ฐ‹

2-3. ์ฝ”๋“œ ์ปจ๋ฒค์…˜

  • ๋“ค์—ฌ์“ฐ๊ธฐ(tab) 2์นธ ์‚ฌ์šฉํ•œ๋‹ค.
  • JavaScript ES6+ ๋ฌธ๋ฒ• ์‚ฌ์šฉํ•œ๋‹ค.
  • var ์‚ฌ์šฉ ๊ธˆ์ง€ํ•œ๋‹ค.
  • ์„ธ๋ฏธ์ฝœ๋ก  ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ž‘์€ ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉํ•œ๋‹ค.
  • for, if๋ฌธ์€ ๊ธธ์ด๊ฐ€ ์งง๋”๋ผ๋„ ์ค‘๊ด„ํ˜ธ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • CSS ์†์„ฑ ์„ ์–ธ ์ˆœ์„œ๋Š” ์šฐ์„  ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ , ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋‹จ๊ณ„์—์„œ ์ˆ˜์ •ํ•œ๋‹ค.
  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ๋Š” rafce ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ ๋‹ค.
  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ํ™•์žฅ์ž๋Š” jsx๋กœ ํ†ต์ผํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ์„ ์–ธ์‹œ์—๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•œ๋‹ค. (ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—๋Š” ์˜ˆ์™ธ)
  • prettier & ESlint ์‚ฌ์šฉํ•œ๋‹ค
  • ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋Š” ์งง์œผ๋ฉด ํ•œ์ค„, ๊ธธ๋ฉด ๊ฐœํ–‰์œผ๋กœ ์ค„๋ฐ”๊ฟˆ ๊ทœ์น™์„ ์ •ํ•œ๋‹ค.
  • import ... from ๊ตฌ๋ฌธ์€ ํฐ ๋ถ„๋ฅ˜๋งŒ ์‹ ๊ฒฝ์“ฐ๊ณ  ๋ถ„๋ฅ˜ ์•ˆ์—์„œ ์ž์œ ๋กœ์šด ์ˆœ์„œ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

2-4. ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

2-4-1. ํด๋”๋ช…

  • camelCase : ์ง์ ‘์ ์œผ๋กœ ๋ฐ”๋กœ React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š์€ ๊ฐ„์ ‘์ ์ธ ๊ด€๊ณ„์˜ ํด๋”
  • PascalCase : React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ”๋กœ ๋“ค์–ด ์žˆ๋Š” ํด๋”

2-4-2. ํŒŒ์ผ๋ช…

  • React ์ปดํฌ๋„ŒํŠธ : PascalCase
    • ํŽ˜์ด์ง€๋ช…์€ __page๋กœ ์ž‘์„ฑ (์˜ˆ : HomePage.jsx, LoginPage.jsx)
    • ๋„ค์ด๋ฐ์€ ์ข…๋ฅ˜ - ์—ญํ•  - ์ปดํฌ๋„ŒํŠธ ์ˆœ์œผ๋กœ (์˜ˆ : LoginSubmitButton.jsx)
  • ์ด๋ฏธ์ง€ํŒŒ์ผ : kebab-case
    • ๋„ค์ด๋ฐ์€ ์ด๋ฏธ์ง€๋ช…-image๋กœ (์˜ˆ : logo-image.png, happy-lion-imgae.png)
  • jsx : PascalCase
  • js : camelCase
  • ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ : ~~Style.jsx๋กœ ํ‘œํ˜„

2-4-3. ๋ณ€์ˆ˜๋ช…

  • ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜, ํ•จ์ˆ˜ : camelCase
    • ๋ณ€์ˆ˜ : '๋ช…์‚ฌํ˜•'์œผ๋กœ ์ž‘์„ฑ. ๋ฌด์—‡์„ ๋‹ด๊ณ ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํ‘œํ˜„ (์˜ˆ : numberOfPeople)
    • ๋ถˆ๋ฆฐํ˜• ๋ณ€์ˆ˜ : is๋กœ ์‹œ์ž‘ (์˜ˆ : isOpen)
    • ํ•จ์ˆ˜ : '๋™์‚ฌํ˜•'์œผ๋กœ ์ž‘์„ฑ. ๋ฌด์—‡์„ ํ•˜๋Š” ํ•จ์ˆ˜์ธ์ง€ ์ •ํ™•ํžˆ ํ‘œํ˜„
      • ์–ด๋–ค ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋Š” get์œผ๋กœ ์‹œ์ž‘ (์˜ˆ : getinputValue)
  • ์ปค์Šคํ…€ ํ›… : use๋กœ ์‹œ์ž‘ (์˜ˆ : uesGetWindowsSize)
  • ์ด๋ฒคํŠธ ํ•จ์ˆ˜ props ( on_ ) + ๋„ค์ด๋ฐ + handler ์œผ๋กœ ์ง“๊ธฐ (์•„๋ž˜ ์˜ˆ์‹œ ์ฐธ์กฐ)
import { MouseEvent as ReactMouseEvent, useCallback, useState } from 'react'

function FunctionComponent() {
  const [searchTerm, setSearchTerm] = useState('')

  // ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜
  const onClickSearchButtonHandler = useCallback(e) => { ... })

  const onChangeSearchTermHandler = useCallback(e => { ... }) 

  // ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ prop
  return (
    <>
      <SearchInput onChange={onClickSearchButtonHandler} />
      <SearchButton onClick={onChangeSearchTermHandler} />
    </>
  )
}

export default FunctionComponent
  • ์ƒ์ˆ˜ : UPPER_SNAKE_CASE
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜, ํด๋ž˜์Šค : PascalCase

2-5. ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์ปจ๋ฒค์…˜

src
  ใ„ด assets
    ใ„ด images
    ใ„ด fonts
  ใ„ด components
    ใ„ด Header
      ใ„ด Header.jsx
    ใ„ด Button
      ใ„ด Button.jsx
  ใ„ด pages
    ใ„ด HomePage
      ใ„ด HomePage.jsx

2-5-1. assets

  • ๋ง ๊ทธ๋Œ€๋กœ ์ž์‚ฐ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€, ๋น„๋””์˜ค, ํฐํŠธ ๋“ฑ ๋ฏธ๋””์–ด ํŒŒ์ผ๋“ค์„ ๋ชจ์•„ ์ €์žฅํ•˜๋Š” ๊ณณ

2-5-2. components

  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ (Header, Footer, Nav ๋“ฑ)

2-5-3. assets

  • ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ ํด๋”๋กœ ๊ตฌ์„ฑ

๐Ÿ’ก components vs pages

  • ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๋™์‹œ์— ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ components ํด๋”์—์„œ ๊ด€๋ฆฌ
  • ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ pages ํด๋”์—์„œ ๊ด€๋ฆฌ
  • ํ•ด๋‹น ํŽ˜์ด์ง€ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํŽ˜์ด์ง€ ํด๋” ํ•˜์œ„์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ!