Skip to content

Latest commit

ย 

History

History
773 lines (515 loc) ยท 47.9 KB

README-ko.md

File metadata and controls

773 lines (515 loc) ยท 47.9 KB

ENGLISH | ไธญๆ–‡็‰ˆ | ๆ—ฅๆœฌ่ชž็‰ˆ

Project Guidelines ยท PRs Welcome

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

1. Git

Git

1.1 Git ๊ทœ์น™

Git์—๋Š” ๋ช…์‹ฌํ•ด์•ผํ•  ๊ทœ์น™๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • feature ๋ธŒ๋žœ์น˜(branch)์—์„œ ์ž‘์—…ํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์ž‘์—…์€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋Œ€์‹ ์— ๊ฒฉ๋ฆฌ๋œ ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜์—์„œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜ผ๋ž€ ์—†์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(Pull Request)๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž ์žฌ์ ์œผ๋กœ ๋ถˆ์•ˆ์ •ํ•œ, ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋กœ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ , ์ž‘์—…์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์•Œ์•„๋ณด๊ธฐ

  • develop์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ์„ธ์š”.

    ์ด์œ :

    ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๋ฅผ ํ•ญ์ƒ ๊ฑฐ์˜ ๋ฌธ์ œ์—†์ด ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•ด์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๊ณผํ•  ์ˆ˜๋„ ์žˆ์Œ).

  • develop๊ณผ master์— ์ง์ ‘ ํ‘ธ์‹œํ•˜์ง€ ์•Š๊ณ , ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“œ์„ธ์š”.

    ์ด์œ :

    ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•œ ๊ฒƒ์„ ๋‹ค๋ฅธ ํŒ€ ๋ฉค๋ฒ„๋“ค์—๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‰ฌ์šด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋ฉฐ, ์ œ์•ˆ๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ํ† ๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋Ÿผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœํ•œ ๊ธฐ๋Šฅ์„ ํ‘ธ์‹œํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์—, ๋กœ์ปฌ develop ๋ธŒ๋žœ์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ๋ฆฌ๋ฒ ์ด์Šค(rebase)๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”.

    ์ด์œ :

    ๋ฆฌ๋ฒ ์ด์Šค๋Š” ์š”์ฒญํ•œ ๋ธŒ๋žœ์น˜(master ํ˜น์€ develop)์„ ๋ณ‘ํ•ฉ(merge)ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด์„œ ๋กœ์ปฌ์—์„œ ๋งŒ๋“  ์ปค๋ฐ‹๋“ค์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค (์ถฉ๋Œ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด). ๊ฒฐ๊ตญ ๊นจ๋—ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‚จ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋” ์•Œ์•„๋ณด๊ธฐ

  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฆฌ๋ฒ ์ด์Šคํ•˜๋Š” ๋™์•ˆ ์ž ์žฌ์ ์ธ ์ถฉ๋Œ์„ ์ œ๊ฑฐํ•˜์„ธ์š”.

  • ๋ณ‘ํ•ฉ ํ›„, ๋กœ์ปฌ๊ณผ ์›๊ฒฉ์— ์žˆ๋Š” feature ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด ๋ฐฉ๋ฒ•์€ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋žœ์น˜๋“ค๋กœ๋ถ€ํ„ฐ ๋ธŒ๋žœ์น˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ธŒ๋žœ์น˜๊ฐ€ master ๋˜๋Š” develop์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋‹จ ํ•œ ๋ฒˆ์œผ๋กœ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. feature ๋ธŒ๋žœ์น˜๋Š” ์ž‘์—…์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ๋„์ค‘์—๋งŒ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์—, feature ๋ธŒ๋žœ์น˜๋Š” ์ž˜ ๋นŒ๋“œ๋˜๋Š”์ง€, ์ฝ”๋“œ ์Šคํƒ€์ผ ์ฒดํฌ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ง€ ๊ฒ€์ฆํ•˜์„ธ์š”.

    ์ด์œ :

    ์•ˆ์ •์ ์ธ ๋ธŒ๋žœ์น˜์— ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ ํ‘ธ์‹œํ•˜๋ ค ํ•  ๋•Œ, ๋งŒ์•ฝ feature ๋ธŒ๋žœ์น˜์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•œ๋‹ค๋ฉด, ๋ชฉํ‘œํ•œ ๋ธŒ๋žœ์น˜์˜ ๋นŒ๋“œ๋„ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๋ฅผ ์ ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ์ฝ”๋“œ์— ์‹ค์ œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•  ๋•Œ ํฌ๋งท์„ ์ˆ˜์ •ํ•˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์„ž์ผ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.

  • ์ด .gitignore file์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด ํŒŒ์ผ์—๋Š” ์ด๋ฏธ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ณด๋‚ด๋ฉด ์•ˆ๋˜๋Š” ์‹œ์Šคํ…œ ํŒŒ์ผ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ํŒŒ์ผ์€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์—๋””ํ„ฐ์™€ ๋Œ€๋ถ€๋ถ„์˜ ๊ณตํ†ต ์˜์กด์„ฑ ํด๋”์— ๋Œ€ํ•œ ํด๋” ๋ฐ ํŒŒ์ผ ์„ค์ •์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • develop๊ณผ master ๋ธŒ๋žœ์น˜๋ฅผ ๋ณดํ˜ธํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด ๋ฐฉ๋ฒ•์€ ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•œ, ๋Œ์ดํ‚ฌ ์ˆ˜ ์—†๋Š” ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ production-ready ๋ธŒ๋žœ์น˜๋“ค์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ์•Œ์•„๋ณด๊ธฐ: Github, Bitbucket

1.2 Git ์›Œํฌํ”Œ๋กœ์šฐ

์ƒ๊ธฐํ•œ ์ด์œ ๋“ค ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค, ๊ทธ๋ฆฌ๊ณ  Gitflow์˜ ๋ช‡๊ฐ€์ง€ ์š”์†Œ(๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ๊ณผ develop ๋ธŒ๋žœ์น˜์˜ ๋ณด์œ )์™€ ํ•จ๊ป˜ Feature ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— Git ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”. ์œ ์ง€๋ณด์ˆ˜ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ด ๋‹จ๊ณ„๋Š” ๋ฌด์‹œํ•˜์„ธ์š”.

    cd <project directory>
    git init
  • ์ƒˆ๋กœ์šด feature/bug-fix ๋ธŒ๋žœ์น˜๋ฅผ ์ฒดํฌ์•„์›ƒํ•˜์„ธ์š”.

    git checkout -b <branchname>
  • ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

    git add
    git commit -a

    ์ด์œ :

    git commit -a๋Š” ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ๋ถ„๋ฆฌ์‹œํ‚จ ์ƒํƒœ๋กœ ์—๋””ํ„ฐ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์„น์…˜ 1.3์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

  • ๋†“์นœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์›๊ฒฉ ์ €์žฅ์†Œ์™€ ๋™๊ธฐํ™”ํ•˜์„ธ์š”.

    git checkout develop
    git pull

    ์ด์œ :

    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ถฉ๋Œ(conflict)์„ ํฌํ•จํ•˜๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹ ์—, ๋‹น์‹ ์˜ ์ปดํ“จํ„ฐ์—์„œ ๋ฆฌ๋ฒ ์ด์Šคํ•จ์œผ๋กœ์จ ์ถฉ๋Œ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด develop ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ feature ๋ธŒ๋žœ์น˜๋กœ ์—…๋ฐ์ดํŠธ ํ•˜์„ธ์š”.

    git checkout <branchname>
    git rebase -i --autosquash develop

    ์ด์œ :

    --autosquash๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  ์ปค๋ฐ‹์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ๋ฐ€์–ด ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. develop ๋ธŒ๋žœ์น˜์—์„œ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋งŽ์€ ์ปค๋ฐ‹๋“ค์€ ์•„๋ฌด๋„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋” ์•Œ์•„๋ณด๊ธฐ

  • ๋งŒ์•ฝ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐ(resolve)ํ•˜๊ณ  ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ๊ณ„์†ํ•˜์„ธ์š”.

    git add <file1> <file2> ...
    git rebase --continue
  • ๋ธŒ๋žœ์น˜๋ฅผ ํ‘ธ์‹œํ•˜์„ธ์š”. ๋ฆฌ๋ฒ ์ด์Šค๋Š” ์ด๋ ฅ์„ ๋ณ€๊ฒฝ์‹œํ‚ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹น์‹ ์€ -f๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›๊ฒฉ ๋ธŒ๋žœ์น˜๋กœ ๊ฐ•์ œ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น์‹ ์˜ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์กฐ๊ธˆ ๋œ ํŒŒ๊ดด์ ์ธ --force-with-lease๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    git push -f

    ์ด์œ :

    ๋ฆฌ๋ฒ ์ด์Šค ํ•  ๋•Œ, ๋‹น์‹ ์€ feature ๋ธŒ๋žœ์น˜์˜ ์ด๋ ฅ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ๋Š” ๊ฒ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, Git์€ ์ผ๋ฐ˜์ ์ธ git push๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ , ๋‹น์‹ ์€ -f ํ˜น์€ --force ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์•Œ์•„๋ณด๊ธฐ

  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“œ์„ธ์š”.

  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋Š” ๋ฆฌ๋ทฐ์–ด์— ์˜ํ•ด ์ˆ˜์šฉ๋˜๊ณ , ๋ณ‘ํ•ฉ๋˜๊ณ  ์ข…๋ฃŒ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์ž‘์—…์ด ๋๋‚ฌ๋‹ค๋ฉด ๋‹น์‹ ์˜ ๋กœ์ปฌ feature ๋ธŒ๋žœ์น˜๋Š” ์ง€์šฐ์„ธ์š”.

    git branch -d <branchname>

    ์›๊ฒฉ ์ €์žฅ์†Œ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done

1.3 ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑํ•˜๊ธฐ

์ปค๋ฐ‹์„ ์ž‘์„ฑํ•˜๋Š” ์ข‹์€ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด Git์œผ๋กœ ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ํ˜‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ทธ ๊ทœ์น™๋“ค์ž…๋‹ˆ๋‹ค. (์ถœ์ฒ˜)

  • ์ค„ ๋ฐ”๊ฟˆ์„ ํ†ตํ•ด์„œ ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ๊ตฌ๋ถ„ํ•˜์„ธ์š”.

    ์ด์œ :

    Git์€ ๋‹น์‹ ์˜ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์ฒซ๋ฒˆ์งธ ์ค„์„ ์š”์•ฝ์œผ๋กœ ๋ถ„๊ฐ„ํ• ๋งŒํผ ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, git log ๋Œ€์‹ ์— git shortlog๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปค๋ฐ‹ ID์™€ ์š”์•ฝ์ •๋ณด๋งŒ์ด ํ‘œ์‹œ๋œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ œ๋ชฉ์„ 50์ž๋กœ, ๋ณธ๋ฌธ์€ 72์ž๋กœ ์ œํ•œํ•˜์„ธ์š”.

    ์ด์œ :

    ์ปค๋ฐ‹์€ ๊ฐ€๋Šฅํ•œ ๋ณด๊ธฐ ์ข‹๊ณ  ์ง‘์ค‘๋˜์–ด์•ผํ•˜๋ฉฐ, ์žฅํ™ฉํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋” ์•Œ์•„๋ณด๊ธฐ

  • ์ œ๋ชฉ์— ๋Œ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • ์ œ๋ชฉ์„ ๋งˆ์นจํ‘œ๋กœ ๋๋‚ด์ง€๋งˆ์„ธ์š”.

  • ์ œ๋ชฉ์— ๋ช…๋ น๋ฒ•(imperative mood)์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ์ปค๋ฏธํ„ฐ๊ฐ€ ์™„๋ฃŒํ•œ ์ผ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฉ”์‹œ์ง€๋“ค์€ ์ปค๋ฐ‹์ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์ ์šฉ๋œ ๋’ค์— ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ๋ณธ๋ฌธ์€ ์–ด๋–ป๊ฒŒ ๋Œ€์‹  ๋ฌด์—‡์„๊ณผ ์™œ๋ฅผ ์„ค๋ช…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜์„ธ์š”.

2. ๋ฌธ์„œํ™”

๋ฌธ์„œํ™”

  • README.md๋ฅผ ์œ„ํ•ด์„œ ์ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ•„์š”ํ•œ ์„น์…˜์€ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
  • ํ•œ ๊ฐœ ์ด์ƒ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋Š” ๊ฐ๊ฐ์˜ README.md ํŒŒ์ผ์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.
  • ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ README.md๋ฅผ ์ตœ์‹ ์œผ๋กœ ์œ ์ง€ํ•˜์„ธ์š”.
  • ์ฝ”๋“œ์— ์ฃผ์„์„ ๋‹ฌ์•„์ฃผ์„ธ์š”. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ๊ฐ ์„น์…˜์—์„œ ๋ฌด์—‡์„ ํ‘œํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ์„ธ์š”.
  • GitHub ํ˜น์€ StackOverflow์— ๋‹น์‹ ์ด ์‚ฌ์šฉํ•œ ์ ‘๊ทผ๋ฒ•์ด๋‚˜ ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์žˆ๋‹ค๋ฉด, ์ฃผ์„์— ๊ทธ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•˜์„ธ์š”.
  • ์ฃผ์„์„ ๋‚˜์œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณ€๋ช…์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.
  • ํด๋ฆฐ ์ฝ”๋“œ๋Š” ์ฃผ์„์„ ์ „ํ˜€ ๋‹ฌ์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ณ€๋ช…์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ์ฃผ์„๋„ ์ ์ ˆํ•˜๊ฒŒ ๋ฐ”๊ฟ”์ฃผ์„ธ์š”.

3. ํ™˜๊ฒฝ

ํ™˜๊ฒฝ

  • ํ•„์š”ํ•˜๋‹ค๋ฉด development, test์™€ production ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•˜์„ธ์š”.

    ์ด์œ :

    ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ, ํ† ํฐ, API, ํฌํŠธ ๋“ฑ... ์•„๋งˆ๋„ ๋ณ„๋„์˜ ํ™˜๊ฒฝ์„ ํ•„์š”๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹น์‹ ์€ ๊ฒฉ๋ฆฌ๋œ development ๋ชจ๋“œ์—์„œ๋Š” ๊ฐ€์งœ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์˜ˆ์ƒ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•ด์„œ ์ˆ˜๋™/์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•  ๊ฒ๋‹ˆ๋‹ค. ํ˜น์€ Google Analytics๋ฅผ production ๋ชจ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ๋ฐฐํฌ์— ๊ด€๋ จ๋œ ์„ค์ • ๋ณ€์ˆ˜๋“ค์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ•˜๊ณ  ๊ทธ ๋ณ€์ˆ˜๋“ค์„ ์ฝ”๋“œ ๋ฒ ์ด์Šค์— ์ƒ์ˆ˜๋กœ ํฌํ•จํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด ์ƒ˜ํ”Œ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

    ์ด์œ :

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

    ๋ฐฉ๋ฒ•:

    .env ํŒŒ์ผ์„ ๋‹น์‹ ์˜ ๋ณ€์ˆ˜๋“ค์„ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ ํŒŒ์ผ์„ .gitignore์— ๋„ฃ์–ด ์ œ์™ธํ•˜์„ธ์š”. ๋Œ€์‹ ์—, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” .env.example ์ด๋ผ๋Š” ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜์„ธ์š”. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ—ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์ฆ(validate)ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’๋“ค์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด joi๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ด ์ƒ˜ํ”Œ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

    ์ด์œ :

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

3.1 ์ผ๊ด€์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • package.json์˜ engines์— Node.js ๋ฒ„์ „์„ ์„ค์ •ํ•˜์„ธ์š”.

    ์ด์œ :

    ๋‹ค๋ฅธ ์ด๋“ค์—๊ฒŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” Node.js ๋ฒ„์ „์— ๋Œ€ํ•ด ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ์ถ”๊ฐ€๋กœ, nvm์„ ์‚ฌ์šฉํ•˜๊ณ  .nvmrc ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๊ฒฝ๋กœ์— ๋งŒ๋“œ์„ธ์š”. ๋ฌธ์„œ์— ๊ทธ๊ฒƒ์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ๋„ ์žŠ์ง€๋งˆ์„ธ์š”.

    ์ด์œ :

    nvm์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด nvm use ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์ ˆํ•œ Node.js ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • preinstall์„ ์‚ฌ์šฉํ•ด์„œ Node.js์™€ npm ๋ฒ„์ „์„ ์ฒดํฌํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

    ์ด์œ :

    ์–ด๋–ค ์˜์กด(dependency)์€ ์ƒˆ๋กœ์šด npm ๋ฒ„์ „์œผ๋กœ ์„ค์น˜ํ•  ๋•Œ ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ๋„์ปค๋Š” ์ „์ฒด์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ์— ๊ฑธ์ณ ์ผ๊ด€์ ์ธ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์˜์กด์„ฑ ํ˜น์€ ์„ค์ •์— ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ๊ธ€๋กœ๋ฒŒ๋กœ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜์ง€ ๋ง๊ณ  ๋กœ์ปฌ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ๋‹น์‹ ์˜ ํˆด์„ ๋™๋ฃŒ๋“ค์ด ๊ธ€๋กœ๋ฒŒ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ํˆด์„ ๊ณต์œ ํ•˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

3.2 ์ผ๊ด€์ ์ธ ์˜์กด์„ฑ

  • ๋‹ค๋ฅธ ํŒ€ ๋ฉค๋ฒ„๋“ค์ด ๋‹น์‹ ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ์˜์กด์„ฑ์„ ๊ฐ–๋„๋ก ํ•˜์„ธ์š”.

    ์ด์œ :

    ์™œ๋ƒ๋ฉด ๋‹น์‹ ์€ ์–ด๋–ค ๊ฐœ๋ฐœ ๊ธฐ๊ธฐ์—์„œ๋„ ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒํ•œ๋Œ€๋กœ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜๋‹ˆ๊นŒ์š”. ๋” ์ฝ๊ธฐ

    ๋ฐฉ๋ฒ•:

    npm@5 ์ด์ƒ์˜ ๋ฒ„์ „์—์„œ package-lock.json์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ €๋Š” npm@5 ๋ฒ„์ „ ๋ฏธ๋งŒ์ด์—์š”:

    ๋Œ€์•ˆ์œผ๋กœ Yarn์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. README.md์— Yarn์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ๋ช…์‹œํ•˜์„ธ์š”. ๋‹น์‹ ์˜ ๋ฝ(lock) ํŒŒ์ผ๊ณผ package.json ํŒŒ์ผ์€ ๊ฐ ์˜์กด์„ฑ ์—…๋ฐ์ดํŠธ ํ›„ ๋™์ผํ•œ ๋ฒ„์ „์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

    ์ €๋Š” Yarn์ด๋ผ๋Š” ์ด๋ฆ„์ด ์‹ซ์€๋ฐ์š”:

    ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ตฌ ๋ฒ„์ „์˜ npm์—์„œ๋Š” ์ƒˆ๋กœ์šด ์˜์กด์„ ์„ค์น˜ํ•  ๋•Œ -โ€”save --save-exact๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜ฌ๋ฆฌ๊ธฐ ์ „์— npm-shrinkwrap.json์„ ์ƒ์„ฑํ•˜์„ธ์š”. ๋” ์ฝ๊ธฐ

4. ์˜์กด์„ฑ

Github

  • npm ls --depth=0๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ถ”์ฒ™ํ•˜์„ธ์š”. ๋” ์ฝ๊ธฐ

  • depcheck๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒจํ‚ค์ง€ ์ค‘์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ด€๋ จ์ด ์—†๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋” ์ฝ๊ธฐ

    ์ด์œ :

    ๋‹น์‹ ์€ ์“ฐ์ด์ง€ ์•Š๊ณ  ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹น์‹ ์˜ ์ฝ”๋“œ์— ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋กœ์ธํ•ด ํ”„๋กœ๋•์…˜์˜ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง‘๋‹ˆ๋‹ค. ์“ฐ์ด์ง€ ์•Š๋Š” ์˜์กด์„ฑ์„ ์ฐพ์•„ ์ œ๊ฑฐํ•˜์„ธ์š”.

  • ์˜์กด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—, npm-stat์„ ์‚ฌ์šฉํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ž˜ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ‚ค์ง€์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์šด๋กœ๋“œ ํ†ต๊ณ„๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋” ์ฝ๊ธฐ

    ์ด์œ :

    ๋Œ€๊ฐœ, ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์„ ์ˆ˜๋ก ๊ธฐ์—ฌ์ž(contributor)๊ฐ€ ๋” ๋งŽ์•„์ง€๋ฏ€๋กœ, ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์ž˜ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด๋กœ ์ธํ•ด ๋ฒ„๊ทธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฐœ๊ฒฌ๋˜๊ณ  ๊ณ ์ณ์ง‘๋‹ˆ๋‹ค.

  • ์˜์กด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—, ๋งŽ์€ ๋ฉ”์ธํ…Œ์ด๋„ˆ์™€ ํ•จ๊ป˜, ์„ฑ์ˆ™ํ•œ ๋ฒ„์ „ ๋ฆด๋ฆฌ์ฆˆ ์ฃผ๊ธฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์˜ˆ: npm view async ๋” ์ฝ๊ธฐ

    ์ด์œ :

    ์•„๋ฌด๋ฆฌ ๋งŽ์€ ์ปจํŠธ๋ฆฌ๋ทฐํ„ฐ๊ฐ€ ์žˆ์–ด๋„ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค์ด ํŒจ์น˜๋ฅผ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๊ฒŒ ๋จธ์ง€(merge)ํ•˜์ง€ ์•Š์œผ๋ฉด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

  • ๋œ ์•Œ๋ ค์ง„ ์˜์กด์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๊ทธ๊ฑธ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํŒ€ ๋‚ด์—์„œ ์˜๋…ผํ•˜์„ธ์š”.

  • npm outdated๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹น์‹ ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊นจ์ง€์ง€ ์•Š๊ณ  ์˜์กด ํŒจํ‚ค์ง€์˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“œ์„ธ์š”. ๋” ์ฝ๊ธฐ

    ์ด์œ :

    ์˜์กด์€ ๋•Œ๋•Œ๋กœ ๊นจํŠธ๋ฆฌ๋Š” ๋ณ€ํ™”(breaking change)๋ฅผ ๋‹ด์€ ์ฑ„๋กœ ์—…๋ฐ์ดํŠธ ๋ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋‹น์‹ ์˜ ์˜์กด์„ฑ์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์—…๋ฐ์ดํŠธํ•˜๋ฉด, ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์ด ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. npm-check-updates ๊ฐ™์ด ์ข‹์€ ํˆด์„ ํ™œ์šฉํ•˜์„ธ์š”.

  • Snyk ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์„œ ํŒจํ‚ค์ง€์— ์•Œ๋ ค์ง„ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

5. ํ…Œ์ŠคํŠธ

Testing

  • ํ•„์š”ํ•˜๋‹ค๋ฉด test ๋ชจ๋“œ๋ฅผ ๋งŒ๋“œ์„ธ์š”.

    ์ด์œ :

    ๋•Œ๋•Œ๋กœ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ๋„ End-to-End ํ…Œ์ŠคํŠธ์— ์ถฉ๋ถ„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์˜ˆ์™ธ๋Š” ํ•ญ์ƒ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹น์‹ ์€ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ˆ๋กœ, ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” API๋Š” ํ˜ธ์ถœ ์ˆ˜ ์ œํ•œ์„ ๊ฐ€์ ธ์„œ, ์ผ์ •๋Ÿ‰์˜ ์š”์ฒญ ํ›„์—๋Š” ํ…Œ์ŠคํŠธ ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ํ…Œ์ŠคํŠธ ๋˜๋Š” ๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ์— ์œ„์น˜์‹œํ‚ค๊ณ  moduleName.spec.js ์ฒ˜๋Ÿผ *.test.js๋‚˜ *.spec.js ๊ฐ™์€ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์œผ๋กœ ์ด๋ฆ„์„ ์ง€์–ด์ฃผ์„ธ์š”.

    ์ด์œ :

    ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋‹ค ๋’ค์ง€๊ธธ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—†์„ ๊ฒ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค์€ ๋ณ„๋„์˜ ํ…Œ์ŠคํŠธ ํด๋”์— ๋„ฃ์œผ์„ธ์š”.

    ์ด์œ :

    ๋ช‡๋ช‡ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌํ˜„ ํŒŒ์ผ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฐ __test__ ํด๋”์— ์ง‘์–ด ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด์ œ ์ด __test__๋ผ๋Š” ์ด๋ฆ„์€ ํ‘œ์ค€์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ JavaScript ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ํ”ผํ•˜์„ธ์š”. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์„ธ์š”. ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

    ์ด์œ :

    ๋‹น์‹ ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ณ„๊ฐœ์˜ ์œ ๋‹›์œผ๋กœ ๋ถ„๋ฆฌํ•ด ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹น์‹ ์€ "๋ฌด์ž‘์œ„์˜ ์˜ํ–ฅ๊ณผ ์ฝ”๋“œ ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ ๋น„๊ฒฐ์ •์ (nondeterministic) ํ”„๋กœ์„ธ์Šค๋ฅผ ์ตœ์†Œํ™”" ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

    ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ๊ฐ™์€ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ์ถœ๋ ฅ์„ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ, ๋ถˆ์ˆœ(impure) ํ•จ์ˆ˜๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ฐ”๊นฅ์˜ ์ƒํƒœ์— ์˜์กดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง•์€ ํ•จ์ˆ˜๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ์ •์  ํƒ€์ž… ๋ถ„์„๊ธฐ๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด๋”ฐ๊ธˆ ๋‹น์‹ ์€ ์ •์  ํƒ€์ž… ๋ถ„์„๊ธฐ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์  ํƒ€์ž… ๋ถ„์„๊ธฐ๋Š” ์ฝ”๋“œ์— ์ผ์ • ์ˆ˜์ค€์˜ ์‹ ๋ขฐ๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • develop์— ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ๋กœ์ปฌ๋กœ ๋Œ๋ฆฌ์„ธ์š”.

    ์ด์œ :

    ํ”„๋กœ๋•์…˜ ์ค€๋น„๋œ ๋ธŒ๋žœ์น˜์˜ ๋นŒ๋“œ๋ฅผ ์‹คํŒจํ•œ ์‚ฌ๋žŒ์ด ๋˜๊ณ  ์‹ถ์ง„ ์•Š์„ ๊ฒ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ๋จผ์ € rebase ํ•œ ๋’ค ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆฌ์„ธ์š”.

  • README.md ํŒŒ์ผ์˜ ์ ์ ˆํ•œ ์„น์…˜์— ์„ค๋ช…์„ ํฌํ•จํ•ด์„œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋ฌธ์„œํ™”ํ•˜์„ธ์š”.

    ์ด์œ :

    ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ํ˜น์€ DevOps ์ „๋ฌธ๊ฐ€๋‚˜ QA, ์•„๋‹ˆ๋ฉด ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ผํ•˜๋Š” ์šด ์ข‹์€ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋‚จ๊ฒจ๋‘๋Š” ํŽธ๋ฆฌํ•œ ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค.

6. ๊ตฌ์กฐ ๋ฐ ๋„ค์ด๋ฐ

Structure and Naming

  • ํ”„๋กœ๋•ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํŒŒ์ผ์„ ์—ญํ• ์ด ์•„๋‹Œ ๊ธฐ๋Šฅ, ํŽ˜์ด์ง€, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑํ•˜์„ธ์š”. ๋˜ํ•œ, ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ ๊ตฌํ˜„ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ์— ๋‘์„ธ์š”.

    Bad

    .
    โ”œโ”€โ”€ controllers
    |   โ”œโ”€โ”€ product.js
    |   โ””โ”€โ”€ user.js
    โ”œโ”€โ”€ models
    |   โ”œโ”€โ”€ product.js
    |   โ””โ”€โ”€ user.js
    

    Good

    .
    โ”œโ”€โ”€ product
    |   โ”œโ”€โ”€ index.js
    |   โ”œโ”€โ”€ product.js
    |   โ””โ”€โ”€ product.test.js
    โ”œโ”€โ”€ user
    |   โ”œโ”€โ”€ index.js
    |   โ”œโ”€โ”€ user.js
    |   โ””โ”€โ”€ user.test.js
    

    ์ด์œ :

    ๊ธด ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ ๋Œ€์‹ ์—, ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•ด์„œ ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ์บก์Šํ™”ํ•œ ์ž‘์€ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒŒ์ผ ํƒ์ƒ‰์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๊ณ , ํ›‘์–ด๋ด๋„ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค์€ ๋ณ„๋„์˜ ํ…Œ์ŠคํŠธ ํด๋”์— ๋„ฃ์œผ์„ธ์š”.

    ์ด์œ :

    ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ํ˜น์€ DevOps ์ „๋ฌธ๊ฐ€ ๋“ค์˜ ์‹œ๊ฐ„์„ ์•„๊ปด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ./config ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”.

    ์ด์œ :

    ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, API ๋“ฑ)์„ ์œ„ํ•ด ์„ค์ • ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•  ๋•Œ, ๊ทธ ํŒŒ์ผ๋“ค์„ ํ•œ ํด๋”์— ๋„ฃ๊ณ  config ์ฒ˜๋Ÿผ ์ž˜ ์•Œ๋ ค์ง„ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํด๋”์— ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์ง€ ๋ง๋ผ๋Š” ๊ฒƒ๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•ฑ์˜ ๋” ๋งŽ์€ ๋ฐฐํฌํŒ์ด ๋งŒ๋“ค์–ด์ง€๋ฉด ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์˜ ์ด๋ฆ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋“ค์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์˜ํ•ด ์ œ๊ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์€ ./scripts ํด๋”์— ๋„ฃ์œผ์„ธ์š”. bash์™€ node ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•ด์„œ์š”.

    ์ด์œ :

    ๋‹น์‹ ์€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ, ๊ฐœ๋ฐœ์šฉ ๋นŒ๋“œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต๊ธ‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™๊ธฐํ™” ๋“ฑ, ์ตœ์†Œ 1๊ฐœ ์ด์ƒ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•„์š”๋กœ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

  • ./build ํด๋”์— ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ์œ„์น˜์‹œํ‚ค๋„๋ก ํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  .gitignore์— build/๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

    ์ด์œ :

    ์ทจํ–ฅ๋Œ€๋กœ ์ด๋ฆ„์„ ์ง€์œผ์„ธ์š”. dist๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒ€ ๋‚ด์—์„œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋„๋ก ํ•˜์„ธ์š”. ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜(๋ฒˆ๋“ค๋˜๊ฑฐ๋‚˜, ์ปดํŒŒ์ผ๋˜๊ฑฐ๋‚˜, ํŠธ๋žœ์ŠคํŒŒ์ผ๋˜๊ฑฐ๋‚˜) ์˜ฎ๊ฒจ์ง„ ํŒŒ์ผ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹น์‹ ์˜ ํŒ€์›๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ ํŒŒ์ผ๋“ค์„ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์˜ฌ๋ฆด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด์š”.

  • ํŒŒ์ผ๋ช…๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋ช…์„ ์œ„ํ•ด PascalCase๋‚˜ camelCase๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. PascalCase๋Š” ์ปดํฌ๋„ŒํŠธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • CheckBox ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•ด์„œ CheckBox/index.js๋‚˜ CheckBox.js๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ•˜์ง€๋งŒ ์žฅํ™ฉํ•œ CheckBox/Checkbox.js ํ˜น์€ checkbox/CheckBox.js๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

  • ์ด์ƒ์ ์œผ๋กœ๋Š”, index.js์—์„œ ๋””ํดํŠธ๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์ด ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ด์œ :

    ๊ทธ๋Ÿฌ๋ฉด ๋ถ€๋ชจ ํด๋”๋งŒ ๊ทธ๋ƒฅ ๊ฐ„๋‹จํžˆ ๋ถˆ๋Ÿฌ์™€๋„ ๋‹น์‹ ์ด ๋ฐ›๊ฒŒ ๋  ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋ชจ๋“ˆ์ด ๋ญ”์ง€ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

7. ์ฝ”๋“œ ์Šคํƒ€์ผ

Code style

7.1 ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ

  • ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์—๋Š” stage-2 ์ด์ƒ์˜ ํ˜„๋Œ€์ ์ธ JavaScript ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ค๋ž˜๋œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜„๋Œ€ํ™”(modernize)ํ•  ๊ณ„ํš์ด ์—†๋‹ค๋ฉด ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๊ธฐ์กด ๋ฌธ๋ฒ•์„ ์œ ์ง€ํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด๊ฒƒ์€ ๋ชจ๋‘ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ธ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์˜ ์žฅ์ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. stage-2๋Š” ์•ฝ๊ฐ„์˜ ์‚ฌ์†Œํ•œ ์ˆ˜์ •์ด ์žˆ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๊ฒฐ๊ตญ ์ŠคํŽ™์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒ๋‹ˆ๋‹ค.

  • ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์— ์ฝ”๋“œ ์Šคํƒ€์ผ ์ฒดํฌ๋ฅผ ํฌํ•จํ•˜์„ธ์š”.

    ์ด์œ :

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

  • ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ESLint๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ๊ผญ eslint๋ฅผ ์„ ํƒํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์šฐ๋ฆฌ๋Š” eslint๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. eslint๋Š” ๋” ๋งŽ์€ ๋ฃฐ์„ ์ง€์›ํ•˜๊ณ , ๊ทœ์น™์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” JavaScript์— Airbnb JavaScript Style Guide๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (๋” ์ฝ๊ธฐ) ํ”„๋กœ์ ํŠธ๋‚˜ ํŒ€์ด ์š”๊ตฌํ•˜๋Š” JavaScript ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • FlowType์„ ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” ESLint์šฉ Flow type ์Šคํƒ€์ผ ์ฒดํฌ ๋ฃฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ์ด์œ :

    Flow๋Š” ์•ฝ๊ฐ„์˜ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ๋ฒ• ์—ญ์‹œ ํŠน์ •ํ•œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๊ณ  ์ฒดํฌ๋˜์–ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์Šคํƒ€์ผ ์ฒดํฌ๋กœ๋ถ€ํ„ฐ ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•ด .eslintignore๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ์Šคํƒ€์ผ ์ฒดํฌ๋กœ๋ถ€ํ„ฐ ๋ช‡ ๋ช‡ ํŒŒ์ผ์„ ์ œ์™ธํ•  ๋•Œ๋งˆ๋‹ค eslint-disable ์ฃผ์„์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋”๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— eslint ๋น„ํ™œ์„ฑํ™” ์ฃผ์„์„ ์ œ๊ฑฐํ•˜์„ธ์š”.

    ์ด์œ :

    ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๋™์•ˆ ๋กœ์ง์— ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํƒ€์ผ ์ฒดํฌ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š” ๊ฑด ์ผ์ƒ์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ eslint-disable ์ฃผ์„์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฑธ ์žŠ์ง€๋ง๊ณ  ๊ทœ์น™์„ ๋”ฐ๋ฅด์„ธ์š”.

  • ์ž‘์—…์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ //TODO ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ด์Šˆ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“œ์„ธ์š”.

    ์ด์œ :

    ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹น์‹  ์Šค์Šค๋กœ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ž‘์€ ์ž‘์—…(ํ•จ์ˆ˜ ๋ฆฌํŒฉํ† ๋ง ํ˜น์€ ์ฃผ์„ ์—…๋ฐ์ดํŠธ)์„ ์ƒ๊ธฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ํฐ ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” ๋ฆฐํŠธ ๊ทœ์น™์— ์˜ํ•ด ๊ฐ•์ œ๋˜๋Š” //TODO(#3456) ๊ฐ™์€ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฒˆํ˜ธ๋Š” ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ญ์ƒ ์ฃผ์„์ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์ ๊ณผ ๊ด€๋ จ์ด ์žˆ๋„๋ก ์œ ์ง€ํ•˜์„ธ์š”. ์ฃผ์„์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ ๋ธ”๋ก์€ ์ œ๊ฑฐํ•˜์„ธ์š”.

    ์ด์œ :

    ๋‹น์‹ ์˜ ์ฝ”๋“œ๋Š” ์ตœ๋Œ€ํ•œ ์ฝ๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“œ์„ธ์š”. ์ง‘์ค‘์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ์ง€์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค๋ฉด, ์˜ˆ์ „ ์ฝ”๋“œ๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌํ•˜์ง€ ๋ง๊ณ  ์ œ๊ฑฐํ•˜์„ธ์š”.

  • ๋ถ€์ ์ ˆํ•˜๊ฑฐ๋‚˜ ์›ƒ๊ธฐ๋Š” ์ฃผ์„, ๋กœ๊ทธ, ๋„ค์ด๋ฐ์„ ํ”ผํ•˜์„ธ์š”.

    ์ด์œ :

    ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋•Œ๋•Œ๋กœ ๋‹น์‹ ์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ํšŒ์‚ฌ/ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋„˜์–ด๊ฐ€์„œ ๊ณค๋ž€ํ•œ ์ƒํ™ฉ์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

    ์ด์œ :

    ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ฆผ์ฐจ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋‘์„ธ์š”. ๊ณ ๋ ˆ๋ฒจ์˜ ํ•จ์ˆ˜๋Š” ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ์ €๋ ˆ๋ฒจ์˜ ํ•จ์ˆ˜๋Š” ์•„๋ž˜์— ์œ„์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ด์œ :

    ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

7.2 ํ‘œ์ค€ ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฐ•์ œํ•˜๊ธฐ

  • ์„œ๋กœ ๋‹ค๋ฅธ ์—๋””ํ„ฐ๋“ค ์‚ฌ์ด์—์„œ๋„ ์ผ๊ด€์ ์ธ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๊ณ  ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š” .editorconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    EditorConfig ํ”„๋กœ์ ํŠธ๋Š” ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ ํฌ๋งท๊ณผ, ์—๋””ํ„ฐ๊ฐ€ ํŒŒ์ผ ํฌ๋งท์„ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ณ  ์ •์˜ํ•œ ์Šคํƒ€์ผ์„ ๊ณ ์ˆ˜ํ•˜๋Š” ํ…์ŠคํŠธ ์—๋””ํ„ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์˜ ๋ชจ์Œ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. EditorConfig ํŒŒ์ผ์€ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๋ฒ„์ „ ์ปจํŠธ๋กค ์‹œ์Šคํ…œ๊ณผ๋„ ์ž˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์Šคํƒ€์ผ ์—๋Ÿฌ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ESLint ์„ค์ •๊ณผ ํ•จ๊ป˜ eslint-plugin-prettier์™€eslint-config-prettier๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋” ์ฝ๊ธฐ

  • Git hook์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

    ์ด์œ :

    Git hook์€ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋Œ์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ๊นจํŠธ๋ฆด ๊ฑฑ์ • ์—†์ด ์Šคํ…Œ์ด์ง•์ด๋‚˜ ํ”„๋กœ๋•์…˜์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋งŒ๋“ค๊ณ  ์ปค๋ฐ‹, ํ‘ธ์‹œ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • precommit hook๊ณผ ํ•จ๊ป˜ Prettier๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    prettier ์ž์ฒด๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋งค๋ฒˆ ์ฝ”๋“œ๋ฅผ ํฌ๋งทํŒ… ํ•  ๋•Œ๋งˆ๋‹ค npm ํƒœ์Šคํฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฑด ๋ณ„๋กœ ์ƒ์‚ฐ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ๋Š” lint-staged๋‚˜ husky๊ฐ€ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ lint-staged(์—ฌ๊ธฐ)๋‚˜ husky(์—ฌ๊ธฐ)์—์„œ ๋” ์•Œ์•„๋ณด์„ธ์š”.

8. ๋กœ๊น…

Logging

  • ํ”„๋กœ๋•์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ๋กœ๊น…์€ ํ”ผํ•˜์„ธ์š”.

    ์ด์œ :

    ์•„๋งˆ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋กœ๊น… ํ•จ์ˆ˜๋ฅผ ์ง€์›Œ๋ฒ„๋ฆฌ๊ฒ ์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฝ”๋“œ ์Šคํƒ€์ผ ์ฒดํฌ๋ฅผ ํ†ตํ•ด console.log๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒฝ๊ณ ํ•˜๋„๋ก ๋งŒ๋“œ์„ธ์š”.

  • ํ”„๋กœ๋•์…˜์—์„œ ๊ฐ€๋…์„ฑ ์ข‹์€ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ์„ธ์š”. ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ winston ์ด๋‚˜ node-bunyan ๊ฐ™์€ ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

    ์ด์œ :

    ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋กœ๊ทธ ์ƒ‰์ƒ, ํƒ€์ž„์Šคํƒฌํ”„, ๋งค์ผ ๋ฐ˜๋ณต๋˜๋Š” ๋กœ๊ทธ ํŒŒ์ผ ์ถœ๋ ฅ ๋“ฑ์˜ ์š”์†Œ ๋•๋ถ„์— ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์ด ๋œ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

9. API

API

9.1 API ์„ค๊ณ„

์ด์œ :

์šฐ๋ฆฌ๊ฐ€ RESTful ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด์„œ ๊ฐœ๋ฐœํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒ€ ๋ฉค๋ฒ„๋‚˜ ๊ณ ๊ฐ๋“ค์ด ๊ฐ„ํŽธํ•˜๊ณ  ์ผ๊ด€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์œ :

์ผ๊ด€์„ฑ๊ณผ ๋‹จ์ˆœํ•จ์˜ ๋ถ€์กฑ์€ ํ†ตํ•ฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ํฌ๊ฒŒ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด API ์„ค๊ณ„๊ฐ€ ์ด ๋ฌธ์„œ์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ(resource-oriented) ์„ค๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ ์„ค๊ณ„๋Š” ์„ธ ๊ฐœ์˜ ํฐ ์š”์†Œ(๋ฆฌ์†Œ์Šค, ์ฝœ๋ ‰์…˜, URL)๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

    • ๋ฆฌ์†Œ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ , ์ค‘์ฒฉ๋˜๋ฉฐ, ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฆฌ์†Œ์Šค์˜ ๊ทธ๋ฃน์€ ์ฝœ๋ ‰์…˜์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
    • URL์€ ๋ฆฌ์†Œ์Šค ํ˜น์€ ์ฝœ๋ ‰์…˜์˜ ์˜จ๋ผ์ธ ์œ„์น˜๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

    ์ด์œ :

    ์ด๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๋“ค(๋‹น์‹ ์˜ ์ฃผ API ์‚ฌ์šฉ์ž๋“ค์„ ํฌํ•จ)์—๊ฒŒ ๋งค์šฐ ์ž˜ ์•Œ๋ ค์ ธ์žˆ๋Š” ์„ค๊ณ„์ž…๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ๊ณผ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ์ œ์™ธํ•˜๋”๋ผ๋„, ๋ฒ”์šฉ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ปค๋„ฅํ„ฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด API๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๋”๋ผ๋„ ๋ง์ด์ฃ .

  • URL์—๋Š” ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์ด๋‚˜ ๋ฆฌ์†Œ์Šค ํ•„๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” ์นด๋ฉœ ์ผ€์ด์Šค(camelCase)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • URL ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์€ ๋ณต์ˆ˜์˜ ์ผ€๋ฐฅ ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • ์ฝœ๋ ‰์…˜์„ ๊ฐ€๋ฆฌํ‚ค๋Š” URL์˜ ๋„ค์ด๋ฐ์—๋Š” ํ•ญ์ƒ ๋ณต์ˆ˜ ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ: /users

    ์ด์œ :

    ๊ธฐ๋ณธ์ ์œผ๋กœ, ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  URL์„ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์œ ์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ์†Œ์Šค ์ฝ”๋“œ์—์„œ๋Š” ๋ณต์ˆ˜ํ˜•์„ ๋ณ€์ˆ˜๋‚˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ List ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ๋ณต์ˆ˜ํ˜•์€ URL์—๋Š” ์ข‹์ง€๋งŒ ์†Œ์Šค ์ฝ”๋“œ์—์„œ๋Š” ์‹๋ณ„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ์—๋Ÿฌ์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•ญ์ƒ ์ฝœ๋ ‰์…˜์—์„œ ์‹œ์ž‘ํ•ด ์‹๋ณ„์ž์—์„œ ๋๋‚˜๋Š” ๋‹จ์ผ ์ปจ์…‰์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    /students/245743
    /airports/kjfk
    
  • ์ด๋Ÿฐ URL์€ ํ”ผํ•˜์„ธ์š”.

    GET /blogs/:blogId/posts/:postId/summary
    

    ์ด์œ :

    ์ด๊ฑด ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒ๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ ์‘๋‹ต(Response)์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค URL์—์„œ ๋™์‚ฌ๋Š” ์ œ๊ฑฐํ•˜์„ธ์š”.

    ์ด์œ :

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

  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ๊ฒƒ๋“ค์„ ์œ„ํ•ด ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ๊ฒฝ์šฐ, API๋Š” ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค๋„ ๋Œ๋ ค์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ํŠน์ • ๋™์ž‘(Operation)์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CRUD(create, retrieve, update and delete)๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค!

    /translate?text=Hallo
    

    ์ด์œ :

    CRUD ์šฉ๋„๋กœ ์šฐ๋ฆฌ๋Š” ๋ฆฌ์†Œ์Šค ํ˜น์€ ์ฝœ๋ ‰์…˜ URL์— HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๊ณ  ์žˆ๋Š” ๋™์‚ฌ๋Š” ์‹ค์ œ๋กœ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ์ด๋Ÿฐ ๊ฑธ ๊ฐœ๋ฐœํ•  ์ผ์ด ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ์š”์ฒญ ๋ณธ๋ฌธ(Request body)๊ณผ ์‘๋‹ต ํƒ€์ž…์€ JSON์ด๋ฉฐ, ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ JSON ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์œผ๋กœ camelCase๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด๊ฑด JavaScript ํ”„๋กœ์ ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์—, JSON์„ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ JSON์„ ํŒŒ์‹ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋„ JavaScript์ผ๊ฑฐ๋ผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค๋Š” ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ํ˜น์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ฝ”๋“œ์™€ ๋น„์Šทํ•œ ๋‹จ์ผ ๊ฐœ๋…์ด์ง€๋งŒ, ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์— ํ…Œ์ด๋ธ” ๋ช…์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์œผ๋กœ ์ปฌ๋Ÿผ ๋ช…์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

    ์ด์œ :

    API์˜ ์šฉ๋„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์žฌ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ๋„ค์ด๋ฐํ•  ๋•Œ URL์—๋Š” ๋ช…์‚ฌ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋Šฅ์ ์ธ ์ธก๋ฉด์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งˆ์„ธ์š”.

    ์ด์œ :

    ๋ฆฌ์†Œ์Šค URL์—๋Š” ์˜ค์ง ๋ช…์‚ฌ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , /addNewUser๋‚˜ /updateUser ๊ฐ™์€ ๋์ ์€ ํ”ผํ•˜์„ธ์š”. ๋˜ํ•œ ๋ฆฌ์†Œ์Šค ๋™์ž‘์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณด๋‚ด์ง€๋งˆ์„ธ์š”.

  • HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด CRUD์˜ ๊ธฐ๋Šฅ์  ์ธก๋ฉด์„ ๋‚˜ํƒ€๋‚ด์„ธ์š”.

    ๋ฐฉ๋ฒ•:

    GET: ๋ฆฌ์†Œ์Šค์˜ ํ‘œํ˜„์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    POST: ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋‚˜ ์„œ๋ธŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    PUT: ์กด์žฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    PATCH: ์กด์žฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค์ง ์ œ๊ณต๋œ ํ•„๋“œ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๊ทธ๋Œ€๋กœ ๋†”๋‘ก๋‹ˆ๋‹ค.

    DELETE: ์กด์žฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ค‘์ฒฉ๋œ ๋ฆฌ์†Œ์Šค๋Š” URL์—์„œ์˜ ๊ด€๊ณ„๋ฅผ ์ด์šฉํ•˜์„ธ์š”, ์˜ˆ๋ฅผ ๋“ค์–ด, ์ง์›๊ณผ ํšŒ์‚ฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด id๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ์ด๊ฒƒ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

    ๋ฐฉ๋ฒ•:

    GET /schools/2/students , 2๋ฒˆ ํ•™๊ต์˜ ๋ชจ๋“  ํ•™์ƒ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    GET /schools/2/students/31 , 2๋ฒˆ ํ•™๊ต์— ์†ํ•œ 31๋ฒˆ ํ•™์ƒ์˜ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    DELETE /schools/2/students/31 , 2๋ฒˆ ํ•™๊ต์— ์†ํ•œ 31๋ฒˆ ํ•™์ƒ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    PUT /schools/2/students/31 , 31๋ฒˆ ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. PUT์€ ์ฝœ๋ ‰์…˜ ๋ง๊ณ  ๋ฆฌ์†Œ์Šค URL์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.

    POST /schools , ์ƒˆ๋กœ์šด ํ•™๊ต๋ฅผ ๋งŒ๋“ค๊ณ  ๋งŒ๋“ค์–ด์ง„ ํ•™๊ต์˜ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ ‰์…˜ URL์— POST ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • ๋ฒ„์ „์„ ์œ„ํ•ด์„œ v ์ ‘๋‘์–ด์™€ ํ•จ๊ป˜ ๊ฐ„๋‹จํ•œ ์„œ์ˆ˜(ordinal number)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”(v1, v2). ๊ฐ€์žฅ ๋†’์€ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋„๋ก URL์˜ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜์‹œํ‚ค์„ธ์š”.

    http://api.domain.com/v1/schools/3/students
    

    ์ด์œ :

    ๋‹ค๋ฅธ ์„œ๋“œ ํŒŒํ‹ฐ๋ฅผ ์œ„ํ•ด API๋ฅผ ๊ณต๊ฐœํ•œ ๊ฒฝ์šฐ, Breaking change๋ฅผ ํฌํ•จํ•˜๋Š” API ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ๊ทธ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๋•ํŠธ๋‚˜ ์„œ๋น„์Šค ๋˜ํ•œ ๊นจํŠธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์— ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋Ÿฐ ์‚ฌ๊ฑด์„ ์˜ˆ๋ฐฉํ•˜์„ธ์š”. ๋” ์ฝ๊ธฐ

  • ์‘๋‹ต ๋ฉ”์‹œ์ง€๋Š” ์Šค์Šค๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

    {
        "code": 1234,
        "message" : "๋ญ”๊ฐ€ ์•ˆ ์ข‹์€ ์ผ ๋ฐœ์ƒ",
        "description" : "์„ธ๋ถ€ ์ •๋ณด"
    }

    ํ˜น์€ Validation ์—๋Ÿฌ์˜ ๊ฒฝ์šฐ,

    {
        "code" : 2314,
        "message" : "Validation ์‹คํŒจ",
        "errors" : [
            {
                "code" : 1233,
                "field" : "email",
                "message" : "์œ ํšจํ•˜์ง€ ์•Š์€ ์ด๋ฉ”์ผ"
            },
            {
                "code" : 1234,
                "field" : "password",
                "message" : "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์Œ"
            }
          ]
    }

    ์ด์œ :

    ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹น์‹ ์˜ API๋ฅผ ์‚ฌ์šฉํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•œ ๋’ค์—, ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ํ•  ๋•Œ๋‚˜, ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ ๊ทธ๋“ค์€ ์ž˜ ์„ค๊ณ„๋œ ์—๋Ÿฌ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

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

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

    ๋ชฉ๋ก:

    200 OK๋Š” GET, PUT ํ˜น์€ POST ์š”์ฒญ์ด ์„ฑ๊ณตํ–ˆ์Œ์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

    201 Created๋Š” ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. POST ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด 201 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    304 Not Modified ์‘๋‹ต์€ ์ˆ˜์‹ ์ž๊ฐ€ ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ์ •๋ณด ๊ตํ™˜์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    400 Bad Request ์‘๋‹ต์€ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜์„ ๋•Œ, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฒŒ ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    401 Unauthorized๋Š” ์š”์ฒญ์— ์œ ํšจํ•œ ์ž๊ฒฉ์ฆ๋ช…์ด ์—†์„ ๋•Œ, ํ•„์š”ํ•œ ์ž๊ฒฉ์ฆ๋ช…์œผ๋กœ ๋‹ค์‹œ ์š”์ฒญํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    403 Forbidden๋Š” ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ดํ•ดํ–ˆ์œผ๋‚˜, ์Šน์ธ์€ ๊ฑฐ์ ˆํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

    404 Not Found๋Š” ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    500 Internal Server Error๋Š” ์š”์ฒญ์ด ์œ ํšจํ•˜๋‚˜, ์„œ๋ฒ„๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์œผ๋กœ ์ธํ•ด ์š”์ฒญ์„ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    ์ด์œ :

    ๋Œ€๋ถ€๋ถ„์˜ API ๊ณต๊ธ‰์ž๋“ค์€ HTTP ์ƒํƒœ ์ฝ”๋“œ์˜ ์ž‘์€ ๋ถ€๋ถ„์ง‘ํ•ฉ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ๊ธ€์˜ GData API๋Š” ๋‹จ 10๊ฐœ์˜ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋„ทํ”Œ๋ฆญ์Šค๋Š” 9๊ฐœ, Digg๋Š” ๊ฒจ์šฐ 8๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ด๋Ÿฌํ•œ ์‘๋‹ต๋“ค์€ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๋ณธ๋ฌธ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” 70๊ฐœ ์ด์ƒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” 70๊ฐœ ๋ชจ๋‘๋ฅผ ๊ธฐ์–ตํ•˜์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋งŒ์•ฝ ๋‹น์‹ ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ์ด์ง€ ์•Š๋Š” ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ง๊ณ  ์œ„ํ‚คํ”ผ๋””์•„๋กœ ๊ฐ€์„œ ๋‹น์‹ ์ด ๋ญ˜ ๋งํ•˜๋ ค๊ณ  ํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ์‘๋‹ต์— ๋ฆฌ์†Œ์Šค์˜ ์ˆซ์ž๋ฅผ ์ œ๊ณตํ•˜์„ธ์š”.

  • limit๊ณผ offset ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜์„ธ์š”.

  • ๋…ธ์ถœ๋˜๋Š” ๋ฆฌ์†Œ์Šค ๋ฐ์ดํ„ฐ์˜ ์–‘๋„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ ๋ฆฌ์†Œ์Šค์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํ•„๋“œ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ํ•„๋“œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    GET /student?fields=id,name,age,class
    
  • ํŽ˜์ด์ง€๋„ค์ด์…˜, ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ง€์›๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง๊ณผ ์ •๋ ฌ์„ ์ง€์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

9.2 API ๋ณด์•ˆ

๋‹ค์Œ๊ณผ ๊ฐ™์ด, ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ๋ชจ๋ฒ”์‚ฌ๋ก€๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ ์—ฐ๊ฒฐ(HTTPS) ์—†์ด "Basic" ์ธ์ฆ์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์ธ์ฆ ํ† ํฐ์€ URL๋กœ ์ „๋‹ฌ(GET /users/123?token=asdf....)๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

    ์ด์œ :

    ํ† ํฐ ํ˜น์€ ์œ ์ € ID ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ช…ํ™•ํ•œ ํ…์ŠคํŠธ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. (Base64 ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, Base64๋Š” ๋””์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•˜์ฃ .) Basic ์ธ์ฆ ๋ฐฉ์‹์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • ํ† ํฐ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด Authorization ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Authorization: Bearer xxxxxx, Extra yyyyy

  • ์ธ์ฆ ์ฝ”๋“œ(Authorization Code)๋Š” ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด HTTP ์š”์ฒญ์— ์‘๋‹ตํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ TLS ์š”์ฒญ์ด ์•„๋‹Œ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜์„ธ์š”. HTTP ์š”์ฒญ์— 403 Forbidden์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.

  • ์š”์ฒญ ์ œํ•œ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

    ์ด์œ :

    API๋ฅผ ๋ด‡์ด ์‹œ๊ฐ„ ๋‹น ๋ช‡ ์ฒœ ๊ฑด์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์œ„ํ˜‘์—์„œ ๋ณดํ˜ธํ•˜์„ธ์š”. ๋น ๋ฅธ ์†๋„๋กœ ์š”์ฒญ ์ œํ•œ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑธ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • HTTP ํ—ค๋”๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด, ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋” ์ฝ๊ธฐ

  • API๋Š” ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์ค€ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ ๋น ์ง„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด์™€ ํ•จ๊ป˜ 400 Bad Request๋ฅผ ๋Œ๋ ค์ฃผ์„ธ์š”.

  • REST API๋กœ ๊ตํ™˜๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” API์— ์˜ํ•ด ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • JSON์„ ์ง๋ ฌํ™”(Serailize)ํ•˜์„ธ์š”.

    ์ด์œ :

    JSON ์ธ์ฝ”๋”์˜ ์ค‘์š”ํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ˜น์€ Node.js ์„œ๋ฒ„์—์„œ ์ž„์˜์˜ JavaScript ์›๊ฒฉ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ง‰๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ์ ์ ˆํ•œ JSON ์ธ์ฝ”๋”๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Content-Type์„ ๊ฒ€์ฆํ•˜๊ณ , Content-Type ํ—ค๋”๋กœ ๊ฑฐ์˜ application/*.json์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    ์ด์œ :

    ์˜ˆ๋ฅผ ๋“ค๋จธ, application/x-www-form-urlencoded MIME ํƒ€์ž…์„ ๋ฐ›์•„๋“ค์ด๊ฒŒ ๋˜๋ฉด ๊ณต๊ฒฉ์ž๋“ค์ด ํผ์„ ๋งŒ๋“ค๊ณ  ๊ฐ„๋‹จํ•œ POST ์š”์ฒญ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ ˆ๋Œ€ Content-Type์„ ๊ฐ€์ •ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. Content-Type ํ—ค๋”์˜ ๋ถ€์žฌ ํ˜น์€, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ Content-Type ํ—ค๋”๋Š” ์„œ๋ฒ„์—์„œ 4XX ์‘๋‹ต์œผ๋กœ ๊ฑฐ๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • API ๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”. ๋” ์ฝ๊ธฐ

9.3 API ๋ฌธ์„œํ™”

  • README.md ํ…œํ”Œ๋ฆฟ์˜ API ์ฐธ์กฐ ์„น์…˜์„ ์ฑ„์šฐ์„ธ์š”.
  • ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ์ฒจ๋ถ€ํ•ด์„œ API ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ๊ธฐ์ˆ ํ•˜์„ธ์š”.
  • ์š”์ฒญ ํƒ€์ž…(HTTP METHOD)์„ ํฌํ•จํ•ด URL(๊ฒฝ๋กœ๋งŒ ํฌํ•จ, ๋ฃจํŠธ URL ์ œ์™ธ) ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”.

๊ฐ๊ฐ์˜ ๋์ (Endpoint)์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • URL ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด URL ์„น์…˜์— ์–ธ๊ธ‰๋œ ์ด๋ฆ„์— ๋”ฐ๋ผ URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

    Required: id=[integer]
    Optional: photo_id=[alphanumeric]
    
  • ์š”์ฒญ ํƒ€์ž…์ด POST์ธ ๊ฒฝ์šฐ ๋™์ž‘ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜์„ธ์š”. URL ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทœ์น™๋„ ์—ฌ๊ธฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•„์ˆ˜์™€ ์˜ต์…˜ ์„น์…˜์„ ๊ตฌ๋ถ„ํ•˜์„ธ์š”.

  • ์‘๋‹ต ์„ฑ๊ณต: ์ƒํƒœ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋Œ๋ ค์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ค ๊ฑด๊ฐ€์š”? ์•„๋ž˜์ฒ˜๋Ÿผ ํ•˜๋ฉด ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๋ฅผ ์•Œ์•„์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    Code: 200
    Content: { id : 12 }
    
  • ์‘๋‹ต ์—๋Ÿฌ: ๋Œ€๋ถ€๋ถ„์˜ ๋์ ์— ๋Œ€ํ•œ ์š”์ฒญ์€ ๋น„์ธ์ฆ ์ ‘๊ทผ๋ถ€ํ„ฐ ์ž˜๋ชป๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€, ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์—๋Ÿฌ๋“ค์€ ๋ช…์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ฐ˜๋ณต์ ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ฐ€์ •์„ ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

    {
        "code": 403,
        "message" : "์ธ์ฆ ์‹คํŒจ",
        "description" : "์œ ํšจํ•˜์ง€ ์•Š์€ ์œ ์ €๋ช… ํ˜น์€ ๋น„๋ฐ€๋ฒˆํ˜ธ"
    }
  • API ์„ค๊ณ„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ข‹์€ ๋ฌธ์„œํ™”์— ๋„์›€์„ ์ฃผ๋Š” ๋‹ค์–‘ํ•œ ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. API Blueprint๋‚˜ Swagger ๊ฐ™์€ ๊ฒƒ๋“ค ๋ง์ด์ฃ .

10. ๋ผ์ด์„ผ์Šค

Licensing

์‚ฌ์šฉ ๊ถŒํ•œ์ด ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” MIT, Apache ํ˜น์€ BSD ๋ผ์ด์„ผ์Šค๋ฅผ ์ฐพ์•„์•ผํ•œ๋‹ค๋Š” ๊ฑธ ๊ธฐ์–ตํ•˜์„ธ์š”. ๋˜ํ•œ ๋‹น์‹ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋ผ์ด์„ผ์Šค ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ž˜ ์‚ดํŽด๋ณด์„ธ์š”. ์ €์ž‘๊ถŒ์ด ์žˆ๋Š” ์ด๋ฏธ์ง€๋‚˜ ๋น„๋””์˜ค๋Š” ๋ฒ•์  ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Sources: RisingStack Engineering, Mozilla Developer Network, Heroku Dev Center, Airbnb/javascript, Atlassian Git tutorials, Apigee, Wishtack

Icons by icons8