๊ฐ์ธ์ ์ผ๋ก๋ ๋ฏธ์ ์ํ์ ํตํด ์ฑ์ฅํ ๊ณผ์ ์ ๊ธฐ๋กํ๊ณ ,
๋๊ตฐ๊ฐ์๊ฒ๋ ์ด ๊ธ์ด ๋์์ด ๋์์ผ๋ฉด ํ๋ ๋ง์์ ๋๋ค :)
๐ ๏ธ 2์ฃผ ์ฐจ ๊ฒฐ๊ณผ๋ฌผ
2์ฃผ ์ฐจ ๋ฏธ์ : ์๋์ฐจ ๊ฒฝ์ฃผ PR
๐ฎ 2์ฃผ ์ฐจ ๋ฉ์ผ ๋ด์ฉ
1๏ธโฃ ์ง๋ 1์ฃผ ์ฐจ ๋ฏธ์ ์ ์ด์ด..
1์ฃผ ์ฐจ ๋ฏธ์ ์ ๋ชฉํ๋ git, ๋ถ์ผ๋ณ ์ธ์ด, ๊ทธ๋ฆฌ๊ณ ๋ฏธ์ ์ฌ์ดํด์ ์ต์ํด์ง๋ ๊ฒ์ด์๋ค. ๊ทธ๋ฆฌ๊ณ 2์ฃผ ์ฐจ๋ถํฐ๋ ์ฐํ ์ฝ ๋ฏธ์ ๊ณผ์ ์ ์ ๋๋ก ๋ง๋ณผ ์ ์๋ ๊ณผ์ ์ธ '์๋์ฐจ ๊ฒฝ์ฃผ' ๊ฒ์์ด์๋ค.
์๊ตฌ์ฌํญ์ ์ดํดํ๋ ๊ฒ ์ด๋ ค์ธ ์ ์์ง๋ง ์ฃผ์ด์ง ์๊ตฌ์ฌํญ์ ์ ํ์ ํ๋ ๊ฒ๋ ์ข์ ๊ฐ๋ฐ์์ ์ญ๋ ์ค ํ๋๋ค. ๊ณ ๋ฏผ ์์ด ๋ฌด์์ ์ง๋ฌธํ๊ฑฐ๋ ๋ค๋ฅธ ์ฌ๋์ ๋์์ ๋ฐ๊ธฐ ์ ์ ์ค์ค๋ก ๊ณ ๋ฏผํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค๊ณ ํ๋ค.
2๏ธโฃ 2์ฃผ ์ฐจ ๋ฏธ์ ์ ๋ชฉํ
2์ฃผ ์ฐจ ๋ฏธ์ ์์๋ 1์ฃผ ์ฐจ์์ ํ์ตํ ๊ฒ์ ๋ํด ํจ์๋ฅผ ๋ถ๋ฆฌํ๊ณ , ๊ฐ ํจ์๋ณ๋ก ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ต์ํด์ง๋ ๊ฒ์ ๋ชฉํ๋ก ๋ช ์ํ๋ค. ๋๋ถ์ด, ํ ์คํธ ์ฝ๋ ์์ฑ์ด ์ฒ์์ด๋ผ๋ฉด ํ ์คํธ ๋๊ตฌ๋ฅผ ํ์ตํ๊ณ , ์์ ๋จ์์ ๊ธฐ๋ฅ๋ถํฐ ํ ์คํธ๋ฅผ ์์ฑํด ๋ณด๊ธธ ๊ถํ๋ค.
๐ณ ์ง๋ 1์ฃผ ์ฐจ ๊ณตํต ํผ๋๋ฐฑ
์๋๋ 1์ฃผ ์ฐจ ๋ฏธ์ ๋ง๊ฐ ํ, ๋ชจ๋ ํ๋ฆฌ์ฝ์ค ์ฐธ์ฌ ์ธ์์๊ฒ ๋ฐ์ก๋ ๊ณตํต ํผ๋๋ฐฑ์ด๋ค. ์์ฒญ๋๊ฒ ์งํค๊ธฐ ์ด๋ ค์ด ๊ฒ๋ค์ด๋ผ๊ธฐ๋ณด๋ค '๊ธฐ๋ณธ์ ์งํค์'๋ผ๋ ๋ด์ฉ์ด๋ค. ๊ฑฐ์ ์๊ตฌ์ฌํญ๊ณผ Git์ ๋ํด ๋ค์ ํ๋ฒ ๊ฐ์กฐํ๋ค.
1. ์๊ตฌ์ฌํญ์ ์ ํํ ์ค์ํ๋ค
2. ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์๋ฏธ ์๊ฒ ์์ฑํ๋ค
3. git์ ํตํด ๊ด๋ฆฌํ ์์์ ๋ํด์๋ ๊ณ ๋ คํ๋ค
4. Pull Request๋ฅผ ๋ณด๋ด๊ธฐ ์ ๋ธ๋์น๋ฅผ ํ์ธํ๋ค
5. PR์ ํ ๋ฒ ์์ฑํ๋ค๋ฉด ๋ซ์ง ๋ง๊ณ ์ถ๊ฐ ์ปค๋ฐ์ ํ๋ค
6. ์ด๋ฆ์ ํตํด ์๋๋ฅผ ๋๋ฌ๋ธ๋ค
7. ์ถ์ฝํ์ง ์๋๋ค
8. ๊ณต๋ฐฑ๋ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ด๋ค
9. ๊ณต๋ฐฑ ๋ผ์ธ์ ์๋ฏธ ์๊ฒ ์ฌ์ฉํ๋ค
10. space์ tab์ ํผ์ฉํ์ง ์๋๋ค
11. ์๋ฏธ ์๋ ์ฃผ์์ ๋ฌ์ง ์๋๋ค
12. linter์ Code Formatter์ ๊ธฐ๋ฅ์ ํ์ฉํ๋ค
13. EOL(End Of Line)
14. ๋ถํ์ํ console.log๋ฅผ ๋จ๊ธฐ์ง ์๋๋ค
15. JavaScript์์ ์ ๊ณตํ๋ API๋ฅผ ์ ๊ทน ํ์ฉํ๋ค
๐ค ๋ฏธ์ ์ ์์,
1๏ธโฃ ๊ธฐ๋ฅ ๋ชฉ๋ก ๋ง๋ค๊ธฐ
๋ฏธ์ ์ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ, ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ, ๊ณผ์ ์งํ ์๊ตฌ ์ฌํญ ์ธ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ํนํ ์ฃผ๋ชฉํด์ผ ํ ์ ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๋ง๋ ๋ค๋ ๊ฒ. ๊ธฐ๋ฅ ๊ตฌํ ์ ๋ชฉ๋ก์ ๋ง๋ค์ด์ ธ ์๋ ๊ฒ์ด ์๋๋ผ, ์ง์ ๋ง๋ค์ด์ผ ํ๋ ๊ฒ ํฌ์ธํธ๋ค.
2๏ธโฃ ์ ์ถ ์ ํ ์คํธ ํ์
๊ธฐ๋ฅ ๊ตฌํ์ ๋ชจ๋ ์ ์์ ์ผ๋ก ํ๋๋ผ๋ ์๊ตฌ ์ฌํญ์ ๋ช ์๋ ์ถ๋ ฅ๊ฐ ํ์์ ์งํค์ง ์์ ๊ฒฝ์ฐ 0์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค. ๊ธฐ๋ฅ ๊ตฌํ์ ์๋ฃํ ๋ค ํ ์คํธ๋ฅผ ์คํํ์ ๋ ํ ์คํธ๊ฐ ์คํจํ ๊ฒฝ์ฐ 0์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก, ๋ฐ๋์ ํ์ธ ํ ์ ์ถํ๋ค. ํ์๋ Node ํ๊ฒฝ์์ ํ๋ก๊ทธ๋จ์ด ์ ๋์๊ฐ๋์ง ํ์ธํ๊ณ , ๋ก์ปฌ ํ ์คํธ ์ฝ๋ ํต๊ณผ๊น์ง ํ์ธํ๋ค.
๋ฟ๋ง ์๋๋ผ, ์ ์ถ ๊ฐ๋ฅ ๊ธฐ๊ฐ์๋ ๋ฏธ๋ฆฌ PR์ ์ฌ๋ฆฌ๊ณ ์ง์ํ๊ธฐ ํ๋ซํผ์ ์์ ํ ์คํธ๊น์ง ๋ฏธ๋ฆฌ ๋๋ ค๋ณด์๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ง๊ฐ์ด ๋ช ์๊ฐ ๋จ์ง ์์ ์ํ์์ ์ถ์ธก์ด ์ด๋ ค์ด ์๋ฌ์ ๊ธฐ์ฝ ์์ด ์ธ์์ผ ํ๋ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ํ์ธํ์.
3๏ธโฃ Node ๋ฒ์ ํ์ธ ํ์
ํ ์คํธ ํจํค์ง ์ค์น๋ฅผ ์ํด Node.js ๋ฒ์ 18.17.1 ์ด์์ด ํ์ํ๋ค. ๋ณธ์ธ ๋ก์ปฌ์ Node ๋ฒ์ ์ด ๋ช์ธ์ง ๊ผญ ํ์ธ ํ ๋ฏธ์ ์ ์งํํ์. ์ฐธ๊ณ ๋ก Node ๋ฒ์ ํ์ธ์ 'node --version'์ผ๋ก ํ์ธ ๊ฐ๋ฅํ๋ฉฐ, ์ ๋ฐ์ดํธ๋ Node.js ๊ณต์ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ๊ฑฐ๋, ์๋์ ๊ฐ์ด 'nvm install'๋ก ํน์ Node ๋ฒ์ ์ ์ค์นํ ์ ์๋ค.
๐๏ธ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ
1๏ธโฃ ์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์ ์ค๋ช
๋ฏธ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฐํ ์ฝ ํ๋ฆฌ์ฝ์ค ๋ ํฌ์ ์์ผ๋ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋ผ๋ฉฐ, ๊ฐ๋จํ ๊ฒ์ ์ค๋ช ์ ํ์๋ฉด ์๋์ฐจ๋ค์ด ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์๋ ํ์๋งํผ ๊ฒฝ์ฃผ๋ฅผ ํ๋ฉด์ ๊ฐ์ฅ ๋ฉ๋ฆฌ ์ด๋ํ ์๋์ฐจ๊ฐ ์ด๊ธฐ๋ ๊ฒ์์ด๋ค.
2๏ธโฃ ์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์ ์์
๊ฒฝ์ฃผํ ์๋์ฐจ ์ด๋ฆ์ ์
๋ ฅํ์ธ์.(์ด๋ฆ์ ์ผํ(,) ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถ)
pobi,woni,jun
์๋ํ ํ์๋ ๋ช ํ์ธ๊ฐ์?
5
์คํ ๊ฒฐ๊ณผ
pobi : -
woni :
jun : -
pobi : --
woni : -
jun : --
... ์๋ต
pobi : -----
woni : ----
jun : -----
์ต์ข
์ฐ์น์ : pobi, jun
์ด๋ฒ ๋ฏธ์ ์ ์ง๋ 1์ฃผ ์ฐจ์ ๋นํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ์๊ฐ๋ณด๋ค ๊ผผ๊ผผํ๊ฒ ํ์ด์ผ ํ๋ค. ์๊ตฌ ์ฌํญ๋ค์ ์ฝ์ด๋ณด๋ฉด ์๊ฐ๋ณด๋ค ์ ๋งคํ ์กฐ๊ฑด๋ค์ด ์์ด์ ์ฌ์ฉ์์ ๋ค์ํ ์ธํ๊น์ง ์์ํ๊ณ ์ ํ์ ๊ฑธ์ด๋์ด์ผ ํ๋ค.
์ผ๋จ ์๋ ์๊ตฌ์ฌํญ๋ค์ ์์ฃผ ๊ผผ๊ผผํ๊ฒ ์น์ด๋จน๋ฏ ์ฝ์ด๋ณด์. (์ค์)
3๏ธโฃ ์๋์ฐจ ๊ฒฝ์ฃผ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ
โ ์ฃผ์ด์ง ํ์ ๋์ n๋์ ์๋์ฐจ๋ ์ ์ง ๋๋ ๋ฉ์ถ ์ ์๋ค.
๐ ์ฌ๊ธฐ์ n๋๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ๊ฐ? ๋ฌดํ์ผ๋ก ๋๋ฆด ๊ฒ์ธ๊ฐ, ์๋๋ฉด ์์ฒด์ ์ผ๋ก ์๋ฅผ ์ ํํ ๊ฒ์ธ๊ฐ? ์ค์ค๋ก ํ๋จํด ๋ณผ ๋ฌธ์ ๋ค. ๋ฌดํ๋๋ก ๋๋ฆฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌด๋ฆฌ๊ฐ ๊ฐ์ง ์์๊น? ์๋๋ฉด ๊ตณ์ด ๊ทธ๋ฐ ์กฐ๊ฑด์ ์์ผ๋ ๊ฑธ์ด๋์ง ์์๋ ๋ ๊น?
โ
๊ฐ ์๋์ฐจ์ ์ด๋ฆ์ ๋ถ์ฌํ ์ ์๋ค. ์ ์งํ๋ ์๋์ฐจ๋ฅผ ์ถ๋ ฅํ ๋ ์๋์ฐจ ์ด๋ฆ์ ๊ฐ์ด ์ถ๋ ฅํ๋ค.
๐ ๊ฐ ์๋์ฐจ์ ์ด๋ฆ์ ์ด๋ป๊ฒ ๋ถ์ฌํ ๊ฒ์ธ๊ฐ? ์๋ฌธ ์ซ์ ํน์๋ฌธ์ ๋ชจ๋ ํ์ฉํ ๊ฒ์ธ๊ฐ? ๊ทธ๋ฐ๋ฐ '์ ์งํ๋ ์๋์ฐจ๋ฅผ ์ถ๋ ฅํ ๋' ์๋์ฐจ ์ด๋ฆ์ ๊ฐ์ด ์ถ๋ ฅํ๋ค๊ณ ๊ธฐ์ฌ๋์ด ์๋๋ฐ, ์คํ ๊ฒฐ๊ณผ ์์์์๋ ์ ์งํ์ง ์๋ ์๋์ฐจ๋ ์ด๋ฆ์ด ์ถ๋ ฅ๋์ด์ ํท๊ฐ๋ ธ๋ค. ํ์ง๋ง ํ ์คํธ๋ณด๋ค ์์๊ฐ ์ ํํ๋ ์์์ฒ๋ผ ํ์ดํ์ด ์ฐํ์ง ์์๋ ์๋์ฐจ ์ด๋ฆ์ ์ถ๋ ฅ๋๋๋ก ํ๋ค.
โ
์๋์ฐจ ์ด๋ฆ์ ์ผํ(,)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ๋ฉฐ ์ด๋ฆ์ 5์ ์ดํ๋ง ๊ฐ๋ฅํ๋ค.
๐ ์๋์ฐจ ์ด๋ฆ์ ์ผํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ๊ฑด '์ผํ'๋ง ์๊ตฌํ๋ค๋ ๊ฒ์ด๋ค. ๊ณต๋ฐฑ์ด๋ ์จ์ , ํ์ดํ ๋ฑ ๋ค๋ฅธ ๊ฒ๋ค๋ก ์๋์ฐจ๊ฐ ๊ตฌ๋ถ๋๋๋ก ํ๋ฉด ์ ๋๋ค. (ํ์ง๋ง ๋ ์ด ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ๋ชปํ์ง.. ๋งค์ฐ ์์ฝ๋ค.) ๋๋ถ์ด, ์ด๋ฆ์ 5์ ๋ฏธ๋ง์ด ์๋ 5์ ์ดํ๋ง ๊ฐ๋ฅํ๋ค.
โ
์ฌ์ฉ์๋ ๋ช ๋ฒ์ ์ด๋์ ํ ๊ฒ์ธ์ง๋ฅผ ์
๋ ฅํ ์ ์์ด์ผ ํ๋ค.
๐ ์๋์ฐจ๊ฐ ๋ช ๋ฒ์ ์ด๋์ ํ ์ง๋ ๋๋ค ์์ฑ๊ธฐ๋ก ํ๋ ๊ฒ์ด ์๋๋ผ, ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๋ ฅํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ '๋ช ๋ฒ์ ์ด๋'์ด๋, ๊ฐ ์๋์ฐจ๊ฐ ๋ช ๊ฐ์ ํ์ดํ์ ์ฐ๋๋๊ฐ ์๋, ์คํ ์ดํฐ๋ ์ด์ ์ ์ผ๋ง๋ ๋์ง๋ฅผ ๋งํ๋ ๊ฒ์ด๋ค. ์ฝ๊ฒ ๋งํด, ์ฌ์ฉ์๊ฐ 5๋ฅผ ์ ๋ ฅํ๋ฉด ๊ฐ ์๋์ฐจ๋ 5๋ฒ์ ์ด๋ํ ์ ์๋ '๊ธฐํ'๋ฅผ ์ป๊ณ , ๊ทธ ๊ธฐํ๋์ ๊ฐ์ฅ ๋ง์ ์ด๋์ ํ ์๋์ฐจ๋ค์ด ์ฐ์นํ๋ ๊ฒ์ด๋ค. ๋๋ถ์ด, ์ฌ์ฉ์๊ฐ ํ์๋ฅผ ์ ๋ ฅํ ๋์ ๋ณ๋ค๋ฅธ ์ ํ ์กฐ๊ฑด์ด ์์ง๋ง ์๋ ํ์์ ๋ฐ๋ผ ์๋์ฐจ๋ค์ด ์ด๋ํด์ผ ํ๋, ์์/์์/๋ฌธ์ ๋ฑ์๋ ์ ํ ์กฐ๊ฑด์ ๊ฑธ์ด๋์ด๋ ์ข๊ฒ ๋ค.
โ
์ ์งํ๋ ์กฐ๊ฑด์ 0์์ 9 ์ฌ์ด์์ ๋ฌด์์ ๊ฐ์ ๊ตฌํ ํ, ๋ฌด์์ ๊ฐ์ด 4 ์ด์์ผ ๊ฒฝ์ฐ์ด๋ค.
๐ ์๋์ฐจ๋ค์ด ์ ์งํ๋ ์กฐ๊ฑด์ (์๋์ฐจ๋ ์ฌ์ฉ์๋ ์๋, ์ปดํจํฐ == ๋๋ค API๊ฐ) 0๊ณผ 9 ์ฌ์ด์ ๋ฌด์์ ์ซ์๋ฅผ ๊ตฌํด์ฃผ๋ฉด, ๊ทธ ๊ฐ์ ๋ฐ๋ผ ์ ์งํ ์ง ๋ง์ง ์ ํด์ง๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ๋๋ค ์์ฑ๊ธฐ๊ฐ pobi์๊ฒ 3์, woni์๊ฒ 4๋ฅผ, jun์๊ฒ 9๋ฅผ ์ค๋ค๋ฉด? woni์ jun๋ง ์ ์งํ ์ ์๋ค ( == ํ์ดํ ํ๋๋ฅผ ์ฐ์ ์ ์๋ค)
โ
์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์์ ์๋ฃํ ํ ๋๊ฐ ์ฐ์นํ๋์ง๋ฅผ ์๋ ค์ค๋ค. ์ฐ์น์๋ ํ ๋ช
์ด์์ผ ์ ์๋ค.
๐ ํ๋ก๊ทธ๋จ์ด ๋๋๋ ๊ฒ ์๋๋ผ ๊ฒ์์ด ๋๋๋ฉด, ์ต์ข ์ฐ์น์๋ฅผ ์๋ ค์ฃผ๋๋ฐ, ์ด๋ ์ฐ์น์๋ ํ ๋ช ์ผ ์๋ ์๊ณ , ์ฌ๋ฌ ๋ช ์ผ ์๋ ์๋ค. ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ํ์๋์ '๊ฐ์ฅ ๋ง์ด ์ด๋ํ ์๋์ฐจ'๊ฐ ์ฐ์นํ๋ ๊ฒ์ด๋ค. ์ฆ, 5ํ์ ์๋๋์ 5ํ๋ฅผ ์ด๋ํ ์ฐจ๊ฐ ์ฐ์นํ๋ ๊ฒ ์๋ ์๋ ์๋ค.
โ
์ฐ์น์๊ฐ ์ฌ๋ฌ ๋ช
์ผ ๊ฒฝ์ฐ ์ผํ(,)๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ๋ถํ๋ค.
๐ ์์์ ์ธ๊ธํ๋ฏ ์ฐ์น์๊ฐ ์ฌ๋ฌ ๋ช ์ด๋ผ๋ฉด ๊ฐ ์ด๋ฆ์ด ๊ผญ ์ผํ๋ก ๊ตฌ๋ถ๋์ด์ผ ํ๋ค. ํ์ดํ์ด๋ ์จ์ ๋ ์๋๋ค. ํ์ง๋ง ์ด ์๊ตฌ์ฌํญ ๋ํ ์ ๋งคํ๋ ๊ฒ ํ ์คํธ๋ก๋ ์ผํ๋ฅผ ์ด์ฉํ๋ผ๋ฉด์ ์คํ ๊ฒฐ๊ณผ ์์์์๋ ์ผํ์ ๊ณต๋ฐฑ์ด ์์๋ค. ๋ด๊ฐ ๋ณธ ๊ฒ ๋ง๋ ์ถ์ด ๋๋๊ทธ๋ฅผ ๊ทธ์ด ๊ณต๋ฐฑ๊น์ง ํ์ธํ๋ค๊ตฌ.. ๋ญ์ง ํจ์ ์ธ๊ฐ.. ์ถ์๋ค.
โ
์ฌ์ฉ์๊ฐ ์๋ชป๋ ๊ฐ์ ์
๋ ฅํ ๊ฒฝ์ฐ throw๋ฌธ์ ์ฌ์ฉํด "[ERROR]"๋ก ์์ํ๋ ๋ฉ์์ง๋ฅผ ๊ฐ์ง๋ ์์ธ๋ฅผ ๋ฐ์์ํจ ํ, ์ ํ๋ฆฌ์ผ์ด์
์ ์ข
๋ฃ๋์ด์ผ ํ๋ค.
๐ ์ฌ์ฉ์๊ฐ ์๋ชป๋ ๊ฐ (์๋์ฐจ ์ด๋ฆ, ์๋ ํ์)๋ฅผ ์ ๋ ฅํ์ฌ ์์ธ ์ํฉ์ ๋ํด 1) throw๋ฌธ์ ์ฌ์ฉํ๊ณ (2) ๊ผญ [ERROR]๋ก ์์ํ๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ฉฐ (3) ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฆ์ ์ข ๋ฃ๋๋๋ก ํด์ผ ํ๋ค. ์ด ํ ๋ฌธ์ฅ์ ๋ฌด๋ ค ์ธ ๊ฐ์ง ์๊ตฌ์ฌํญ์ด ๋ด๊ฒจ ์์ผ๋ ์ ์ํ์.
๐จ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ - ์คํ ํ๊ฒฝ
โ Node.js 18.17.1 ๋ฒ์ ์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค.
๐ Node ๋ฒ์ ์ฒดํฌ ํ์๋ค. ์์ ํ ๋ ํ์ธํ๋๋ผ๋ ์ ์ถํ๊ธฐ ์ง์ ์ ๋ค์ ํ๋ฒ ํด๋น ๋ฒ์ ์์ ์ ๋์๊ฐ๋์ง ํ์ธํ์.
โ ํ๋ก๊ทธ๋จ ์คํ์ ์์์ ์ App.js์ play ๋ฉ์๋๋ค.
๐ App.js๋ก ๊ฒ์์ ์คํํ ์ ์๋ ์ง๋ 1์ฃผ ์ฐจ์๋ ๋ฌ๋ฆฌ, ์ด๋ฒ 2์ฃผ ์ฐจ๋ App ํด๋์ค๊ฐ index.js์ import ๋์ด node ํ๊ฒฝ์์ index.js๋ฅผ ์คํํ ์ ์์๋ค. ๋งค ๋ฏธ์ ๋ง๋ค ์คํ ํ๊ฒฝ์ด๋ ์๊ตฌ ์ฌํญ์ด ์์ ํ ๋๊ฐ์ง ์์ ํ ๋ ์ด๋ฏธ ์๊ณ ์๋ ๊ฒ์ด๋ผ๋ ๋ค์ ์ฝ์ด๋ณด๋ ๊ฒ์ด ์ข๊ฒ ๋ค.
โ package.json์ ๋ณ๊ฒฝํ ์ ์๊ณ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(jQuery, Lodash ๋ฑ)๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ์์ Vanilla JS๋ก๋ง ๊ตฌํํ๋ค.
๐ ํ์ง๋ง ํ์๋ ์ง๋ 1์ฃผ ์ฐจ์ ๋๊ฐ์ด ESLint์ Prettier๋ฅผ ์ฌ์ฉํ๊ณ , ๋ณ๊ฒฝ๋ package.json ๋ด์ญ์ ๊ตณ์ด push ํ์ง ์์๋ค.
โ JavaScript ์ฝ๋ ์ปจ๋ฒค์ ์ ์งํค๋ฉด์ ํ๋ก๊ทธ๋๋ฐํ๋ค.
๐ Airbnb ์ฝ๋ ์ปจ๋ฒค์ ์ ํ๋ํ๋ ๋ณด๊ณ ๋ฐ๋ฅด๊ธฐ์๋ ๋๋ฌด ๋ฒ๊ฑฐ๋ก์ ๊ธฐ์ ESLint์ Prettier๋ฅผ ์ค์ ํด์ ์ปจ๋ฒค์ ์ ๋ง์ถ์๋ค.
โ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์ process.exit()๋ฅผ ํธ์ถํ์ง ์๋๋ค.
๐ ๋ณดํต ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ ๋ Console.Close()๋ process.exit()๋ฅผ ์ฌ์ฉํ๊ณ ๋ ํ์ง๋ง, ์ฌ๊ธฐ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๋๋ค. ์ง๋ 1์ฃผ ์ฐจ ๋ฏธ์ ์์๋ ๊ฒ์ ์ข ๋ฃ ์ '๊ฒ์ ์ข ๋ฃ' ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ์ง๋ง, 2์ฃผ ์ฐจ๋ ์์์ ์ธ๊ธํ ๋ฏ์ด throw๋ฌธ์ ์ฌ์ฉํด ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ๊ทธ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋๋ก ํ๋ค.
โ ํ๋ก๊ทธ๋จ ๊ตฌํ์ด ์๋ฃ๋๋ฉด ApplicationTest์ ๋ชจ๋ ํ ์คํธ๊ฐ ์ฑ๊ณตํด์ผ ํ๋ค. ํ ์คํธ๊ฐ ์คํจํ ๊ฒฝ์ฐ 0์ ์ฒ๋ฆฌํ๋ค.
๐ ์ด๋ฒ ๋ฏธ์ ์ ApplicationTest๋ ์ด 3๊ฐ์ ํ ์คํธ์๊ณ , ์ด ์ธ ๊ฐ์ง ํ ์คํธ๋ฅผ ๋ชจ๋ ํต๊ณผํด์ผ ํ๋ค.
โ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ์์ ๋ฌ๋ฆฌ ๋ช ์ํ์ง ์๋ ํ ํ์ผ, ํจํค์ง ์ด๋ฆ์ ์์ ํ๊ฑฐ๋ ์ด๋ํ์ง ์๋๋ค.
๐ ๋ํดํธ๋ก ์๋ ํ์ผ(package.json, package-lock.json ๋ฑ)๊ณผ ์ฝ๋, ํด๋๋ ๊ตณ์ด ๊ฑด๋ค์ง ์์๋ค. ํน์๋ ์ง์ ํ๋ซํผ ์์ ํ ์คํธ์ ํต๊ณผํ์ง ๋ชปํ ๊น ๋ด ๊ต์ฅํ ์กฐ์ฌ์ค๋ฌ์ ๋ ๊ฒ๋ ์๋ค. ์๊ตฌ์ฌํญ์ ์ ๋ฃ๋ ๊ฐ๋ฐ์๊ฐ ๋์!
๐จ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ - ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โ @woowacourse/mission-utils์ Random ๋ฐ Console API๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ผ ํ๋ค.
โ Random ๊ฐ ์ถ์ถ์ Random.pickNumberInRange()๋ฅผ ํ์ฉํ๋ค.
โ ์ฌ์ฉ์์ ๊ฐ์ ์ ๋ ฅ๋ฐ๊ณ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ Console.readLineAsync, Console.print๋ฅผ ํ์ฉํ๋ค.
๐ 1์ฃผ ์ฐจ์ ๋ง์ฐฌ๊ฐ์ง๋ค. ๊ตณ์ด ๋ฐ๋ก ๋ง๋ค์ง ์๊ณ ์ฐํ ์ฝ์์ ์ ๊ณตํ๋ utils๋ค์ ์ฌ์ฉํด ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ์ ํ๋ฉด ๋๋ค.
โ 2์ฃผ ์ฐจ๋ถํฐ ์ถ๊ฐ๋ ์๊ตฌ์ฌํญ
โ indent(์ธ๋ดํธ, ๋ค์ฌ ์ฐ๊ธฐ) depth๋ฅผ 3์ด ๋์ง ์๋๋ก ๊ตฌํํ๋ค. 2๊น์ง๋ง ํ์ฉํ๋ค.
๐ ์ด๋ฒ๋ถํฐ ์๋กญ๊ฒ ์ถ๊ฐ๋ ์๊ตฌ์ฌํญ์ด์ง๋ง, ์ฌ์ค ํจ์ ํ๋์ 15์ค ์ด์ ๋์ด๊ฐ๊ณ depth๊ฐ ๋ง์์ง๋ฉด ํ ๊ฐ์ง ์ผ์ ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฐ๋ผ์ indent depth๋ฅผ ์ค์ด๊ณ ์ ํ๋ค๋ฉด ํจ์ ๋๋ ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋๋ค. ๋๋ถ์ด, ๋ง์ ์ด๋ค์ด depth์ ๋ํด ์ปค๋ฎค๋ํฐ์ ์ง๋ฌธ์ ๋จ๊ฒผ๋๋ฐ, ์๋ฅผ ๋ค์ด while๋ฌธ ์์ if๋ฌธ์ด ์์ผ๋ฉด ๋ค์ฌ ์ฐ๊ธฐ๋ 2์ด๋ค.
โ
Jest๋ฅผ ์ด์ฉํ์ฌ ๋ณธ์ธ์ด ์ ๋ฆฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ด ์ ์ ๋์ํจ์ ํ
์คํธ ์ฝ๋๋ก ํ์ธํ๋ค.
๐ ์น์ ํ๊ฒ๋ ํ ์คํธ ๋๊ตฌ ์ฌ์ฉ๋ฒ์ด ์ต์ํ์ง ์์ ์ฌ๋๋ค์๊ฒ ์์ ๋ก ์ฃผ์ด์ง StringTest.js๋ผ๋ ํ์ผ์ด ์ฃผ์ด์ก๋ค. ๋๋ ํ ์คํธ ์ฝ๋ ์์ฑ์ด ์ฒ์์ด๋ผ ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ์ตํ ํ ๋จ์ ํ ์คํธ๋ค์ ๊ตฌํํ๋ค.
๐ ๋ฏธ์ ์ ํตํด ๋ฐฐ์ด ์
1๏ธโฃ ๊ธฐ๋ฅ ๋ช ์ธ์ ์์ฑ ๋ฐฉ๋ฒ
์ง๋ 1์ฃผ ์ฐจ์ ์ด์ด ์ด๋ฒ ์ฃผ์๋ ๊ธฐ๋ฅ ๋ช ์ธ์ ๊ณต์ ๋ง์ด ๋ค์๋ค. ๋จ์ํ ๋ณด๊ธฐ ์ข๊ฒ ๊พธ๋ฏผ๋ค๊ธฐ๋ณด๋ค, (ํนํ ํ์ตํ๋ ๋จ๊ณ์์๋) ์๊ตฌ์ฌํญ์ ๊ผผ๊ผผํ ๋ถ์ํ๊ณ ๋ก์ง์ ๊ตฌ์ํ๋ ์ฐ์ต์ ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
ํนํ ์์ผ๋ก 3์ฃผ ์ฐจ 4์ฃผ ์ฐจ๋ถํฐ ์๊ตฌ์ฌํญ๋ ๋ง์์ง๊ณ ๋ก์ง๋ ๋ณต์กํด์ง ํ ๋ฐ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์์ฑํด ๋ณด๋ฉด์ ๋๋ง์ ๋ฐฉ๋ฒ, ๋ ๋์๊ฐ ํ ํ๋ฆฟ๊น์ง ๊ฐ์ถฐ๋๊ณ ์ถ์๋ค. ๋๋๋์๊ฐ ์ต์ข ์ฝ๋ฉํ ์คํธ๋ ์ด๋ฌํ ๊ณผ์ ์ ์์ฃผ ์งง๊ฒ ๊ฐ์ ธ๊ฐ๋ฉด์ ๊ธฐ๋ฅ ๊ตฌํ์ ์๊ฐ์ ์๊ณ ์ถ์๋ค.
์์ ๊ฐ์ด ์ด๋ฒ ๋ฏธ์ ์์ ์ฐํ ์ฝ๊ฐ ์ ์ํ ๋ชฉํ(ํจ์ ๋ถ๋ฆฌ, ํ ์คํธ ์ฝ๋ ์์ฑ), ๊ทธ๋ฆฌ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉํ(MVC ํจํด ์ ์ฉ, ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ)๋ฅผ ๊ธฐ์ฌํ๋ค. ๋ชฉํ๋ฅผ ์ ์ด๋๋ ์ด๋ฒ ๋ฏธ์ ์์ ๋ฌด์์ ์ป์ด๊ฐ๊ณ ์ ํ๋์ง, ๋ฌด์์ ๋ ์ ๊ฒฝ ์จ์ผ ํ๋์ง ์ฃผ๋ชฉํ๊ฒ ๋์๋ค. ์ดํ ์ด ๋ชฉํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ณ ํ ์๋ ์๊ฒ ๋ค.
์ถ๊ฐ๋ก, ์ปจ๋ฒค์ ๋ ์ถ๊ฐํ๋ค. ๋ฌผ๋ก ๊ณตํต์ผ๋ก ์ง์ผ์ผ ํ๋ ์ปจ๋ฒค์ ์ ๋ฌด์กฐ๊ฑด ์ง์ผ์ผ ํ๊ณ , ์ด ์ธ์ ์ปค๋ฐ ๋ฉ์์ง๋ ํ์ผ๋ช ์ปจ๋ฒค์ ๋ฑ์ ๋ฐ๋ก ์ ๋ต์ด ์ ํด์ ธ ์์ง ์์ ๋ด๊ฐ ์์นญ ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฒด ๊ท์น์ ์ ํ๋ค. ์ฝ๋๋ฅผ ์๊ฐ ์์ด ์ด ๊ฒ ์๋๋ผ, ๋๋ฆ์ ๊ท์น์ ๊ฐ์ง๊ณ ์์ฑํ๋ค๋ ์ ์ ๋ถ๊ฐํ๊ณ ์ถ๊ธฐ๋ ํ๋ค.
2๏ธโฃ ์ ์ฐจ ์งํฅ vs. ๊ฐ์ฒด ์งํฅ
์ง๋ 1์ฃผ ์ฐจ์๋ ์ ์ฒด์ ์ธ ํ๋ก์ฐ์ ํจ๊ป, ๊ฐ ๋จ๊ณ์ ๋ฐ๋ผ ํ์ํ ํด๋์ค์ ๋ฉ์๋ ๋ฐ ๋ณ์๊น์ง ์์ฃผ ์์ธํ๊ฒ ์ ์ํ์ผ๋, ๋ช๋ช ์ด์ ๋ก ํ์์ ์กฐ๊ธ ๋ฐ๊พธ์๋ค.
์ด๋ฒ ๋ฏธ์
์ ์ด๋ ์ ๋ ๋ฏธ์
์ฌ์ดํด์ ์ต์ํด์ง๊ธฐ๋ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค ๋ก์ง์ ๋ฆฌํฉํ ๋ง ๋ฑ์ผ๋ก ์ธ์ ๋ ์ง ๋ฐ๋ ์ ์๊ธฐ์, ๋ก์ง์ ๋ฐ๊พธ๋ฉด ์ถํ ๊ธฐ๋ฅ ๋ช
์ธ๊น์ง ๋ณ๊ฒฝํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์๋ค. ์ ์ฐจ์ ๋ฐ๋ผ ์์ธํ๊ฒ ๊ธฐ์ฌํด ๋๋ฉด How์ ๋ํด์๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๊ฟ ์๋ ์์ด์ผ ํ๋๋ฐ, ์ฌ๊ณ ๊ฐ ๊ฐํ๋ ๋๋์ด ๋ค๊ธฐ๋ ํ๋ค.
์ ๋ฆฌํ์๋ฉด, ์ด๋ฒ์๋ How๋ณด๋ค๋ ์์ธ์ฌํญ์ ํฌํจํด ํด๋น ๊ธฐ๋ฅ์์ ๊ตฌํ๋์ด์ผ ํ๋ What์ ์ค์ฌ์ผ๋ก ์ ์๋ค.
์์ ๊ฐ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ์ด๋ณด์๋ค. ํ๋๋ ์ ์ฐจ ์งํฅ์ผ๋ก How๋ฅผ ๊ฐ๋จํ๊ฒ ์ ๊ณ , ํ๋๋ ๊ฐ์ฒด ์งํฅ์ผ๋ก ๊ฐ ๊ฐ์ฒด๊ฐ ์ด๋ค ์ญํ ์ ํด์ผ ํ๋์ง๋ฅผ ์ ์ด์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์๊ฐํ๋ค.
์ฌ์ค ์์ฆ ํ๋ก ํธ ์ชฝ์์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๋์ธ๋ผ์ง๋ง, ์ฐํ ์ฝ์์๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์งํฅํ๋๋ฏํด์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์งํฅํ๊ธฐ๋ก ํ๋ค. ๋ฌผ๋ก ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ด ๋ฌด์จ ๋์๋ ์ถ๊ธด ํ๊ฒ ๋ค๋ง, ์ด๋ฒ ๊ธฐํ์ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ ํ์ตํ๋ฉฐ ์ ์ฉํ๋ ค๋ ๋ ธ๋ ฅ ๊ทธ ์์ฒด๊ฐ ์ถฉ๋ถํ ์๋ฏธ ์์ ๊ฒ ๊ฐ์๋ค. ์ ๋ต์ ์๋ค. ๋ณธ์ง์ ์ผ๋ก๋ ์๊ตฌ์ฌํญ ํ์ ์ด๋๊น.
๊ทธ๋ฌ๋ ์ ์ฐจ ์งํฅ์ด๋ , ๊ฐ์ฒด ์งํฅ์ด๋ ํ๋์ ๋ฌธ์ ๋ฅผ ๋ค์ํ ์๊ฐ์์ ๋ณด๊ธฐ๋ก ํ๋ค. ์ ์ฐจ ์งํฅ์ผ๋ก ๋จ๊ณ๋ฅผ ํ๋ํ๋ ์ง์ผ๋ฉด์ ๊ฒ์ ๋จ๊ณ๋ณ๋ก ๊ตฌํํด์ผ ํ๋ ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง ํ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ MVC ํจํด์ ๊ณต๋ถํ๋ฉด์ ๊ฐ ๊ฐ์ฒด์ ์ญํ ์ ์ด๋ป๊ฒ ๋ฐฐ์นํ ์ง ๊ณ ๋ฏผํ๋ค.
3๏ธโฃ MVC ํจํด์ ๋ณธ์ง
์ด ๋ถ๋ถ์ ๋ํด์๋ ๋๋ ๊ณ ๋ฏผ์ด ๋ง์๊ณ , ์ปค๋ฎค๋ํฐ์์๋ ํ ๋ก ์ด ํ๋ฐํ๋ค. ๋ค๋ค MVC, MVC ์ด์ผ๊ธฐํ๋๋ฐ ์ด๊ฑธ ์ฐ๋ฉด ์ข์ ๊ฑด๊ฐ? ์ ๋ํ ๋ฉ๋์ด ๋์ง ์์๋ ๋ณด๋ค. ๊ทธ๋์ ๋ ๋ํ ๋ฌด์ง์ฑ์ผ๋ก ํจํด์ ์ฌ์ฉํ๊ธฐ๋ณด๋ค ์ค์ค๋ก ๋ฉ๋ ๊ฐ๋ฅํ ์ด์ ๋ฅผ ์ฐพ๊ธฐ๋ก ํ๋ค.
์ฐ์ MVC์ ๋ณธ์ง๋ถํฐ ์์๋ณด๊ณ ์ ํ๋ค. ์ด MVC๋ผ๋ ๊ฐ๋ ์ด ์ด๋ป๊ฒ ๋ฑ์ฅํ๋์ง๋ฅผ ์๋ฉด ๊ทธ์ ๋ง๊ฒ ์ธ ์ ์์ ๊ฒ ๊ฐ์์๋ค. (์ฐธ๊ณ : MVC ์ฐฝ์์๊ฐ ๋งํ๋, MVC์ ๋ณธ์ง) ์จ๋ฐ ์ผ์ด๊ฐ ์ฐฝ์ํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object oriented Programming)์ ๋ค์๊ณผ ๊ฐ์ ๊ณ ๋ฏผ์์ ์์๋์๋ค๊ณ ํ๋ค.
์ข์ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด์
์ด๋ค ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๋๋๊ณ ๋ฌถ์ด์ค์ผ ํ ๊น?
์ด๋ค ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์ถ์ํํด์ผ ํ ๊น?
์ฌ๊ธฐ์ ๋ํด, ํธ๋ผ์ด๋ธ๋ผ๋ ์ฌ๋์ (1) ๋น์ฆ๋์ค ๋ก์ง๊ณผ (2) ์๊ฐ์ ์ธ UI, ๊ทธ๋ฆฌ๊ณ (3) ๋ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ ๋ถ๋ถ์ ์ฝ๋ ์์์ ๋ถ๋ฆฌํ๊ณ ์ญํ ๋ถ์ฌ๋ฅผ ํด์ค์ผ ํ๋ค๋ ์๊ฐ์ ํ๋ค๋๋ฐ, ์ด ๋ ์ฌ๋์ ๋ง์ ๋ฃ๊ณ ๋ณด๋ MVC ํจํด์ด ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ๋ฅผ ์กฐ๊ธ์ ์ ์ ์์๋ค.
๊ณง, MVC์ ๋ณธ์ง์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ์ธ ๊ฒ์ด๋ค. ์ข์ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฝ๋ ํน์ ๋ชจ๋์ ์ญํ ์ ๋๋๊ณ , ๊ฐ์ ์ญํ ์ ๋ฐ๋ผ์ ์์ง์ด๋ฉฐ, ์๋ก๊ฐ ์๋ก์๊ฒ ์ํฅ์ ๋ฐ์ง ์๊ณ ์ฝ๋์ ์ค๋ณต์ ์ค์ผ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ ์ง๋ณด์๋ ํธํ๊ณ , ์ข์ ์ฝ๋๋ผ๊ณ ํ ์ ์๋ ๊ฒ์ ๊ฐ๊น์์ง๋ค.
์ฐธ๊ณ ํ ๊ธ์์๋ ๋งํ๋ ๋ฏ, ์ฌ์ค ๊ฐ์ฒด์งํฅ์ด๋ ์ ์ฐจ์งํฅ์ด๋ MVC ํจํด์ด๋ , ์ด์จ๋ ๋ชฉ์ ์ ํ๋๋ค. ์ ์ง๋ณด์ํ๊ธฐ ํธํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ์๋จ์ด๋ค.
4๏ธโฃ MVC ํจํด ์ ์ฉํ๊ธฐ
์ด๋ ๋ฏ ๋ณธ์ง๊ณผ ๋ชฉ์ ์ ๋ํด ์ดํดํ๊ณ ๋๋ MVC ํจํด์ ์ ์ฉํ๊ธฐ๊ฐ ์์ํด์ก๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๋ 1์ฃผ ์ฐจ ๋ฏธ์ ์์ ์์ฌ์ ๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ MVC ํจํด์ ํตํด ์ ์ฉํ๋ฉด์ ๊ฐ ํด๋์ ์ฝ๋๋ค์ ๋ชฉ์ ์ ๋ ์ ํ์ ํ๊ธฐ ์ฌ์ ๋ค. ๋๋ ์๋์ ๊ฐ์ด MVC ํจํด์ ์ ์ฉํด ๋ณด์๋ค.
์ฐ์ ์ ์ฒด์ ์ธ ๋ก์ง์ ์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด → Controller๊ฐ ์ค์ฌ์ ์ญํ ์ ํ๊ณ → View๋ก ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์์ → Model์ ์์ฑํ์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ๋ค. → ๊ทธ๋ฆฌ๊ณ ๋ค์ Controller๋ผ๋ ์ค์ฌ์๊ฐ View๋ก ์ฌ์ฉ์์๊ฒ ์๋ต์ ์ฃผ๋๋ก ์ค๊ณํ๋ค. ์ด ์ค Model(Car.js)์์๋ ๊ฐ ์๋์ฐจ๋ค์ ๋ฐ์ดํฐ (name, position)์ ์ ์ฅํ๋ค. ์ฌ๊ธฐ์ ์๋์ฐจ๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํ๋๋ ์ด๋ฆ์ด๋ผ๋ ์์ฑ์ด ์๊ณ , Car๋ง์ด ๊ฐ์ง๋ '๋ฌ๋ฆฐ๋ค'๋ผ๋ ๊ณ ์ ํ ๋์์ ์ ์ํ๋ค.
View๋ ์ฌ์ฉ์๊ฐ ์๋์ฐจ ์ด๋ฆ๊ณผ ์๋ ํ์๋ฅผ ์ ๋ ฅํ๊ณ ๊ฒ์ฌํ๋ inputView์, ์ฌ์ฉ์์๊ฒ ๊ฒฐ๊ณผ ๊ฐ์ ์ถ๋ ฅํ๋ outputView๋ก ๊ตฌ์ฑํ๋ค. ๋ง์ง๋ง์ผ๋ก Controller๋ ์์ Model๊ณผ View ์ฌ์ด์์ ๋น์ฆ๋์ค(๋๋ฉ์ธ) ๋ก์ง์ ์ฒ๋ฆฌํ๋๋ก ์ปจํธ๋กค ํ์์ ์ญํ ์ ํ๊ฒ ํ๋ค.
5๏ธโฃ TDD์ ๋ํ ๊ฒฐ๋ก
์ด๋ฒ์ ํ ์คํธ ์ฝ๋๋ฅผ ์ง๋ฉด์ TDD(Test Driven Development)์ ๋ํด ๊ณต๋ถํด ๋ณด๊ธฐ๋ ํ๋ค. ์ฌ์ค TDD๋ ๋ง์ ๊ฑฐ์ฐฝํด ๋ณด์ด์ง๋ง ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด 'ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ'๋ก์ ์์ ๋จ์์ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ์ด๋ฅผ ํต๊ณผํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ ๊ตฌํ ๋ฐฉ๋ฒ์ด๋ค. (์ฐธ๊ณ : TDD ๋ฐฉ๋ฒ๋ก (ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ) - ์๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌ)
ํ๋ฆฌ์ฝ์ค ์ฐธ์ฌ ์ ๊น์ง๋ง ํด๋ ํ ์คํธ ์ฝ๋๋ผ๋ ๊ฒ์ ์ง๋ณธ ์ ์ด ์์๊ธฐ์ TDD๋ ๋ฌด์จ, Jest ์กฐ์ฐจ๋ ์ต์ํด์ง ์๊ฐ์ด ํ์ํ๋ค. ๊ทธ๋์ ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ง๊ธฐ๋ ํ๊ณ , ๊ธฐ๋ฅ ๊ตฌํ๋ณด๋ค ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์ง๊ธฐ์๋ ์ด์ ๊น์ง ๋ด๊ฐ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ ๋ง์ด ๋ฐ๊ฟ์ผ ํ๊ธฐ์ ์ด๋ ค์ ๋ค. ๊ทธ๋์ TDD๋ฅผ ์งํฅํ๊ธฐ๋ณด๋ค, ์ผ๋จ ํ ์คํธ ์ฝ๋ ์์ฑ์ด๋ผ๋ ๊ฒ์ ํด๋ณด์๋ฅผ ๋ชฉํ๋ก ์ผ์ ๊ณต๋ถํ๊ณ ์ ์ฉํ๋ค. (์ฐธ๊ณ : ํ ์คํธํ๊ธฐ ์ข์ ์ฝ๋ - ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋)
๊ทธ๋ฌ๋ค ํ์ง ๊ฐ๋ฐ์๊ฐ ํผ๋๋ฐฑํด ์ฃผ๊ธธ, ์ฌ์ค ํ์ ์์๋ TDD ์ ์ฉ์ ์ด์์ ์ธ ์ธ๊ณ ๊ฐ๋ค๊ณ ํ ๊น. ์ค์ ๋ก๋ ์ด๋ ค์ด ์ ์ด ์๋ค๊ณ ํ๋ค. ๋ฌผ๋ก ์ข์ ์ ๋ ์๋ค. ๊ทธ๋ ๊ธฐ์ TDD๊ฐ ๋ด ์ฑํฅ๊ณผ ๋ง๊ณ , ์ข์ ๋ฐฉ๋ฒ๋ก ์ด๋ผ๊ณ ์ฒด๊ฐํ๋ ๊ทธ๋ ์ ์ฉํด๋ ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ๊ฒฐ๋ก ์ ๋ด๋ ธ๋ค.
6๏ธโฃ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ ์คํธ
ํ ์คํธ ์ฝ๋์ ์ฐํ ์ฝ์์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Console, Random)๋ค์ utils ํ์ผ์ ๋ชจ์๋๊ณ ๋จ์ ํ ์คํธ๋ฅผ ๋๋ ธ๋ค. ์ด์ฐจํผ ๋ณด์ฅ๋(?) ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ ์ ํ ์คํธ๋ฅผ ๋๋ ค์ผ ํ ๊น ์๊ฐ๋ ๋ค์๋ค. ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ฌ๋๋ง๋ค ์๊ฐ ์ฐจ์ด๊ฐ ์๋ ๊ฒ ๊ฐ์๋ค.
ํ์ง๋ง ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์๊ณ , ๊ทธ๋ค์ util์ด๋ผ๋ ํ๋์ jsํ์ผ, ํ๋์ ํ ์คํธ ํ์ผ์ ๋ชจ์๋๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ๋ ํ๊ณ ์ ํ๋ค. ์ง๊ธ์ ์์ ์ผํ์ฑ ํ๋ก์ ํธ์ง๋ง ์ถํ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌ๋ ์๋น์ค๋ผ๊ณ ๊ฐ์ ํ์ ๋๋ฅผ ์ํจ์ด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๊ฐ ํต์ ํ๊ธฐ ์ด๋ ค์ด ์ธ๋ถ ๋ณ์ ์ค ํ๋์ธ๋ฐ, ๋ง์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด์๊ฐ ์๊ธฐ๋ฉด utils๋ก ๋ชจ์๋์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์์ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ธ๋ถ์ ์ธ ์์ธ์ด ๋ฐ๋์ด๋ ์ฐ๋ฆฌ ์ฝ๋์๋ ์ํฅ์ ๋ ๋ฐ๊ฒ๋ ํ๋์ ๋ ์ด์ด๋ฅผ ์ค๊ฐ์ ๋๋ฌ๊น? ํนํ ๊ท๋ชจ๊ฐ ํฌ๊ณ ์ฌ์ฉ์์ ์ง์ ์ ์ธ interaction์ด ์๋ค๋ฉด ์ต๋ํ ๋ณ๋์ฑ์ ์์ ๊ณ ์ ํ๋ ์ฐจ์์์๋ ๊ณ ๋ฏผํด ๋ณผ ๋ด์ฉ์ธ ๊ฒ ๊ฐ๋ค.
๋น์ทํ ์ด์ ๋ก printMessage๋ฅผ utils๋ก ๋นผ๋๊ณ ํ
์คํธ์ฝ๋๊น์ง ์์ฑํ๋ ๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ค์ ๋ก ํ์
์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋์์ ๋ ๋ด๋ถ์์ ๋จผ์ ๊ฐ์งํ ์ ์๊ธฐ์ ํ
์คํธ๋ฅผ ๋ง๋ ๋ค๊ณ ํ๋ค. ํนํ, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ผ์ ์ฃผ๊ธฐ๋ก ํ์ธํ๋ batch ๊ฐ์ ๊ฒ์ ๋๋ ค์ ์ํ๋ ์๋ต์ด ์ค๋์ง, ์ ์์ ์ผ๋ก ์๋ํ๋์ง ์ฒดํฌํ๋ค๊ณ ํ๋ค.
7๏ธโฃ ํ ์คํธ ์ฝ๋ ์ปค๋ฐ์ ๋ํ ๊ณ ๋ฏผ
ํ ์คํธ ์ฝ๋์ ์์ค์ฝ๋๋ ๋ถ๋ฆฌํด์ ์ปค๋ฐํ ์ง ๊ณ ๋ฏผ์ด ์์๊ณ , ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ปค๋ฎค๋ํฐ์์ ํ ๋ก ์ด ์์๋ค.
# ์์ค ์ฝ๋ ์ปค๋ฐ
feat: ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์๋์ฐจ ์ด๋ฆ์ ์ ํจ์ฑ ๊ฒ์ฌ ๊ธฐ๋ฅ ์ถ๊ฐ
feat: ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์๋ ํ์์ ์ ํจ์ฑ ๊ฒ์ฌ ๊ธฐ๋ฅ ์ถ๊ฐ
# ํ
์คํธ ์ฝ๋ ์ปค๋ฐ
test: ์๋์ฐจ ์ด๋ฆ๊ณผ ์๋ ํ์ ์ ํจ์ฑ ๊ฒ์ฌ ํ
์คํธ ์ฝ๋ ์ถ๊ฐ
๋๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ๋ ์ฌ๋์ ์ ์ฅ์ ๊ณ ๋ คํด ๋ถ๋ฆฌํด์ ์ปค๋ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ๋ณด๋ ์ฌ๋์ ๊ด์ฌ์ฌ์ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด CI/CD (Continuous Integration/Continuous Delivery) ๋ฐฐํฌ ๋จ๊ณ ์ค, CI ๋จ๊ณ์์๋ ํ ์คํธ ์ฌ๋ ธ์ ๋ ํต๊ณผ๋๋ฉด ๋ฆฌ๋ทฐํ๋ ์ฌ๋ํํ ๋ ๊ด์ฌ์ด ์๊ณ ์์ค์ฝ๋๊ฐ ๊ด์ฌ ์์ ๊ฒ์ด๋ค. ๋ฐ๋๋ก ๋ง์ฝ CI๊ฐ ์ ๋๋ก ๋์ง ์๋๋ค๋ฉด, ๊ทธ๋ ๋์ด์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ปค๋ฐ์ผ๋ก ๊ฐ์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ ๊ฒ์ด๋ค.
์ฆ, ๋ณด๋ ์ฌ๋์ ๊ด์ฌ์ฌ๋ฅผ ๊ณ ๋ คํด ์๊ฐ์ ์๊ปด์ฃผ๋ ์ฐจ์์ผ๋ก ์๊ฐํ๋ค.
๐ฉ๐ป๐ง ํธ๋ฌ๋ธ ์ํ
์ผ๋ฐ์ ์ธ ์๋ฌ๋ ๋ฐ๋ก ๋ค๋ฅธ ๊ธ๋ก ๋ฐํํ๊ณ ,
๋ณธ ๋ฏธ์ ์์ ๋ง์ฃผํ ์ ์๋ ๋ช ๊ฐ๋ง ๊ธฐ์ ํฉ๋๋ค.
1๏ธโฃ ์ "pobi : -" ์ถ๋ ฅ์ด ์๋๋๊ฐ
์ด๋ ์ ๋ ๊ธฐ๋ฅ ๊ตฌํ์ ํ๋ค๊ณ ์๊ฐํ๊ณ , Node ํ๊ฒฝ์์ ํ ์คํธํด๋ณด๋ ์ ์๋๋๋ ๋ฏํ๋ค.
๋ถ๋ช Node ํ๊ฒฝ์์๋ "pobi : -" ์ถ๋ ฅ์ด ์ ๋๋๋ฐ.. ์ ์๋์ ๊ฐ์ด ํ ์คํธ ์ฝ๋์์๋ string์ด contain ๋์ด ์์ง ์๋ค๊ณ ํ๋ ๊ฒ์ธ์ง ์ดํด๊ฐ ์ ๋๋ค.
๋ฏ๊ณ ๋ฏ์ด๋ณด๋ค๊ฐ, GPT์๊ฒ๋ ๋ฌผ์ด๋ณด๋ค๊ฐ ์๋์ ๊ฐ์ ํด๋ต์ ์ฐพ์๋ค.
๋ฌธ์ ๋ ์ญ์ ์ฝ๋์ ์์๋ค.
moveCarForwardOrStop() {
this.cars.forEach((car) => {
const randomNumber = generateRandomNumber();
if (randomNumber >= NUMBER.MOVE_FORWARD_REQUIREMENT) {
car.moveForward();
}
});
}
printForwardCarName() {
this.cars.forEach((car) => {
printCar(car.getName(), car.getPosition());
});
printMessage(STRING.BLANK_SPACE);
}
raceCar(tryNumber) {
printResult();
for (let i = 0; i < tryNumber; i += 1) {
this.moveCarForwardOrStop(generateRandomNumber()); // ๋๋ค ์์ฑ๊ธฐ ํ๋ฒ ๋ ํธ์ถ
this.printForwardCarName();
}
}
์ผ๋จ ์ฐํ
์ฝ ์ธก์์ ์ ๊ณตํ ํ
์คํธ์ฝ๋์ธ ApplicationTest.js ์ฝ๋๋ฅผ ์ดํด๋ณด์๋ค. ์ฌ๊ธฐ์ generateRandomNumber ํจ์ (๋ด๊ฐ ์ง ๋๋ค ์์ฑ๊ธฐ)๋ฅผ ๋ชจํนํ๋ฉด์ ๋ฐํ ๊ฐ์ ์ ์ดํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ด๊ฐ ์ง GameController.js ๋ด๋ถ์์ generateRandomNumber ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ด ์๋ชป๋์์ผ๋ ํ
์คํธํ ๋ generateRandomNumber์ ๋ฐํ ๊ฐ์ด ๋๋ค์ด ์๋ ํญ์ ๋์ผํ๊ฒ ์ค์ ๋์๋ ๊ฒ์ด๋ค.
์ฆ, ์๋์ ๊ฐ์ด ํ
์คํธ ์ฝ๋์ ์ด ๋ถ๋ถ์ด ํ
์คํธ ์คํจ์ ์์ธ์ด์๋ ๊ฒ์ด๋ค.
describe('์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์', () => {
test('์ ์ง-์ ์ง', async () => {
// given
const MOVING_FORWARD = 4;
const STOP = 3;
const inputs = ['pobi,woni', '1'];
const outputs = ['pobi : -'];
const randoms = [MOVING_FORWARD, STOP];
const logSpy = getLogSpy();
mockQuestions(inputs);
mockRandoms([...randoms]); // ์ด ๋ถ๋ถ
generateRandomNumber ํจ์์ ๋ฐํ ๊ฐ์ ๋ฐฐ์ด randoms์ ๊ฐ์ผ๋ก “์์ฐจ์ ์ผ๋ก” ์ค์ ํ๋๋ก ๋ชจํน ํ๋ ค๊ณ ํ๋ค. ์ด๋, ๋๋ค ์์ฑ ํจ์๋ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋๋ผ๋ ํญ์ ๋์ผํ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ, ํธ์ถ๋ ๋๋ง๋ค ๋ฌด์์์ ๊ฐ์ด ๋ฐํ๋์ด์ผ ํ๋ค.
๋ฐ๋ผ์ generateRandomNumber ํจ์์ ๋ฐํ์ ์์ฐจ์ ์ผ๋ก ์ค์ ํ๋ฉด, ์์๊ณผ ๋ค๋ฅด๊ฒ ํญ์ ๋์ผํ ๊ฐ์ด ๋ฐํ๋์ด์ pobi์ woni์ ์ด๋์ ๋ฌด์กฐ๊ฑด ๋ฉ์ถ๊ฒ ๋๊ณ , "pobi : -"์ ๊ฐ์ด position์ด 0์ผ๋ก ์ถ๋ ฅ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด์๋ค.
๊ทธ๋์ GameController ์ฝ๋ ๋ด์์ generateRandomNumber ํจ์๋ฅผ ํธ์ถํ๋, ํด๋น ํจ์๊ฐ ํ ์คํธ ์ฝ๋์ '์ ํฉํ' ์์น์์ ์ค์ ๋ก ๋์๋ฅผ ๋ฐํํ๋๋ก ์์ ํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ค.
์๋ฌดํผ 1์ฃผ ์ฐจ์ ์ด์ด, ์ด๋ฒ ์๋ฌ๋ ์๋ฒฝ๊น์ง ๋ถ์ก๊ณ ์๋ค๊ฐ ๋๋ฌด ์ ๋๊ฒ ์ด์ ๋ค์๋ ๋ง์ ์ ์ ์ผ๋ก ์ดํด๋ณด๋ ์ ํด๊ฒฐํ ์ ์์๋ค. ์๋ฌ ํด๊ฒฐ์ ์ธ์ ๋ ํ๋ค์ง๋ง, ์ธ์ ๋ ํต์พํด!
2๏ธโฃ ๊ทธ๋์ '์๊ธฐ์น ๋ชปํ ์ค๋ฅ'....
์ง๋ 1์ฃผ ์ฐจ์๋ ์ง์ ํ๋ซํผ ์์ ํ ์คํธ๋ ํ ๋ฒ์ ํต๊ณผ๊ฐ ๋์๋๋ฐ, ์์ธ์ง ์ด๋ฒ ์ฃผ๋ ํ๋ฒ์ ํต๊ณผ๋ฅผ ๋ชปํ๋ค. ๋คํํ ๋ง๊ฐ ์ ๋ ์ ์ด๋ฐ ์ผ์ด ์๊ฒผ์ผ๋ ๋ง์ ์ด์ง, ๋ง๊ฐ ์๊ฐ ๋ค ๋ผ์ ์ด๋ฌ์ผ๋ฉด ์ ๋ง ๋ฉ๋ถ์ด์์ ๊ฒ ๊ฐ๋ค.
์ฌ๋ฌ ์๋๋ฅผ ํด๋ณด๋ค๊ฐ, ๋ฌธ๋ ์ง์ด๋ ์์ธ์ด ์๊ฐ๋ฌ๋ค. ๋ฐ๋ก '๋๋ฌธ์๋ก ์์ํ๋ ํ์ผ๋ช ์ ์๋ฌธ์๋ก ๋ฐ๊พผ ๊ฒ'์ด๋ค. ์ฒ์์ InputView ํด๋์ค๋ฅผ ๊ตณ์ด ํด๋์คํ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํด ํ์ผ๋ช ๋ํ InputView.js์์ inputView.js๋ก ๋ณ๊ฒฝํ๋ค. ์ด๊ฒ ํ๊ทผ์ด์๋ค.
์์ธ์ git์ด ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด์๋ค. (์ฐธ๊ณ : ํ์ผ๋ช ๋์๋ฌธ์ ์ธ์์ ๋ํ ๊ณ ๋ฏผ) ๊ทธ๋ ๊ธฐ์ InputView๋ฅผ inputView๋ก ๋ณ๊ฒฝํด๋ ๋ฐ๋์ด ์ปค๋ฐ & ํธ์๋์ง ์๋๋ค. ๋๋ถ์ด, import ๋ฌธ์์๋ InputView๋ผ ์ฐ์ฌ์์ด๋ ํ์ผ๋ช ์ inputView๋ผ ๊ธฐ์ฌ๋์๊ธฐ์ ์์ ํ ์คํธ์์ ์ค๋ฅ๊ฐ ์ผ์ด๋ ์ฌ์ง๊ฐ ์๋ ๊ฒ์ด๋ค.
ํด๊ฒฐ์ ์ํด ์์ ๊ฐ์ด inputView ํ์ผ์ ๋ค์ ์์ฑํด์ ์ปค๋ฐํ๋๋ ์ ๋ง ๋คํํ๋ ํต๊ณผ๊ฐ ๋์๋ค. ์ด ์๋ฌ ํด๊ฒฐ์ ์ํด ํ์ ์๋ ์ปค๋ฐ์ ๊ฝค ํด์ ์์ฝ๋ค.. (๋ฌผ๋ก squash merge๋ฅผ ํ๋ฉด ๋์ง๋ง ํน์ ๋ชฐ๋ผ ํ์ง ์์๋ค)
๐งน ๋ฆฌํฉํ ๋ง
1๏ธโฃ ์๋ฌ๋ฅผ ์ํฉ์ ๋ฐ๋ผ ๋๋๊ธฐ
์ง๋ 1์ฃผ ์ฐจ์๋ ์๋ฌ๋ฅผ ์ํฉ์ ๋ฐ๋ผ ๋๋์ง ์์๋ค. ๋ฌด์กฐ๊ฑด ์ ํจํ ์ ๋ ฅ๊ฐ์ด ์๋๋ฉด ๋์ผํ ์๋ฌ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋๋ก ํ์ผ๋, ์ด๋ฒ 2์ฃผ ์ฐจ์๋ ๋ค์ํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋ ๋งํผ, ์๋ฌ ๋ฉ์์ง๋ ์ธ๋ถํํ๋ค. (ํ์ง๋ง ๊ณต๋ฐฑ ๋ฑ ๋ ๋ค์ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ด์ผ ํ๋๋ฐ ๊ทธ๋ฌ์ง ๋ชปํด ์์ฝ๋ค. 3์ฃผ ์ฐจ์๋ ์์ธ์ฒ๋ฆฌ์ ๋ ์ ๊ฒฝ์ ๋ง์ด ์ฐ๊ฒ ๋ค!)
export const getUserInputCarName = async () => {
const input = await Console.readLineAsync(LOG_MESSAGE.INPUT_CAR_NAME);
if (!input) {
throwError(ERROR_MESSAGE.EMPTY_INPUT); // ์
๋ ฅ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
}
if (!isValidCarName(input)) {
throwError(ERROR_MESSAGE.INVALID_CAR_NAME); // ์ค๋ณต ๋๋ 5์ ์ด๊ณผํ ๊ฒฝ์ฐ
}
return input;
}
export const getUserInputTryCount = async () => {
const input = await Console.readLineAsync(LOG_MESSAGE.INPUT_TRY_COUNT);
if (!input) {
throwError(ERROR_MESSAGE.EMPTY_INPUT); // ์
๋ ฅ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
}
if (!isValidTryCount(input)) {
throwError(ERROR_MESSAGE.INVALID_TRY_COUNT); // 1์ด์์ ์ ์๊ฐ ์๋ ๊ฒฝ์ฐ
}
return input;
}
2๏ธโฃ distance → position
Car๋ผ๋ ์๋์ฐจ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ์ด๋ฆ๊ณผ ์ด๋๊ฑฐ๋ฆฌ๋ผ๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๋ง๋ค์์ด์ผ ํ๋ค. ์ฒ์์๋ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ด๋ ๋ณ์ ์ด๋ฆ์ 'distance'๋ผ๊ณ ์ง์๋ค. ๊ทธ๋ฌ๋ค ์๊ฐํด ๋ณด๋ ์ด ๋ณ์์ ์ญํ ์ "์๋์ฐจ๊ฐ ์ด๋๊น์ง ๊ฐ์ด?"๋ผ๋ ๊ฒ์ ๋ฌผ์ด๋ณด๊ณ ์๋ ค์ฃผ๋ ๊ฒ์ด ์๋๊ฐ. ๊ทธ๋ฌ๋ Car๋ฅผ ๋ฐ๋ผ๋ณด๋ ๋๊ตฐ๊ฐ์ ์ ์ฅ์ ๊ณ ๋ คํด์ผ ํ๋ค.
distance๋ Car์ด ๋ณธ์ธ ์์ ์ด "์ ์ด๋ ๊ฑฐ๋ฆฌ๊ฐ ์ด๋งํผ์ด๊ตฐ" ํ๊ณ ํผ์ ์๊ฐํ๋ ๋๋์ด๊ณ , position์ "๋์ ์์น๋ ์ฌ๊ธฐ์ผ"๋ผ๊ณ ์ฌ์ฉ์์๊ฒ ์๋ ค์ฃผ๋ ๋๋์ด ๋ค์ด ๋ ์๋ง๋ค๊ณ ์๊ฐํ๋ค.
๋ค์ ๋งํ๋ฉด, Car ๋ผ๋ ๊ฐ์ฒด์ ์์ฑ๊ณผ ํ์๋ฅผ ์ ์ํจ์ ์์ด ์์ฑ์ position๊ณผ ๊ฐ์ field๊ฐ ๋๊ณ ํ์๋ class์ ๋ฉค๋ฒํจ์๊ฐ ๋ ํ ๋ฐ, Car์ ์์ฑ์ ํํํ๋ ๋ง๋ก ์์น๋ฅผ ๋ํ๋ด๋ 'position'์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํ๋ค.
// Car.js
class Car {
#name;
#position = 0;
// ... ์๋ต
getPosition() {
return this.#position;
}
// ... ์๋ต
3๏ธโฃ ํฉ์น ์ง ๋ง์ง ๊ณ ๋ฏผ๋๋ ํจ์
์๋์ ๊ฐ์ด ์๋์ฐจ๊ฐ ๋๋ค ์์ฑ๊ธฐ๊ฐ ์ฃผ๋ ์ซ์์ ๋ฐ๋ผ ์์ง์ด๊ฑฐ๋ ๋ฉ์ถ๋ ํจ์, ๊ทธ๋ฆฌ๊ณ ์ ์งํ๋ ์๋์ฐจ์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ ํจ์๊ฐ ์๋ค.
// ๋ฆฌํฉํ ๋ง ์
moveCarForwardOrStop() {
this.cars.forEach((car) => {
const randomNumber = generateRandomNumber();
if (randomNumber >= GAME_SETTING.MOVE_FORWARD_REQUIREMENT) {
car.moveForward();
}
});
}
printForwardCarName() {
this.cars.forEach((car) => {
printCar(car.getName(), car.getPosition());
});
printMessage(GAME_SETTING.BLANK_SPACE);
}
์ ๋ ๊ฐ์ ํจ์๋ฅผ ๋๊ณ ๋ดค์ ๋ for each๋ก ์ํ๋ฅผ ํ๋ ๋์์ด ๋์ผํ๋ฐ, ๋ด๋ถ์์ ์กฐ๊ฑด ๋ถ๊ธฐ๋ก ์ถฉ๋ถํ ๋ช ํํ๊ฒ ํํํ ์ ์๋ ๋ถ๋ถ์ด๊ธฐ์ ๊ตณ์ด ๋ ํจ์๋ก ๋๋ ํ์๊ฐ ์๋ค๋ ์๊ฐ์ ํ๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด ํฉ์ณค๋ค.
// 1์ฐจ ๋ฆฌํฉํ ๋ง
moveCarsAndPrintResults() {
this.cars.forEach((car) => {
if (generateRandomNumber(GAME_SETTING.MIN_RANDOM_NUMBER, GAME_SETTING.MAX_RANDOM_NUMBER) >= GAME_SETTING.MOVE_FORWARD_REQUIREMENT) {
car.moveForward();
}
printCar(car.getName(), car.getPosition());
});
printMessage(GAME_SETTING.BLANK_SPACE);
}
ํ์ง๋ง ๋๋ฌธ์๋ก ํํ๋ ์์๊ฐ ๋๋ฌด ๋ง๊ณ ๊ธด ๋ฐ๋ค๊ฐ, ์กฐ๊ฑด์์ด ๊ธธ์ด์ ธ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ก๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด 2์ฐจ ๋ฆฌํฉํ ๋งํ๋ค.
// 2์ฐจ ๋ฆฌํฉํ ๋ง
moveCarsAndPrintResults() {
this.cars.forEach((car) => {
const randomValue = generateRandomNumber(GAME_SETTING.MIN_RANDOM_NUMBER, GAME_SETTING.MAX_RANDOM_NUMBER);
if (randomValue >= GAME_SETTING.MOVE_FORWARD_REQUIREMENT) {
car.moveForward();
printCar(car.getName(), car.getPosition());
}
});
printMessage(GAME_SETTING.BLANK_SPACE);
}
์์ ๊ฐ์ด ๋๋ค ์์ฑ๊ธฐ๋ก๋ถํฐ ๋์ค๋ ๋๋ค ๊ฐ์ ๋ณ์๋ก ์ ์ธํ๊ณ , ์ด ๋ณ์๊ฐ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ฉด ์ด๋ํ๊ณ ์ถ๋ ฅ๋๋๋ก ํ๋ค.
4๏ธโฃ ๊ณต๋ฐฑ์ ์๋ฏธ ์๊ฒ ์ฌ์ฉํ๊ธฐ
์ด๋ฒ ๋ฏธ์ ์ ํ๋ฉด์ ์ง๋ 1์ฃผ ์ฐจ ํผ๋๋ฐฑ์ ์ต๋ํ ๋ฐ์ํ๋ ค๊ณ ํ๋๋ฐ, ๊ทธ์ค ํ๋๊ฐ ๊ณต๋ฐฑ์ด๋ค. ๊ณต๋ฐฑ ๋ผ์ธ์ ์๋ฏธ ์๊ฒ ์ฌ์ฉํ๊ณ ์ ํ๋ค. ์๋ฏธ ์๋ ๊ณต๋ฐฑ์ ์ต๋ํ ์ค์ฌ ์ฝ๋ ์ฌ๋์ผ๋ก ํ์ฌ๊ธ ๋จธ๋ฆฟ์์ ๋ฌผ์ํ๊ฐ ์๊ธฐ์ง ์๋๋ก ํ๋ค.
๋ํ์ ์ผ๋ก ์๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด (1) ๊ธฐ๋ค๋ฆฐ ๊ฒ (2) ์ธํ
ํ๋ ๊ฒ (3) ์ถ๋ ฅํ๋ ๊ฒ. ์ธ ๊ฐ์ง ๋ชฉ์ ์ ๋ฐ๋ผ ์ค๋ฐ๊ฟ์ผ๋ก ๋ถ๊ธฐํ๋ค.
// ๋ฆฌํฉํ ๋ง ์
async play() {
await this.setCars();
const tryCount = await this.handleTryCount();
this.raceCar(tryCount);
const winner = this.getWinner();
printWinner(winner);
}
// ๋ฆฌํฉํ ๋ง ํ
async play() {
await this.setCars(); // ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ
const tryCount = await this.handleTryCount(); // ์ธํ
ํ๋ ๊ฒ
this.raceCar(tryCount);
const winner = this.getWinner(); // ์ถ๋ ฅํ๋ ๊ฒ
printWinner(winner);
}
ํ์คํ ์์ ์ ๋ณด๋ค ๊ฐ ์ญํ ์ด ๋ถ๋ฆฌ๋์ด ๋ณด๊ธฐ ์ข๋ค.
์์ ์ผ์ด์ค๋ฟ๋ง ์๋๋ผ, ๊ทธ ์ธ ๋ค๋ฅธ ์ฝ๋์์๋ const ๋ผ์ธ๊ณผ ๋ฐ๋ก ๋ฆฌํดํ๋ ํจ์ ์ฌ์ด์ ์๋ฏธ ์๋ ๊ณต๋ฐฑ์ด ์์ง๋ ์์์ง๋ ์ฒดํฌํ๋ค. ๋๋ถ์ด, if์ ์ฌ๋ ๊ดํธ '(' ์ฌ์ด์ ๊ณต๋ฐฑ์ด ์๋์ง, single quote๋ก ์ ๋์ด ์๋์ง, ๋ถํ์ํ ์ฃผ์์ด ์์ง ์์์ง ๋ฑ๋ฑ ์ปจ๋ฒค์ ์ ๊ผผ๊ผผํ๊ฒ ์ฒดํฌํ๋ค.
์ปจ๋ฒค์ ์ ๋ชจ๋์ ์ฝ์์ด์ ๊ท์น์ด๋ ์ง์ผ์ผ ํ๋ ๊ฒ์ด ๋ง์ผ๋๊น!
โ๏ธ 2์ฃผ ์ฐจ ์๊ฐ
1๏ธโฃ ๊ฐ์ ๋ฌธ์ , ๋ค๋ฅธ ํด๊ฒฐ
์ปค๋ฎค๋ํฐ์์ ๊ฐ์ ๋ฌธ์ ์ ๋ํด ๋ค๋ฅด๊ฒ ๋ฐ๋ผ๋ณด๊ฑฐ๋, ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ๋ง์ ํ์ต์ด ๋์๋ค. ํ๋ฆฌ์ฝ์ค ์ฐธ์ฌ ์ด์ ์๋ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ๋ค์ํ ์ฝ๋๋ฅผ ๋ณผ ๊ธฐํ๊ฐ ์ ์์ง๋ง, ํ๋ฆฌ์ฝ์ค ๊ณผ์ ์ ํตํด ๋ ์ข์ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ตํ๋ฉฐ ์ข์๋ ์ธ๊ณ๋ฅผ ๋ํ๊ฐ๊ณ ์๋ ๋๋์ด๋ค. ์ด๋ฒ 2์ฃผ ์ฐจ์๋ ๊ฐ์ฌํ๊ฒ๋ ๋ฌด๋ ค 9๋ช ์ ์ง์์ ๋ถ๋ค๋ก๋ถํฐ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ผ๋ฉฐ '์ด๋ ๊ฒ ์๊ฐํ ์๋ ์๊ตฌ๋'๋ผ๊ณ ๋๊ผ๋ค. ์ฑ์ฅํ ์ ์๋ ๊ธฐํ๋ฅผ ์ฃผ๋ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ์ ๋ง ๊ฐ์ฌํ๋ค.
2๏ธโฃ ๋ฆฌ๋ทฐ์๋ WHY๋ฅผ
์ฝ๋ ๋ฆฌ๋ทฐ์ ๋ํ ์๋ก์ด ๊ด์ ๋ ๋ฐฐ์ ๋ค. ๋จ์ํ “์ด๊ฑด ์ด๊ฒ ๋ ๋์์” ์ ๊ฐ์ด ํ๋ฆฐ ๊ฒ์ ๊ณ ์น๋ ๊ด์ ๋ณด๋ค, “์ด๊ฑด ์ด๋ฌ์ด๋ฌํด์ ๋ ์ข๊ณ , ์ด ์๋ฃ๋ ์ฐธ๊ณ ํด ๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์”๋ผ๋ ๊ตฌ์ฒด์ ์ธ ํผ๋๋ฐฑ์ ์ฃผ๊ณ ๋ฐ์๋ค. ์ด๋ฅผ ํตํด ์ค์ค๋ก๋ ํ์ธ์๊ฒ ์ค๋ช ํ๋ฉฐ ๋ ๊น๊ฒ ๊ณต๋ถํ ์ ์์๊ณ , ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ ๋๋ ์ ๋ ์ข์์ง์ ๋ํ ๋งฅ๋ฝ์ ์ดํดํ ์ ์์ด ํจ๊ณผ์ ์ผ๋ก ํ์ตํ ์ ์์๋ค. 9๋ช ์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๋ ๋์์ ๋๋ 9๋ช ์ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๋๋ฐ, ์ค๋ช ํ๋ ๊ณผ์ ์์ ๋ด ์๊ฒฌ์ ๋ท๋ฐ์นจํ (ํน์ ๊ทธ ์ฌ๋์๊ฒ ๋์์ด ๋ ๋งํ) ์๋ฃ๋ ์ฐพ๊ณ , ๋ ๊น๊ฒ ๊ณต๋ถํ ์ ์์ด ์ผ์์ด์กฐ์๋ค.
3๏ธโฃ ์ฝง๋ ธ๋
2์ฃผ ์ฐจ ๋ฏธ์ ์ ํ๋ฉด์ ์ค์ค๋ก์๊ฒ ๋๋ ์ ์ด ์๋ค. ์ฝง๋ ธ๋๋ฅผ ๋ถ๋ฅด๋ฉฐ ์ฝ๋ฉํ๋ ๋ด ์์ ์ ๋ฐ๊ฒฌํ ๊ฒ์ด๋ค. ํ๋ฆฌ์ฝ์ค ๊ณผ์ ์ ์ ํด๋ผ ์ ์์๊น ๊ฑฑ์ ํ์ง๋ง, ์ฐ๋ ค์๋ ๋ฌ๋ฆฌ ๋งค์ฃผ ๋ช ํํ ๋ชฉํ์ ์๊ตฌ์ฌํญ์ด ์ฃผ์ด์ง๋ ํ๊ฒฝ์ด ๋์๊ฒ๋ ๊ต์ฅํ ์ ๋ง์๋ค. ๋ฌผ๋ก ์ ๋ ์ ๋ชป ์๊ณ ์ฒด๋ ฅ์ ์ผ๋ก ํ๋ค๊ธด ํ์ง๋ง, ๊ฐ์ฌํ๊ฒ๋ ํ๋ฃจํ๋ฃจ ์ฑ์ฅํ๊ณ ์๋ค๋ ๋๋์ ํ์ต์ ์ฌ๋ฏธ์ ์๋๊ฐ ๋ถ๊ณ ์๋ค. ์์ผ๋ก ๋จ์ 2์ฃผ ๋์ ์ฑ์ฅํ ๋ด ๋ชจ์ต์ด ๋งค์ฐ ๊ธฐ๋๋๋ค.
๋๊ธ