Skip to content

๐Ÿ’ป ๋ง›์ง‘์ผ๊ธฐ YUMYUM ๋ชจ๋ฐ”์ผ์›น

Notifications You must be signed in to change notification settings

SaltCastle77/YumYum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆํŒ€์› ์†Œ๊ฐœ (R&R)

image-20210214173817990

image-20210214215803089 ์ •์ค€ํ˜„

  • PM(Project Manager)
    • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋“œ
    • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฑ…์ž„
  • ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž
    • ๋ฐฑ์—”๋“œ ํŒŒํŠธ ๊ตฌํ˜„
    • ๋ฐฑ์—”๋“œ ์ฝ”๋“œ ์ทจํ•ฉ
    • ์„œ๋ฒ„ ๊ด€๋ฆฌ
  • README

image-20210214220255220 ๊น€์žฌ์œ 

  • ํ”„๋ก ํŠธ์—”๋“œ PL(Proejct Leader)

    • ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ ๋ฅผ ๋ฆฌ๋“œํ•˜๊ณ  ๋ฐฑ์—”๋“œ์™€์˜ ํ˜‘์—…์„ ์œ„ํ•œ ์†Œํ†ต์„ ๋‹ด๋‹น
    • ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ์˜ ์—…๋ฌด ์กฐ์œจ
  • ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž

    • ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ ๊ตฌํ˜„
    • UI/UX ๊ณ ์•ˆ ํ›„ ๊ตฌํ˜„
  • README

image-20210214220127535 ๊ธธ์•„ํ˜„

  • CTO (Chief Technology Officer)
    • API, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž… ๋“ฑ์„ ๊ฒฐ์ •
    • ์ƒˆ๋กญ๊ฒŒ ๋„์ž…๋œ ์ •๋ณด์™€ ์ง€์‹์„ ๋‹ค๋ฅธ ํŒ€์›๋“ค์—๊ฒŒ ์ „ํŒŒ
  • ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž
    • ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ ๊ตฌํ˜„
    • UI/UX ๊ณ ์•ˆ ํ›„ ๊ตฌํ˜„
  • README

image-20210214220501394 ์—ผ์„ฑํ›ˆ

  • ๋งˆ์Šค์ฝ”ํŠธ
    • YUM? YUM! ์ฟผ์นด ์ด๋ฏธ์ง€ ๋ชจํ‹ฐ๋ธŒ ์ œ๊ณต
  • ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž
    • ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ ๊ตฌํ˜„
    • ์™ธ๋ถ€ API(์นด์นด์˜ค์ง€๋„)
    • UI/UX ๊ณ ์•ˆ ํ›„ ๊ตฌํ˜„
  • README

image-20210214220202651 ์ด์ˆ˜๋ฏผ

  • ๋ฐฑ์—”๋“œ PL(Proejct Leader)

    • ๋ฐฑ์—”๋“œ ํŒŒํŠธ๋ฅผ ๋ฆฌ๋“œํ•˜๊ณ  ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ํ˜‘์—…์„ ์œ„ํ•œ ์†Œํ†ต์„ ๋‹ด๋‹น
    • ๋ฐฑ์—”๋“œ ํŒŒํŠธ์˜ ์—…๋ฌด ์กฐ์œจ
  • ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

    • ๋ฐฑ์—”๋“œ ํŒŒํŠธ ๊ตฌํ˜„
    • DB ์Šคํ‚ค๋งˆ ์„ค๊ณ„
  • README

โœจ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

Sub-PJT 1 (21.01.11 ~ 21.01.15 <์ด 1์ฃผ>)

  • ๋ชฉํ‘œ : ์ฐจ์ฃผ ํŒ€ํ”„๋กœ์ ํŠธ ์ค€๋น„(๊ธฐํš, ํ”„๋กœ์ ํŠธ ๊ทœ์น™ ๋“ฑ)

    ์ž์„ธํžˆ
    - ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋„๊ตฌ ์—ฐ์Šต. Gitlab, Jira ๋“ฑ
    - ๊ฐœ์ธํ”„๋กœ์ ํŠธ์ด์ง€๋งŒ ํŒ€์œผ๋กœ ๋Œ€์‘!! (์ด์Šˆ ๋ฐœ์ƒ ์‹œ ํŒ€์› ๊ณต์œ )
    - ํŒ€ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•
    - React์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ํ•™์Šต(๊ฐœ์š” ์ˆ˜์ค€!)

Sub-PJT 2 (21.01.18 ~ 21.01.29 <์ด 2์ฃผ>)

  • ๋ชฉํ‘œ : ๋ณธ๊ฒฉ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰

    ์ž์„ธํžˆ
    - ๊ฐ™์€ ํŒŒํŠธ ๋‚ด์˜ ์‚ฌ๋žŒ๋“ค๊ณผ ์›ํ™œํ•œ ํ˜‘์—…๊ณผ ์†Œํ†ต
    - ๊ฐ ํŒŒํŠธ๋ณ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ˆ™๋ จ๋„ ์ƒ์Šน
    - ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„ REST API ํ†ต์‹ ์— ๋Œ€ํ•œ ์ดํ•ด
    - ๊ตฌํ˜„ ์„œ๋น„์Šค์™€ ๋งž๋Š” ์™€์ด์–ดํ”„๋ ˆ์ž„, ๋ชฉ์—…, DB ์Šคํ‚ค๋งˆ ์ •์˜

Sub-PJT 3 (21.02.01 ~ 21.02.19 <์ด 3์ฃผ>)

  • ๋ชฉํ‘œ : ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฐํฌ ์ฃผ์š”๊ธฐ๋Šฅ ์™„์„ฑ

    ์ž์„ธํžˆ
    - ๋ฉ”์ธ์˜์ƒํ”ผ๋“œ, ์ง€๋„, ์œ ๋ ˆ์นด ๊ธฐ๋Šฅ ์™„์„ฑ
    - ์Šค๋งˆํŠธํฐ ํ•ด์ƒ๋„์— ๋งž๊ฒŒ CSS ๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ตฌํ˜„
    - ์‹ค์ œ๋ฐ์ดํ„ฐ๋กœ ๊ธฐ๋Šฅ์ด ์ •ํ™•์ด ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
    - UCC์ œ์ž‘ ๋ฐ README.md ์ž‘์„ฑ

๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ํ˜‘์—…๊ทœ์น™

์ƒ์‹œ ์•ฝ์†

  • 1์ผ 1์ปค๋ฐ‹, 1์ฃผ 1MR(Merge Request) 1์ธ ํ”„๋กœ์ ํŠธ๋ผ๋„ master ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜์ง€ ๋ง์ž(์—ฐ์Šต)
  • Jira ์ด์Šˆ ๊ด€๋ฆฌ
    • ์Šคํ† ๋ฆฌ ํฌ์ธํŠธ๋„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉ
  • ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์ด๋‚˜ ๋ง‰ํžŒ ์ด์Šˆ๋ฅผ README.md๋กœ ์ •๋ฆฌ!!!
  • ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น  ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ฐ”๋กœ ๋ณด๊ณ 
    • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • URL
    • ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹
    • ์ƒ๋Œ€๋ฐฉ์ด ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ์ •ํ•œ ํŒŒ์ผ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ

ํ•˜๋ฃจ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ

  1. ์ง€๋ผ๋ฅผ ํ†ตํ•ด ์–ด์ œ ํ•œ ์ผ, ์˜ค๋Š˜ ํ•  ์ผ ๋ฐ˜์˜.
  2. ์–ด์ œ ํ•œ ์ผ ์ค‘์— ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น  ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ๊ฒฝ์šฐ ๋ณด๊ณ 
    • URL
    • ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹
  3. ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ ์ง„ํ–‰
  4. ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐ™์€ ๊ธฐ์ˆ  ์Šคํƒ ์‚ฌ๋žŒ๋ผ๋ฆฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ง„ํ–‰

ํ•˜๋ฃจ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

  1. ์ง€๋ผ์— ์˜ค๋Š˜ ํ•œ ์ผ ๋ฐ˜์˜
  2. ์˜ค๋Š˜ ํ•œ ์ผ ์ค‘์— ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ณด๊ณ ํ•  ๋งŒํ•œ ๋‚ด์šฉ ์ •๋ฆฌ
  3. 1์ผ 1์ปค๋ฐ‹ ์ˆ˜ํ–‰ (์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜ ์ง€ํ‚ฌ ๊ฒƒ)

ํ”„๋ก ํŠธ ์—”๋“œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ [์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ]

๐Ÿ‘ฉโ€๐Ÿ’ปํ”„๋ก ํŠธ ์—”๋“œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜

1. File ๊ตฌ์กฐ

// ๊ตฌ์„ฑ์š”์†Œ๋Š” ๋” ์ฐพ์•„๋ณด๊ณ  ํ•ฉ์˜ํ•ด๋ด…์‹œ๋‹น

{
  "useTabs": false,
  "printWidth": 100,
  "tabWidth": 2,
  "trailingComma": "all",
  "semi": true,
  "singleQuote": true
}

2. ํด๋” ๊ตฌ์กฐ

  • ๊ธฐ๋Šฅ๊ณผ ์—ญํ• ์— ๋”ฐ๋ผ์„œ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ™”๋ฉด ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์š”์†Œ๋Š” ํด๋”๋ช… ์•ž์— ์–ธ๋”๋ฐ”(_)์„ ๋ถ™์—ฌ์„œ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ณ€์ˆ˜

  • ๋ณ€์ˆ˜๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ๋ถˆ๋ณ€๋ณ€์ˆ˜๋Š” const์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

4. Naming

  • ํŒŒ์ผ๋ช…์€ PascalCase๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ex) LoginPage.jsx

  • ํŒŒ์ผ์ด๋ฆ„๊ณผ ์ปดํฌ๋„ŒํŠธ์ด๋ฆ„์€ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ์š”์†Œ์˜ ํ™•์žฅ์ž๋Š” .jsx๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

5. ํ”„๋กœํผํ‹ฐ

  • prop์˜ ์ด๋ฆ„์€ ํ•ญ์ƒ camelCase๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • props๋Š” ์ฝ๊ธฐ์ „์šฉ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค. ์ˆ˜์ •๋˜๋ฉด ์•ˆ๋œ๋‹ค. (์ˆ˜์ •์ด ํ•„์š”ํ•œ ์ •๋ณด๋Š” state!)

  • React ์ปดํฌ๋„ŒํŠธ๋Š” props๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋ฐ˜๋“œ์‹œ ์ˆœ์ˆ˜ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

    • ์ˆœ์ˆ˜ํ•จ์ˆ˜?

    ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€ ์ƒํƒœ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, DOM ๋˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์€)์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ถœ๋ ฅ๊ฐ’์„ ์ผ๊ด€๋˜๊ฒŒ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ โ€œ์ˆœ์ˆ˜(pure)โ€ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

  • ํ”„๋กœํผํ‹ฐ(props)๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ์—๋Š” ๋ฌธ์ž์—ด์€ ํฐ๋”ฐ์˜ดํ‘œ("") , ์ด์™ธ์˜ ๊ฐ’์€ ์ค‘๊ด„ํ˜ธ({})๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// ์˜ˆ์‹œ

class App extends React.Component {
  render() {
     // ์ „๋‹ฌํ•  ๋•Œ ์ง€์ €๋ถ„ํ•œ ์š”์†Œ๋“ค์€ ๋ณ€์ˆ˜์— ํ• ๋‹น ํ›„ ๋„˜๊ฒจ์ค๋‹ˆ๋‹น
    const array = [1,2,3];
    const obj = {name: "YUM", age:"3000"}
    const node = <h1>์•ˆ๋…•ํ•˜์„ธ์š”</h1>;
    const func = () => {console.log('์•ˆ๋…•ํ•˜์„ธ์š”'); };
    return (
      <ChildComponent
        stringValue="string"
        boolValue //boolean์˜ ๊ฒฝ์šฐ ๋ณด๋‚ด๋ฉด true ์•ˆ๋ณด๋‚ด๋ฉด false๊ฐ€ ์•Œ์•„์„œ ํ• ๋‹น๋ฉ๋‹ˆ๋‹น.
        numValue={1}
        arrayValue={array}
        objValue={obj}
        nodeValue={node}
        funcValue={func}
        />
    );
  }
}
export default App;
  • ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ›์•„์˜จ ๊ฒฝ์šฐ, ์ž๋ฃŒํ˜•์„ ํ•˜๋‹จ์— ์„ ์–ธํ•ด ์ค๋‹ˆ๋‹ค.
// ํ•ด๋‹น ๋‚ด์šฉ์ด ํ•จ์ˆ˜ํ˜•์—๋„ ์ ์šฉ๋˜๋Š”์ง€ ๋ชฐ๊ฒ !

import PropTypes from 'prop-types'

...

PropsComponent.propTypes = {
    stringValue: PropTypes.string,
    boolValue: PropTypes.bool,
    numValue: PropTypes.number,
    arrayValue: PropTypes.arrayOf(PropTypes.number),
    objValue: PropTypes.shape({
        name: PropTypes.string,
        age: PropTypes.number,
    }),
    nodeValue: PropTypes.node,
    funcValue: PropTypes.func,
} 

6. ํƒœ๊ทธ

  • ์ž์‹์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉด, ํ•ญ์ƒ ์ž์‹ ์„ ๋‹ซ๋Š”(self-close) ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • self-closing์—๋Š” ํ•œ์นธ์˜ ๊ณต๋ฐฑ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
// DO NOT
<sample className="sample"></sample>

// DO
// self-closing์—๋Š” ํ•œ์นธ์˜ ๊ณต๋ฐฑ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
<sample className="sample" />
  • ๋ฉ€ํ‹ฐ๋ผ์ธ์˜ ๊ฒฝ์šฐ, ์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ๋‹ค๋ฅธ ์ค„์— ์œ„์น˜ํ•œ๋‹ค.
// DO NOT
<sample className="sample"
    type="YUM" />

// DO
<sample 
  className="sample"
  type="YUM" 
/>

7. Redux

  • ์•ก์…˜

    • Type์€ ์–ด๋–ค ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ช…๋ช…ํ•ฉ๋‹ˆ๋‹ค.
    • Type์€ ๋Œ€๋ฌธ์ž์™€ ์–ธ๋”๋ฐ”๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ๋“€์„œ

    • ๋ฆฌ๋“€์„œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ์ž๋ฃŒํ˜•์€ ์ด์ „ ๋ฐ์ดํ„ฐ์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      (์ฝฉ์‹ฌ์€๋ฐ ์ฝฉ๋‚˜๊ณ  ํŒฅ์‹ฌ์€ ๋ฐ ํŒฅ๋‚œ๋‹ค)

8. ์ธ๋ผ์ธ ํ‘œํ˜„

  • If๋ฌธ

    • ์ค‘๊ด„ํ˜ธ ๋‚ด์— ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž &&์„ ์‚ฌ์šฉํ•ด ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    // ์˜ˆ์‹œ
    
    <div>
        <h1>Hello!</h1>
        {unreadMessages.length > 0 &&
            <h2>You have {unreadMessages.length} unread messages.</h2>
        }
    </div>
  • If-else๋ฌธ

    render() {
      const isLoggedIn = this.state.isLoggedIn;
      return (
        <div>
          The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
        </div>
      );
    }

9. ํ”„๋กœ์ ํŠธ ์„ค๊ณ„์˜ ํ๋ฆ„

  • ๋™์ผํ•˜์ง„ ์•Š๋”๋ผ๋„, ํ”„๋กœ์ ํŠธ์˜ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•ด ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
    1. ํŽ˜์ด์ง€์˜ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•˜๊ณ , UI๋ฅผ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋‚˜๋ˆ„๊ธฐ
    2. UI๋Š” ์žˆ์ง€๋งŒ ๊ธฐ๋Šฅ์€ ์—†๋Š” ์ •์ ์ธ ๋ฒ„์ „ ๋งŒ๋“ค๊ธฐ
    3. ์ตœ์†Œํ•œ์˜ state ํŒŒ์•… ๋ฐ ์„ค๊ณ„
    4. ์—ญ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ด๋™ ์„ค๊ณ„

10. ๋””์ž์ธ

  • ๋””์ž์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, Material-UI ๋กœ ํ†ต์ผํ•œ๋‹ค.

๋ฐฑ์—”๋“œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ [์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ]

๐Ÿ‘จโ€๐Ÿ’ป๋ฐฑ์—”๋“œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜

๊นƒ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋ฐ” ๋ช…๋ช… ๊ทœ์น™๋„ ์ฒ˜์Œ ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ฝ๊ธฐ ์‰ฝ๊ฒŒ๋” ๋ชจ๋‘๊ฐ€ ๊ณต์œ ํ•˜๊ธฐ ์‰ฌ์šด ์ปจ๋ฒค์…˜์„ ๊ฐ€์ง€๊ณ  ์ด๋ฆ„์„ ์ง€์–ด์•ผ ํ•œ๋‹ค.

1. Naming (๋ช…๋ช… ๊ทœ์น™)

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ค์ด๋ฐ์€ ๋ˆ„๊ตฌ๋‚˜ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๋‹จ์–ด๋ฅผ ์„ ํƒํ•œ๋‹ค.

    • ์šฐ๋ฆฌ๋Š” ์™ธ๊ตญ์ธ์ด ์•„๋‹ˆ๋‹ค. ์“ธ๋ฐ์—†์ด ์–ด๋ ค์šด ๊ณ ๊ธ‰ ์–ดํœ˜๋ฅผ ํ”ผํ•œ๋‹ค.
  2. ๋ณ€์ˆ˜๋Š” CamelCase๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.

    • private String secondName = "William"
  3. URL, ํŒŒ์ผ๋ช… ๋“ฑ์€ kebab-case๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • /user-email-page ...
  4. ํŒจํ‚ค์ง€๋ช…์€ ๋‹จ์–ด๊ฐ€ ๋‹ฌ๋ผ์ง€๋”๋ผ๋„ ๋ฌด์กฐ๊ฑด ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • frontend, useremail ...
  5. ENUM์ด๋‚˜ ์ƒ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ๋„ค์ด๋ฐํ•œ๋‹ค.

    • public String NAME = "June" ...
  6. ํ•จ์ˆ˜๋ช…์€ ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋™์‚ฌ๋กœ ๋„ค์ด๋ฐํ•œ๋‹ค.

    • getUserId(), isNormal() ...
  7. ํด๋ž˜์Šค๋ช…์€ ๋ช…์‚ฌ๋กœ ์ž‘์„ฑํ•˜๊ณ  UpperCamelCase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • UserEmail, Address ...
  8. ๊ฐ์ฒด ์ด๋ฆ„์„ ํ•จ์ˆ˜ ์ด๋ฆ„์— ์ค‘๋ณตํ•ด์„œ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. (= ์ƒ์œ„ ์ด๋ฆ„์„ ํ•˜์œ„ ์ด๋ฆ„์— ์ค‘๋ณต์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.)

    • line.getLength() (O) / line.getLineLength() (X)
  9. ์ปฌ๋ ‰์…˜์€ ๋ณต์ˆ˜ํ˜•์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ๋ช…์‹œํ•ด์ค€๋‹ค.

    • List ids, Map<User, Int> userToIdMap ...
  10. ์ด์ค‘์ ์ธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๋‹จ์–ด๋Š” ์ง€์–‘ํ•œ๋‹ค.

    • event, design ...
  11. ์˜๋„๊ฐ€ ๋“œ๋Ÿฌ๋‚œ๋‹ค๋ฉด ๋˜๋„๋ก ์งง์€ ์ด๋ฆ„์„ ์„ ํƒํ•œ๋‹ค.

    • retreiveUser() (X) / getUser() (O)
    • ๋‹จ, ์ถ•์•ฝํ˜•์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์˜๋„๊ฐ€ ๋ช…๋ฐฑํžˆ ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋ช…๋ฐฑํžˆ ์ „๋‹ฌ์ด ์•ˆ๋œ๋‹ค๋ฉด ์ถ•์•ฝํ˜•๋ณด๋‹ค ์„œ์ˆ ํ˜•์ด ๋” ์ข‹๋‹ค.
  12. ํ•จ์ˆ˜์˜ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

    • ํ•จ์ˆ˜๋Š” ํ•œ๊ฐ€์ง€ ๋™์ž‘๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ, ๋•Œ์— ๋”ฐ๋ผ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

      fun getOrder() {
        if (order == null) {
            order = Order()
        }
      return order
      }
      
    • ์œ„ ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ order๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—†์œผ๋ฉด ์ƒ์„ฑํ•ด์„œ ๋ฆฌํ„ดํ•œ๋‹ค.

    • ๊ทธ๋Ÿฌ๋ฏ€๋กœ getOrder() (X) / getOrCreateOrder() (O)

  13. LocalDateTime -> xxxAt, LocalDate -> xxxDt๋กœ ๋„ค์ด๋ฐ

  14. ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜๋Š” JPA Repository์—์„œ findXxx ํ˜•์‹์˜ ๋„ค์ด๋ฐ ์ฟผ๋ฆฌ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๋Š” Service๋‹จ์—์„œ๋Š” ๋˜๋„๋ก์ด๋ฉด getXxx๋ฅผ ์‚ฌ์šฉํ•˜์ž.

2. Structure

๊ตฌ์กฐ ์„ค๊ณ„์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์€ ํ•ญ์ƒํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ์ข‹์€ ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ๊พธ์ค€ํžˆ ๊ณ ๋ฏผํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ์ง€ํ–ฅํ•œ๋‹ค.

  1. ํŒจํ‚ค์ง€๋Š” ๋ชฉ์ ๋ณ„๋กœ ๋ฌถ๋Š”๋‹ค.
    • user(User ๊ด€๋ จ ํŒจํ‚ค์ง€), coupon(์ฟ ํฐ ๊ด€๋ จ ํŒจํ‚ค์ง€)
  2. Controller์—์„œ๋Š” ์ตœ๋Œ€ํ•œ ์–ด๋–ค Service๋ฅผ ํ˜ธ์ถœํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ๊ณผ Exception์ฒ˜๋ฆฌ๋งŒ์„ ๋‹ด๋‹นํ•˜์ž.
    • Controller ๋‹จ์—์„œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•œ๋‹ค.
    • Controller์˜ ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜๋ฅผ ์ค„์ด์ž๋Š” ๋œป์€ ์ ˆ๋Œ€ ์•„๋‹ˆ๋‹ค.
  3. ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ์™€ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ๋ชฉ์ ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
    • ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ๋Š” ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•ด์•ผํ•œ๋‹ค.
    • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ๋ชฉ์ ์„ ๋‘” ์ฝ”๋“œ๋“ค์˜ ์ง‘ํ•ฉ์ด์—ฌ์•ผํ•œ๋‹ค.
  4. ๋ฉ”์†Œ๋“œ์™€ ํด๋ž˜์Šค๋Š” ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ ๋‹ค.
    • ๋ฉ”์†Œ๋“œ์™€ ํด๋ž˜์Šค๊ฐ€ ์ปค์ง„๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๋™์ž‘์„ ํ•˜๊ณ  ์žˆ์„ ํ™•๋ฅ ์ด ํฌ๋‹ค.
    • ์ˆ˜๋งŽ์€ ์ฑ…์ž„์„ ๋– ์•ˆ์€ ํด๋ž˜์Šค๋ฅผ ํ”ผํ•œ๋‹ค. ํฐ ํด๋ž˜์Šค ๋ช‡ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ์ž‘์€ ํด๋ž˜์Šค ์—ฌ๋Ÿฟ์œผ๋กœ ์ด๋ค„์ง„ ์‹œ์Šคํ…œ์ด ๋”์šฑ ๋ฐ”๋žŒ์งํ•˜๋‹ค.
    • ํด๋ž˜์Šค ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•˜์ง€ ๋ง์ž.
  5. ๋„๋ฉ”์ธ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ํ”ผํ•˜์ž.
    • User๋ผ๋Š” ๋„๋ฉ”์ธ์ด ์žˆ์„ ๋•Œ, UserService๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ”ผํ•œ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ๋„๋ฉ”์ธ ๋„ค์ด๋ฐ์„ ๋”ด ์„œ๋น„์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด ์ž์—ฐ์Šค๋ ˆ ์ˆ˜๋งŽ์€ ์ฑ…์ž„์„ ๋– ์•ˆ์€ ํฐ ํด๋ž˜์Šค๋กœ ๋ฐœ์ „๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
    • ๊ธฐ๋Šฅ ๋ณ„๋กœ ์„ธ๋ถ„ํ™”ํ•ด์„œ ๋งŒ๋“ค์–ด๋ณด์ž. (UserRegisterService, UserEmailService ๋“ฑ...)

3. Programming

  1. ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • ๋‹จ, ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋Š” ์˜ˆ์™ธ๋กœ ํ•œ๋‹ค.
  2. ๋ณ€์ˆ˜๋Š” ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜๋Š” ์œ„์น˜์— ๊ฐ€๊น๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.

  3. ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜์™€ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋ณ„ํ•  ๋• ์–ธ๋”๋ฐ”๊ฐ€ ์•„๋‹Œ this๋กœ ๊ตฌ๋ณ„ํ•œ๋‹ค.

    • this.name = name (O) / name = _name (X)
    • ์ถ”๊ฐ€์ ์œผ๋กœ ์–ธ๋”๋ฐ”๋ฅผ prefix๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•˜์ž.
  4. ์ฝ”๋“œ์˜ ๊ธธ์ด๊ฐ€ ์งง๊ณ  ๋ช…๋ฃŒํ•œ ๊ฒƒ๋„ ์ข‹์ง€๋งŒ, ๊ฐ€๋…์„ฑ์ด ํ˜„์ €ํžˆ ๋–จ์–ด์ง„๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ํ’€์–ด์“ด๋‹ค.

    • ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์งง์€ ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณธ๋‹ค๋ฉด ๊ฐ€๋…์„ฑ์ด ํ˜„์ €ํžˆ ๋–จ์–ด์ง„๋‹ค.
    • ํŠนํžˆ๋‚˜ ์ตœ์‹  ์–ธ์–ด(kotlin ๋“ฑ)์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ์˜ ๊ธธ์ด๋ฅผ ํ˜„์ €ํžˆ ์ค„์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ œ3์ž์˜ ์ž…์žฅ์—์„œ ๋ด๋„ ์–ด๋Š์ •๋„ ๊ฐ€๋…์„ฑ์ด ์žˆ๋Š”์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ํ•˜์ž.
  5. ๋ชจ๋“  ์˜ˆ์™ธ๋Š” ๋ฌด์‹œํ•˜์ง€๋ง๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋งŒ์•ฝ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์„๊ฑฐ๋ผ๋ฉด ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฃผ์„์„ ๋‚จ๊ธด๋‹ค.

  6. ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๋•Œ๋Š” ์ตœ๋Œ€ํ•œ ์„ธ๋ถ€์ ์ธ Exception(= Custom Exception)์„ ๋˜์ง„๋‹ค.

    • ์‹คํŒจํ•œ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๋ ค๋ฉด ํ˜ธ์ถœ ์ŠคํƒํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ ๋ถ€์กฑํ•˜๋‹ค.
    • ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€์— ์ „ํ›„ ์ƒํ™ฉ์˜ ์ •๋ณด๋ฅผ ๋‹ด์•„ ์˜ˆ์™ธ์™€ ํ•จ๊ป˜ ๋˜์ง„๋‹ค.
  7. ์˜ˆ์™ธ ์ผ€์ด์Šค๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ๋ฆฌํ„ด ๋˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋„๋ก ์ž‘์„ฑํ•œ๋‹ค.

    • ์“ธ๋ฐ์—†์ด ์ •์ƒ๋กœ์ง์„ ํƒœ์šธ ํ•„์š”๊ฐ€ ์—†๊ฒŒํ•œ๋‹ค.

      if(!์ •์ƒ) {
        throw err;
      }
      ์ •์ƒ ๋กœ์ง
      }
      
  8. ์กฐ๊ฑด์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์ž„์‹œ boolean ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋‹จ์ˆœํ™”ํ•œ๋‹ค.

  9. ์กฐ๊ฑด๋ฌธ์— ๋ถ€์ •์กฐ๊ฑด์„ ๋„ฃ๋Š” ๊ฒƒ์„ ํ”ผํ•œ๋‹ค.

    • if(status.isNormal()) (O) / if(!status.isAbnormal()) (X)
  10. ์ตœ๋Œ€ํ•œ ๊ฐ์ฒด ํƒ€์ž… ๋Œ€์‹  ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ์„ ํƒํ•˜๊ณ , ์ƒ๊ฐ์ง€๋„ ๋ชปํ•œ Autoboxing์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•œ๋‹ค.


์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜ [์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ]

๐Ÿ‘จโ€๐Ÿ’ป์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜

Why โ“

์‚ฌ์‹ค ์ง€๊ธˆ๊ป ํ˜ผ์ž์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์˜ค๋Š” ์ผ์ด ๋งŽ์•„์„œ ๊นƒ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜๋งŒ ์•Œ์•„๋ณด๋ฉด ๋˜๋ฏ€๋กœ ์ค‘๊ตฌ๋‚œ๋ฐฉ์œผ๋กœ ์ ๋Š” ์ผ์ด ๋งŽ์•˜๋‹ค.

๊ทธ๋Ÿฌ๋˜ ์ค‘ ์ตœ๊ทผ์— ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‚จ์ด ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ๋” ์‹ ๊ฒฝ์จ์„œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•  ์ผ์ด ์ƒ๊ฒผ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํŒ€ ํ”Œ์ ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ช‡ ๊ฐœ์›” ๋’ค์— ๋‚ด๊ฐ€ ์“ด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ฒŒ ๋˜๋ฉด ์ด ๋‹น์‹œ์˜ ๋‚ด๊ฐ€ ๋ฌด์Šจ ์ƒ๊ฐ์œผ๋กœ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค....(๋‚˜๋ฅผ ์œ„ํ•ด์„œ ๋ผ๋„ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์‹ ๊ฒฝ์จ์„œ ์ ๋„๋ก ํ•˜์ž.)

์ •๋ฆฌํ•˜์ž๋ฉด, ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ด์œ ๋กœ ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

  1. ๋” ์ข‹์€ ์ปค๋ฐ‹ ๋กœ๊ทธ ๊ฐ€๋…์„ฑ
  2. ๋” ๋‚˜์€ ํ˜‘์—…๊ณผ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค
  3. ๋” ์‰ฌ์šด ์ฝ”๋“œ ์œ ์ง€ ๋ณด์ˆ˜

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ (Commit Message Structure)

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ๋Š” ์ œ๋ชฉ(subject) / ๋ณธ๋ฌธ(body) / ๊ผฌ๋ฆฌ๋ง(footer)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๋ณธ๋ฌธ๊ณผ ๊ผฌ๋ฆฌ๋ง์€ ๋ฐ˜๋“œ์‹œ ํฌํ•จ๋  ํ•„์š”๋Š” ์—†๋‹ค.

type : subject (์ด ๊ณณ์€ ์ œ๋ชฉ์ด ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์ž…๋‹ˆ๋‹ค.)

body (์ด ๊ณณ์€ ๋ณธ๋ฌธ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์ž…๋‹ˆ๋‹ค.)

footer (์ด ๊ณณ์€ ๊ผฌ๋ฆฌ๋ง์ด ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์ž…๋‹ˆ๋‹ค.)
์ปค๋ฐ‹ ํƒ€์ž… (Commit Type)
  • feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • fix : ๋ฒ„๊ทธ ์ˆ˜์ •
  • docs : ๋ฌธ์„œ ์ˆ˜์ •
  • style : ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ
  • refactor : ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
  • test : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, ๋ฆฌํŒฉํ† ๋ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
  • chore : ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •

์ œ๋ชฉ (Subject)

  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ œ๋ชฉ์€ ์ œ์ผ ์•ž์— ์ œ๋ชฉ์˜ ํƒ€์ž…์„ ๋ถ™์—ฌ์ค€๋‹ค. ์ปค๋ฐ‹ ํƒ€์ž…์˜ ์ข…๋ฅ˜๋Š” ์œ„ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • ์ œ๋ชฉ์€ 50์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๊ณ , ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๊ณ  ๋งˆ์นจํ‘œ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.
  • ๊ณผ๊ฑฐ ์‹œ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ช…๋ น์–ด๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ์ปค๋ฐ‹ ์œ ํ˜•๋“ค์ด ๋ณตํ•ฉ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ตœ๋Œ€ํ•œ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปค๋ฐ‹ํ•œ๋‹ค.

๋ณธ๋ฌธ (Body)

  • ์„ ํƒ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
  • ๋ถ€์—ฐ์„ค๋ช…์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ปค๋ฐ‹์˜ ์ด์œ ๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•  ๊ฒฝ์šฐ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋‚ด์šฉ์€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ•˜์˜€๋Š”์ง€ ๋ณด๋‹ค ๋ฌด์—‡์„, ์™œ ๋ณ€๊ฒฝํ•˜์˜€๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์œ„์ฃผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ํ•œ ์ค„์ด 72์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•ˆ๊ณ  ์ œ๋ชฉ๊ณผ ๊ตฌ๋ถ„๋˜๊ฒŒ ํ•œ ์ค„์„ ๋„์šฐ๊ณ  ์ž‘์„ฑํ•œ๋‹ค.

ํ‘ธํ„ฐ (Footer)

  • ์„ ํƒ ์‚ฌํ•ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฌด๋ฐฉํ•˜๋‹ค
  • ๋ณดํ†ต ์ด์Šˆ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ด์Šˆ ํŠธ๋ž˜์ปค ID๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ์‹œ (Example)

feat: Summarize changes in around 50 characters or less

More detailed explanatory text, if necessary. Wrap it to about 72
characters or so. In some contexts, the first line is treated as the
subject of the commit and the rest of the text as the body. The
blank line separating the summary from the body is critical (unless
you omit the body entirely); various tools like `log`, `shortlog`
and `rebase` can get confused if you run the two together.

Explain the problem that this commit is solving. Focus on why you
are making this change as opposed to how (the code explains that).
Are there side effects or other unintuitive consequenses of this
change? Here's the place to explain them.

Further paragraphs come after blank lines.

 - Bullet points are okay, too

 - Typically a hyphen or asterisk is used for the bullet, preceded
   by a single space, with blank lines in between, but conventions
   vary here

If you use an issue tracker, put references to them at the bottom,
like this:

Resolves: #123
See also: #456, #789

โš™๏ธ Install and Usage

Frontend

  • frontend ํด๋”๋กœ ๋“ค์–ด์™€ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    yarn
  • frontend app์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    yarn start

Backend

  • Java (Open JDK 14)๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • Maven์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • VSCode์—์„œ Maven ํ•˜๋‹จ์˜ webcuration์—์„œ ์šฐํด๋ฆญ ํ›„ install
  • VS Code์—์„œ Spring Boot Extension Pack ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • Docker๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Maria DB ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

  • docker run --name-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD={ํŒจ์Šค์›Œ๋“œ} -d mariddb
    • ํŒจ์Šค์›Œ๋“œ๋ฅผ ์น  ๋•Œ๋Š”, ๋Œ€๊ด„ํ˜ธ๋ฅผ ์ง€์šฐ๊ณ  ์นฉ๋‹ˆ๋‹ค.
  • docker exec -it maria-db mysql -u root -p
    • docker๋ฅผ ์ผœ๊ณ , maria-db๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

DB ํ…Œ์ด๋ธ” ์ƒ์„ฑ

  • DB ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

backend ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ./mvnw spring-boot:run

๐Ÿ’ก ์•„์ด๋””์–ด ๊ธฐํš

1) ๊ธฐํš ๋ชฉํ‘œ

์ƒ์ƒํ•œ ๊ธฐ์–ต์ด ๋‹ด๊ธด ํ”ผ๋“œ(Feed)

  • ๋ง›์žˆ๋Š” ์Œ์‹์„ ๋จน์—ˆ๋˜ ๊ธฐ์–ต์„ ์˜์ƒ๊ณผ ํ•จ๊ป˜ ์ƒ์ƒํ•˜๊ฒŒ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•œ ํ”ผ๋“œ๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์„œ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ์ƒ์— ํ•˜๋‚˜๋ฟ์ธ ๋ง›์ง‘ ์ง€๋„

  • ๋ณธ์ธ์ด ์ฐœํ•œ ์‹๋‹น๋“ค๋งŒ ๋ชจ์•„ ์ง€๋„์—์„œ ํ™•์ธํ•˜์„ธ์š”.
  • ๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋…€๊ฐ„ ์ฃผ๋ณ€์˜ ๋ง›์ง‘๋“ค๋„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋ง›์ง‘ ์œ ๋ ˆ์นด๋ฅผ ์™ธ์น˜์„ธ์š”!!!

  • ๋ง›์ง‘์„ ๋ฐœ๊ฒฌํ•œ ๊ธฐ์จ์„ ์ฃผ๋ณ€ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์ „ํŒŒํ•  ์ˆ˜ ์žˆ์–ด์š”.

2) ์™€์ด์–ด ํ”„๋ ˆ์ž„ (Wireframe)

๋ชฉ์—… ํˆด์„ ํ™œ์šฉํ•˜๊ธฐ ์ „์— ์ €ํฌ๊ฐ€ ์ƒ๊ฐํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ์™€ ์ปจํ…์ธ ๋ฅผ ์Šค์ผ€์น˜!

3) ๋ชฉ์—… (Mock-up)

image-20210120231552226

image-20210120231604956

image-20210120231616770

4) DB ์Šคํ‚ค๋งˆ

ํ˜„์žฌ ๊ธฐํš๋œ ์„œ๋น„์Šค ๋‚ด์—์„œ ํ•„์š”ํ•œ ์Šคํ‚ค๋งˆ๋Š” ์ „๋ถ€ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ Column์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ์Šคํ‚ค๋งˆ๋ฅผ ์ˆ˜์ •ํ•ด๋‚˜๊ฐ€๋ฉด์„œ ๋งž์ถฐ๋‚˜๊ฐˆ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

๐Ÿ  ์ฃผ์š” ๊ธฐ๋Šฅ

1) ํšŒ์› ๊ด€๋ฆฌ

์œ ์ € ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ๋“ค

  1. ํšŒ์› ๊ฐ€์ž…
    • ์ด๋ฉ”์ผ, ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๊ฐ€์ž… ๊ฐ€๋Šฅ
    • ๊ฐ€์ž… ํ•„์ˆ˜ ํ•ญ๋ชฉ ๋ชจ๋‘ ์ž…๋ ฅ ์‹œ์—๋งŒ ๊ฐ€์ž…๋˜๋„๋ก ๋ณ€๊ฒฝ
    • ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ์ž…๋ ฅ ๊ธฐ์ค€์ด ์ถฉ์กฑ๋˜์ง€ ๋ชปํ•  ์‹œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋…ธ์ถœ
  2. ๋กœ๊ทธ์ธ
    • ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์˜ค๋ฅ˜์‹œ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
    • ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํŒจ ์‚ฌ์œ  ์˜ค๋ฅ˜๋ฉ”์‹œ์ง€ ๋…ธ์ถœ
    • JWT Token ํ™œ์šฉ ๋ณด์•ˆ์„ฑ ๊ฐ•ํ™”

2) ํ”ผ๋“œ

๋ง›์žˆ๋Š” ์Œ์‹ ์˜์ƒ๊ณผ ํ•จ๊ป˜ ๋ง›์ง‘ ์ •๋ณด์™€ ํ‰๊ฐ€๋ฅผ ๋‹ด์€ ๊ฒŒ์‹œ๊ธ€

  1. ํ”ผ๋“œ ์ž‘์„ฑ ํŽ˜์ด์ง€

    • ํœด๋Œ€ํฐ์œผ๋กœ ์ฐ์€ ์˜์ƒ์„ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ณ  ์„œ๋ฒ„์— ์ €์žฅ
    • ์ง€๋„ API๋ฅผ ํ™œ์šฉํ•ด์„œ ์ •ํ™•ํ•œ ๊ฐ€๊ฒŒ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅ
    • ์Œ์‹์ ๊ณผ ์ง์ ‘ํ•ด๋จน์€ ์Œ์‹์„ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์ €์žฅ
    • ๋จน์€ ์Œ์‹์„ ์ œ๋ชฉ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ๋ณ„์ ๊ณผ ๋‚ด์šฉ์„ ์ž…๋ ฅ
  2. ํ”ผ๋“œ ํ”Œ๋ฆฝ ํŽ˜์ด์ง€

    • ํ”ผ๋“œ ํŽ˜์ด์ง€์˜ ๋ฐฐ๊ฒฝ์œผ๋กœ ์˜์ƒ์„ ์ž๋™ ๋ฐ˜๋ณต ์žฌ์ƒ
    • ํ”ผ๋“œ CRUD ๊ตฌํ˜„
    • ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ํ”ผ๋“œ๋ฅผ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€
    • ๋‹‰๋„ค์ž„ ํด๋ฆญ์‹œ ๋‹ค๋ฅธ ์œ ์ €์˜ ๋งˆ์ดํŽ˜์ด์ง€ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ์ข‹์•„์š” ํ•ญ๋ชฉ์„ ์ง€๋„์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ
    • ์ธํ”ผ๋‹ˆํ‹ฐ ์Šคํฌ๋กค์„ ํ†ตํ•ด ์˜์ƒ์ด ๋Š๊ธฐ์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑ

3) ์ง€๋„

ํ”ผ๋“œ๋กœ ์ €์žฅ๋œ ์žฅ์†Œ๋ฅผ ์ง€๋„์— ๋งˆ์ปค์˜ ํ˜•ํƒœ๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ

  1. ๋ฆฌ๋ทฐ ์ง€๋„

    • ์ข‹์•„์š” ํ•œ ๋ฆฌ๋ทฐ๋Š” ๋„ํ† ๋ฆฌ๋กœ, ์ „์ฒด ๋ฆฌ๋ทฐ๋Š” ๊ธฐ๋ณธ๋งˆ์ปค๋กœ ์ง€์ •ํ•˜์—ฌ ๋ถ„๋ฅ˜ํ•˜์—ฌ ํ‘œ์‹œ
    • ์ข‹์•„์š” ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๋ชฉ๋ก์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.
    • ๋งˆ์ปคํด๋ฆญ์‹œ ์Œ์‹์ ์˜ ๊ฐ„๋‹จ ์ •๋ณด๋ฅผ ๋ฐ”ํ…€ ์‹œํŠธ์— ํ‘œ๊ธฐ
    • ๋ฐ”ํ…€ ์‹œํŠธ์—์„œ ๋ฆฌ๋ทฐ๋ณด๊ธฐ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์Œ์‹์ ์— ์ž‘์„ฑ๋œ ๋ชจ๋“  ๋ฆฌ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋“œ๋กœ ํ‘œ๊ธฐ
    • ์ธ๋„ค์ผ์„ ๋ˆ„๋ฅด๊ณ  ์žˆ์„์‹œ ์Œ์‹ ์˜์ƒ ์ž๋™ ์žฌ์ƒ
    • ์ธ๋„ค์ผ ํด๋ฆญ์‹œ ํ•ด๋‹น ๋””ํ…Œ์ผ ๋ฆฌ๋ทฐ ํŽ˜์ด์ง€๋กœ ์ด๋™
    • ์ง€๋„ ์ถ•์†Œ์‹œ ๋งˆ์ปค๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐฏ์ˆ˜๋กœ ๋ชจ์•„ ํ‘œ๊ธฐ
  2. ๊ฒ€์ƒ‰ ์ง€๋„

    • ๋‚ด ์œ„์น˜ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜ ๊ฐ€๊นŒ์šด ์Œ์‹์ ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ง€๋„์œ„์— ๋งˆ์ปค์™€ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œ๊ธฐ
    • ๋ฆฌ์ŠคํŠธ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ๋งˆ์ปค๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์Œ์‹์ ์˜ ์žฅ์†Œ ๋ฐ ์ •๋ณด๋ฅผ ์ €์žฅ

4) ๋งˆ์ดํŽ˜์ด์ง€

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ๋ฅผ ์ตœ์‹ ์ˆœ, ๋ฉ”๋‰ด๋ณ„๋กœ ํ™•์ธ

  1. ์œ ์ € ํŽ˜์ด์ง€

    • ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋“œ๋กœ ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„
    • ์ธ๋„ค์ผ์„ ๋ˆ„๋ฅด๊ณ  ์žˆ์„์‹œ ์Œ์‹ ์˜์ƒ ์ž๋™ ์žฌ์ƒ
    • ์ธ๋„ค์ผ ํด๋ฆญ์‹œ ํ•ด๋‹น ๋””ํ…Œ์ผ ๋ฆฌ๋ทฐ ํŽ˜์ด์ง€๋กœ ์ด๋™
  2. ์œ ์ € ์ •๋ณด ๋ณ€๊ฒฝ

    • ๊ณ„์ • ์„ค์ •์—์„œ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ

    • ๋‹‰๋„ค์ž„, ํ•œ์ค„ ์†Œ๊ฐœ, ์œ ์ € ํ”„๋กœํ•„ ์•„๋ฐ”ํƒ€ ๋ณ€๊ฒฝ

    • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ

5) ์œ ๋ ˆ์นด

์ƒˆ๋กœ์šด ๋ง›์ง‘์„ ์ฐพ๊ฒŒ ๋œ ๊ธฐ์จ์„ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ๋‚˜๋งŒ ์•Œ๊ณ  ์žˆ๋Š” ๋ง›์ง‘์„ ์ฃผ๋ณ€์— ๊ณต์œ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์™ธ์น˜์„ธ์š”!

  1. ๋ง›์žˆ๋Š” ์‹๋‹น์„ ์ฃผ๋ณ€์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ
  2. ์œ ๋ ˆ์นด
    • ์ข‹์•„์š”, ์‹ซ์–ด์š” ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ํ”ผ๋“œ ๊ฒŒ์‹œ ์‹œ๊ฐ„ ์ฆ๊ฐ€, ๊ฐ์†Œ
  3. ์œ„ ๊ธฐ๋Šฅ๋“ค์€ ํ•˜๋ฃจ์— ์ •ํ•ด์ง„ ์ถฉ์ „๋Ÿ‰์„ ์†Œ๋ชจ์‹œํ‚ค๋ฉด์„œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
  4. 4๊ฐ€์ง€ ๋ฉ”์„ธ์ง€๋ฅผ ์„ ํƒํ•ด์„œ ๋‹ค๋ฅธ ์œ ์ €์™€ ์†Œํ†ต
  5. ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฃผ๋ณ€ 1km์˜ ์œ ์ €์™€ ์†Œํ†ต ๊ฐ€๋Šฅ

๐Ÿ‘€ ํŽ˜์ด์ง€ ํ™”๋ฉด

FEED

์Œ์‹ ์˜์ƒ๊ณผ ๊ฐ„๋‹จ ๋ฆฌ๋ทฐ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ

๋ฉ”์ธ FEED and LIKE

image-20210218191649593

๋ฆฌ๋ทฐ ๋‚ด์šฉ ํŽผ์น˜๊ธฐ

image-20210218191810605

ํ”ผ๋“œ ์ƒ์„ฑ

image-20210218194113299

๋งˆ์ดํŽ˜์ด์ง€

๊ธฐ๋ณธ ํŽ˜์ด์ง€

image-20210218194552399image-20210218194640284

์œ ์ €์ •๋ณด๋ณ€๊ฒฝ

image-20210218194647022

๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

์ง€๋„

์ข‹์•„์š”, ๋ชจ๋“ ๋ฆฌ๋ทฐ ๊ตฌ๋ถ„

image-20210218195011719

๋ฐ”ํ…€์‹œํŠธ

image-20210218195551880

์ข‹์•„์š” ๋ฆฌ๋ทฐ ๋ชฉ๋ก

image-20210218195706327

ํด๋Ÿฌ์Šคํ„ฐ

image-20210218195807410

์œ ๋ ˆ์นด

์œ ๋ ˆ์นด ํด๋ฆญ ์• ๋‹ˆ๋ฉ”์ด์…˜

image-20210218195933498

4๊ฐ€์ง€ ๋ฉ”์„ธ์ง€ ์„ ํƒ

image-20210218195957910

์‹œ์—ฐ์˜์ƒ

About

๐Ÿ’ป ๋ง›์ง‘์ผ๊ธฐ YUMYUM ๋ชจ๋ฐ”์ผ์›น

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •