๊ฐ์ธ์ ์ผ๋ก๋ ๋ฏธ์ ์ํ์ ํตํด ์ฑ์ฅํ ๊ณผ์ ์ ๊ธฐ๋กํ๊ณ ,
๋๊ตฐ๊ฐ์๊ฒ๋ ์ด ๊ธ์ด ๋์์ด ๋์์ผ๋ฉด ํ๋ ๋ง์์ ๋๋ค :)
๐ ๏ธ 3์ฃผ ์ฐจ ๊ฒฐ๊ณผ๋ฌผ
๐ฎ 3์ฃผ ์ฐจ ๋ฉ์ผ ๋ด์ฉ
1๏ธโฃ 3์ฃผ ์ฐจ ๋ฏธ์ ์ ๋ชฉํ
2์ฃผ ์ฐจ ๋ฏธ์ ์ ๋ชฉํ๋ ํจ์ ๋ถ๋ฆฌ์ ํจ์๋ณ ํ ์คํธ ์์ฑ์ด ๋ชฉํ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ 3์ฃผ ์ฐจ ๋ฏธ์ ์์๋ 2์ฃผ ์ฐจ์์ ํ์ตํ ๊ฒ์ ๋ํด (1) ํด๋์ค(๊ฐ์ฒด)๋ฅผ ๋ถ๋ฆฌํ๋ ์ฐ์ต, (2) ๋๋ฉ์ธ ๋ก์ง์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ์ฐ์ต์ด๋ผ๋ ๋ ๊ฐ์ง ๋ชฉํ๊ฐ ์ถ๊ฐ๋์๋ค.
2๏ธโฃ ํ ์คํธ ์ฐ์ต
์์ง๊น์ง ๋๋ฉ์ธ ๋ก์ง๊ณผ ๋จ์ ํ ์คํธ์ ๊ฐ์ ์ฉ์ด๋ค์ด ๋ฏ์ค ์ ์์ง๋ง, ์ผ๋จ ์์ ๊ธฐ๋ฅ๋ถํฐ ํ ์คํธ๋ฅผ ์์ฑํ๋ ์ฐ์ต์ ์์ํด ๋ณด๊ธฐ๋ก ํ๋ค. 1์ฃผ ์ฐจ ํผ๋๋ฐฑ์์ ์ ๊ณต๋ ์ซ์ ์ผ๊ตฌ ํผ๋๋ฐฑ ๊ฐ์ ํ๋ฐ๋ถ์ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ด์ฉ์ด ์์ผ๋ ์ด๋ฅผ ์ฐธ๊ณ ํ๋ผ๋ ๋ง๋ ์์๋ค.
๐ณ ์ง๋ 2์ฃผ ์ฐจ ๊ณตํต ํผ๋๋ฐฑ
์๋๋ 2์ฃผ ์ฐจ ๋ฏธ์ ๋ง๊ฐ ํ, ๋ชจ๋ ํ๋ฆฌ์ฝ์ค ์ฐธ์ฌ ์ธ์์๊ฒ ๋ฐ์ก๋ ๊ณตํต ํผ๋๋ฐฑ์ด๋ค. ์์ฒญ ์์ธ์ ๋ด์ฉ์ด๋ผ๊ธฐ๋ณด๋ค, ์๊ตฌ์ฌํญ์ ์๋ ๋ด์ฉ๋ค์ ํ๋ฒ ๋ ๊ฐ์กฐํ๊ฑฐ๋ ์ถ๊ฐ๋ก ํ์ตํ ๋งํ ๋ด์ฉ์ด์๋ค. ํนํ ์ด๋ฒ 3์ฃผ ์ฐจ ๋ฏธ์ ์์ ๊ฐ์กฐํ๋ฏ ๊ฐ์ฒด ๋ถ๋ฆฌ ๋ฐ ํ ์คํธ ์ฝ๋ ์์ฑ์ ๊ดํ ๋ด์ฉ์ด ์ฃผ๋ฅผ ์ด๋ฃจ์๋ค.
1. README.md๋ฅผ ์์ธํ ์์ฑํ๋ค
2. ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ฌ๊ฒํ ํ๋ค
3. ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฐ์ดํธํ๋ค
4. ๊ฐ์ ํ๋ ์ฝ๋ฉํ์ง ์๋๋ค
5. ๊ตฌํ ์์๋ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ด๋ค
6. ํ ํจ์๊ฐ ํ ๊ฐ์ง ๊ธฐ๋ฅ๋ง ๋ด๋นํ๊ฒ ํ๋ค
7. ํจ์๊ฐ ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ํ๋์ง ํ์ธํ๋ ๊ธฐ์ค์ ์ธ์ด๋ค
8. JavaScript์์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ดํดํ๊ณ ์ฌ์ฉํ๋ค.
9. ํ ์คํธ๋ฅผ ์์ฑํ๋ ์ด์ ์ ๋ํด ๋ณธ์ธ์ ๊ฒฝํ์ ํ ๋๋ก ์ ๋ฆฌํด ๋ณธ๋ค
10. ์ฒ์๋ถํฐ ํฐ ๋จ์์ ํ ์คํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค
๐ค ๋ฏธ์ ์ ์์,
1๏ธโฃ ๊ธฐ๋ฅ ๋ชฉ๋ก ๋ง๋ค๊ธฐ
๋ฏธ์ ์ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ, ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ, ๊ณผ์ ์งํ ์๊ตฌ ์ฌํญ ์ธ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ํนํ ์ฃผ๋ชฉํด์ผ ํ ์ ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๋ง๋ ๋ค๋ ๊ฒ. ๊ธฐ๋ฅ ๊ตฌํ ์ ๋ชฉ๋ก์ ๋ง๋ค์ด์ ธ ์๋ ๊ฒ์ด ์๋๋ผ, ์ง์ ๋ง๋ค์ด์ผ ํ๋ ๊ฒ ํฌ์ธํธ๋ค.
2๏ธโฃ ์ ์ถ ์ ํ ์คํธ ํ์
๊ธฐ๋ฅ ๊ตฌํ์ ๋ชจ๋ ์ ์์ ์ผ๋ก ํ๋๋ผ๋ ์๊ตฌ ์ฌํญ์ ๋ช ์๋ ์ถ๋ ฅ๊ฐ ํ์์ ์งํค์ง ์์ ๊ฒฝ์ฐ 0์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค. ๊ธฐ๋ฅ ๊ตฌํ์ ์ ๋๋ก ํ๋๋ผ๋ ์ถ๋ ฅ ๊ฐ ํ์์ ์งํค์ง ์์ผ๋ฉด 0์ ์ด๋ผ๋ ์๋ฆฌ๋ค. ๊ธฐ๋ฅ ๊ตฌํ์ ์๋ฃํ ๋ค ํ ์คํธ๋ฅผ ์คํํ์ ๋ ํ ์คํธ๊ฐ ์คํจํ ๊ฒฝ์ฐ 0์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก, ๋ฐ๋์ ํ์ธ ํ ์ ์ถํ๋ค. ํ์๋ Node ํ๊ฒฝ์์ ํ๋ก๊ทธ๋จ์ด ์ ๋์๊ฐ๋์ง ํ์ธํ๊ณ , ๋ก์ปฌ ํ ์คํธ ์ฝ๋ ํต๊ณผ๊น์ง ํ์ธํ๋ค.
๋ฟ๋ง ์๋๋ผ, ์ ์ถ ๊ฐ๋ฅ ๊ธฐ๊ฐ์๋ ๋ฏธ๋ฆฌ PR์ ์ฌ๋ฆฌ๊ณ ์ง์ํ๊ธฐ ํ๋ซํผ์ ์์ ํ ์คํธ๊น์ง ๋ฏธ๋ฆฌ ๋๋ ค๋ณด์๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ง๊ฐ์ด ๋ช ์๊ฐ ๋จ์ง ์์ ์ํ์์ ์ถ์ธก์ด ์ด๋ ค์ด ์๋ฌ์ ๊ธฐ์ฝ ์์ด ์ธ์์ผ ํ๋ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ํ์ธํ์.
3๏ธโฃ Node ๋ฒ์ ํ์ธ ํ์
ํ ์คํธ ํจํค์ง ์ค์น๋ฅผ ์ํด Node.js ๋ฒ์ 18.17.1 ์ด์์ด ํ์ํ๋ค. ๋ณธ์ธ ๋ก์ปฌ์ Node ๋ฒ์ ์ด ๋ช์ธ์ง ๊ผญ ํ์ธ ํ ๋ฏธ์ ์ ์งํํ์. ์ฐธ๊ณ ๋ก Node ๋ฒ์ ํ์ธ์ 'node --version'์ผ๋ก ํ์ธ ๊ฐ๋ฅํ๋ฉฐ, ์ ๋ฐ์ดํธ๋ Node.js ๊ณต์ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ๊ฑฐ๋, ์๋์ ๊ฐ์ด 'nvm install'๋ก ํน์ Node ๋ฒ์ ์ ์ค์นํ ์ ์๋ค.
๐ฑ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ
1๏ธโฃ ๋ก๋ ๋ฏธ์ ์ค๋ช
๋ฏธ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฐํ ์ฝ ํ๋ฆฌ์ฝ์ค ๋ ํฌ์ ์์ผ๋ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋ผ๋ฉฐ, ๊ฐ๋จํ ๊ฒ์ ์ค๋ช ์ ํ์๋ฉด ์ฌ์ฉ์๊ฐ ์ง์ ๋น์ฒจ ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ , ๊ตฌ์ ํ ๋ก๋ ๋ฒํธ ์ค ๋น์ฒจ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ต์ ๋ด๋ ๊ฒ์์ด๋ค.
์ฌ๊ธฐ์ ์ ๊น, ํ์ค์์์ ๋ก๋์ ๋ฏธ์ ์์์์ ๋ก๋ ๊ท์น์ ์๋์ ๊ฐ์ด ๋ค๋ฅด๋ค.
๐ฑ ํ์ค ๋ก๋
๐ ์ฌ์ฉ์๋ ๋ก๋ ๋ฒํธ ์ง์ ์ ํ or ๋๋ค
๐ ๋น์ฒจ ๋ฒํธ๋ ๋ฌด์กฐ๊ฑด ๋๋ค ์ถ์ฒจ
๐ฑ ๋ฏธ์ ๋ก๋
๐ ์ฌ์ฉ์๋ ๋ก๋ ๋ฒํธ ๋๋ค์ผ๋ก ์๋ น
๐ ๋น์ฒจ ๋ฒํธ๋ฅผ ์ง์ ์ ๋ ฅ ํ์
์ฒ์ ์ด ๋ฏธ์ ์ ์ ํ๋ฉด ํท๊ฐ๋ฆด ์ ์๋ค. ํ์ค์์๋ ๋ด๊ฐ ๋น์ฒจ ๋ฒํธ๋ฅผ ์ ๋ ์ ํํ ์ ์๋๋ฐ, ๋ฏธ์ ์์๋ ์ฌ์ฉ์๊ฐ ๋น์ฒจ ๋ฒํธ๋ฅผ ์ง์ ์ ๋ ฅํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ๋ฏธ์ ์ ๋ฏธ์ ์ผ ๋ฟ. ํ์ค์ ๋์ ํ๋ฉด ์คํ๋ ค ๋ ์๊ตฌ ์ฌํญ์์ ๋ฒ์ด๋ ์ ์์ผ๋ ๋ง์ ์๊ฐ์ ํ์ง ๋ง์. (๋ง์น ์๊ธ๋ฌผ ๊ตฌํ๋ ๋ฌธ์ ์์ ์ ์๊ธ์ ๋ฌด๊ฒ๋ฅผ ๊ตฌํ๋์ง ์๋ฌธ์ ํ์ง ๋ง์์ผ ํ๋ ๊ฒ์ฒ๋ผ..)
2๏ธโฃ ๋ก๋ ์คํ ๊ฒฐ๊ณผ ์์
๊ตฌ์
๊ธ์ก์ ์
๋ ฅํด ์ฃผ์ธ์.
8000
8๊ฐ๋ฅผ ๊ตฌ๋งคํ์ต๋๋ค.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]
๋น์ฒจ ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
1,2,3,4,5,6
๋ณด๋์ค ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
7
๋น์ฒจ ํต๊ณ
---
3๊ฐ ์ผ์น (5,000์) - 1๊ฐ
4๊ฐ ์ผ์น (50,000์) - 0๊ฐ
5๊ฐ ์ผ์น (1,500,000์) - 0๊ฐ
5๊ฐ ์ผ์น, ๋ณด๋์ค ๋ณผ ์ผ์น (30,000,000์) - 0๊ฐ
6๊ฐ ์ผ์น (2,000,000,000์) - 0๊ฐ
์ด ์์ต๋ฅ ์ 62.5%์
๋๋ค.
์ด๋ฒ ๋ฏธ์ ๋ํ ์ง๋ 2์ฃผ ์ฐจ์ ๋ง์ฐฌ๊ฐ์ง๋ก (ํน์ ํจ์ฌ ๋ ๊ผผ๊ผผํ๊ฒ) ์ฌ์ฉ์์ ๋ค์ํ ์ธํ์ ์์ํ๋ฉฐ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ด์ผ ํ๋ค. ์๊ตฌ ์ฌํญ์ ๊ผผ๊ผผํ๊ฒ ์ฝ์ง ์์ผ๋ฉด ๋์น๊ธฐ ์ฌ์ด ๊ฒ๋ค์ด ๋ง์ผ๋ ๋์ฑ ๊ผผ๊ผผํ๊ฒ ์ฝ์ด๋ณด์.
์๋ ์๊ตฌ์ฌํญ๋ค์ ์์ฃผ ๊ผผ๊ผผํ๊ฒ ์น์ด๋จน๋ฏ ์ฝ์ด๋ณด์. (์ค์)
3๏ธโฃ ๋ก๋ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ
โ ๋ก๋ ๋ฒํธ์ ์ซ์ ๋ฒ์๋ 1~45๊น์ง์ด๋ค.
๐ ๋ก๋ ๋ฒํธ์ ์ซ์ ๋ฒ์๋ 1 ์ด์ 45 ์ดํ๋ค. ์ด ๋ง์ ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ผญ ํด์ฃผ์ด์ผ ํ๋ค๋ ์๋ฏธ.
โ 1๊ฐ์ ๋ก๋๋ฅผ ๋ฐํํ ๋ ์ค๋ณต๋์ง ์๋ 6๊ฐ์ ์ซ์๋ฅผ ๋ฝ๋๋ค.
๐ 1๊ฐ์ ๋ก๋์๋ ์๋ก ์ค๋ณต๋์ง ์๋ 6๊ฐ์ ์ซ์๋ฅผ ๋ฝ์์ผ ํ๋ค. ๋๋ถ์ด, ๊ฐ ๋ก๋ ๋ฒํธ ๊ตฌ์ฑ์ด ์ค๋ณต๋์ด์๋ ์๋๋ค.
โ ๋น์ฒจ ๋ฒํธ ์ถ์ฒจ ์ ์ค๋ณต๋์ง ์๋ ์ซ์ 6๊ฐ์ ๋ณด๋์ค ๋ฒํธ 1๊ฐ๋ฅผ ๋ฝ๋๋ค.
๐ (๋ก๋ ๋ฒํธ๊ฐ ์๋๋ผ) ์ฌ์ฉ์๊ฐ ๋น์ฒจ ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ์๋ก ์ค๋ณต๋์ง ์๋ ์ซ์ 6๊ฐ, ๊ทธ๋ฆฌ๊ณ ๋ณด๋์ค ๋ฒํธ 1๊ฐ๋ฅผ ๋ฝ๋๋ค. ์ด๋ ๋น์ฒจ ๋ฒํธ ๊ฐ์ ์ค๋ณต์ด ์์ด์๋ ์๋๊ณ , ๋ณด๋์ค ๋ฒํธ์ ๋น์ฒจ ๋ฒํธ ๊ฐ์ ์ค๋ณต์ด ์์ด์๋ ์๋๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ผญ ํด์ฃผ์.
โ ๋น์ฒจ์ 1๋ฑ๋ถํฐ 5๋ฑ๊น์ง ์๋ค. ๋น์ฒจ ๊ธฐ์ค๊ณผ ๊ธ์ก์ ์๋์ ๊ฐ๋ค.
- 1๋ฑ: 6๊ฐ ๋ฒํธ ์ผ์น / 2,000,000,000์
- 2๋ฑ: 5๊ฐ ๋ฒํธ + ๋ณด๋์ค ๋ฒํธ ์ผ์น / 30,000,000์
- 3๋ฑ: 5๊ฐ ๋ฒํธ ์ผ์น / 1,500,000์
- 4๋ฑ: 4๊ฐ ๋ฒํธ ์ผ์น / 50,000์
- 5๋ฑ: 3๊ฐ ๋ฒํธ ์ผ์น / 5,000์
๐ ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ฅด์. ๋๋๋ก์ด๋ฉด ๊ทธ๋๋ก ๋ณต์ฌ ๋ถ์ฌ ๋ฃ๊ธฐ ํด์ ์์ํ ํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค. ๋ํ, 5๊ฐ ๋ฒํธ๊ฐ ์ผ์นํ๋ค๊ณ ํด์ ๋ชจ๋ 2๋ฑ์ด ์๋๋ค. 2๋ฑ์ 5๊ฐ ๋ฒํธ ๊ทธ๋ฆฌ๊ณ ๋ณด๋์ค ๋ฒํธ๊น์ง ์ผ์นํด์ผ ํ๋ค.
โ
๋ก๋ ๊ตฌ์
๊ธ์ก์ ์
๋ ฅํ๋ฉด ๊ตฌ์
๊ธ์ก์ ํด๋นํ๋ ๋งํผ ๋ก๋๋ฅผ ๋ฐํํด์ผ ํ๋ค.
๐ ๋ก๋ ๊ฒ์ ์์ ์, ์ฌ์ฉ์๊ฐ ๊ตฌ์ ๊ธ์ก์ ์ ๋ ฅํ๋๋ฐ ์ด๋ ๊ตฌ์ ๊ธ์ก์ ํด๋นํ๋ ๋งํผ ๋ก๋๋ฅผ ๋ฐํํด์ผ ํ๋ค. ์ด ๋ง์ ์ฆ, ๊ตฌ์ ๊ธ์ก / ๋ก๋ ๊ฐ๊ฒฉ์ผ๋ก ๋๋์ด ๋ก๋ ๊ฐ์๋ฅผ ๋ฑ์ด๋ด์ผ ํ๋ค๋ ๋ง.
โ ๋ก๋ 1์ฅ์ ๊ฐ๊ฒฉ์ 1,000์์ด๋ค.
๐ ์ด ๋ง์ ์ฌ์ฉ์๊ฐ 1,000์ ์ดํ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ 1,000์์ผ๋ก ๋จ์ด์ง์ง ์๋ ์ (e.g. 1,200)๋ฅผ ์ ๋ ฅํ๋ฉด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค๋ ์๋ฏธ๋ค.
โ ๋น์ฒจ ๋ฒํธ์ ๋ณด๋์ค ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
๐ ๋น์ฒจ ๋ฒํธ์ ๋ณด๋์ค ๋ฒํธ๋ ๋๋ค์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋์ ์ฌ์ฉ์์๊ฒ ์ง์ ์ ๋ ฅ์ ๋ฐ์์ผ ํ๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์์์ ์ธ๊ธํ ํ์ค ๋ก๋์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด๋ค. ์ง๊ธ ๋ณด๋ ๋น์ฐํ ์๊ตฌ ์ฌํญ์ด๊ธด ํ๋ฐ, ์ง๊ธ ๋ณด๋ ๊ต์ฅํ ์ค์ํ ๋ฌธ์ฅ์ธ ๊ฒ ๊ฐ๋ค.
โ ์ฌ์ฉ์๊ฐ ๊ตฌ๋งคํ ๋ก๋ ๋ฒํธ์ ๋น์ฒจ ๋ฒํธ๋ฅผ ๋น๊ตํ์ฌ ๋น์ฒจ ๋ด์ญ ๋ฐ ์์ต๋ฅ ์ ์ถ๋ ฅํ๊ณ ๋ก๋ ๊ฒ์์ ์ข ๋ฃํ๋ค.
๐ ์ฌ์ฉ์๊ฐ ๊ตฌ๋งคํ๊ณ ๋๋ค์ผ๋ก ์์ฑ๋ ๋ก๋ ๋ฒํธ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ์ง์ ์ ๋ ฅํ ๋น์ฒจ ๋ฒํธ ๋ฐ ๋ณด๋์ค ๋ฒํธ๋ฅผ ๋น๊ตํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์์ ์ธ๊ธํ ๋น์ฒจ ๊ธฐ์ค๊ณผ ๊ธ์ก์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. ๋๋ถ์ด, ๊ธ์ก์ ๋ฐ๋ผ ์์ต๋ฅ ๊น์ง ๊ณ์ฐํ๋ค. ์ด๊ฒ์ด ์๋ง ์ด ๋ฏธ์ ์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๋ก์ง์ด ์๋๊น ์ถ๋ค.
โ ์ฌ์ฉ์๊ฐ ์๋ชป๋ ๊ฐ์ ์ ๋ ฅํ ๊ฒฝ์ฐ throw๋ฌธ์ ์ฌ์ฉํด ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค. ๊ทธ๋ฐ ๋ค์, "[ERROR]"๋ก ์์ํ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ํด๋น ๋ถ๋ถ๋ถํฐ ์ ๋ ฅ์ ๋ค์ ๋ฐ๋๋ค.
๐ ์ ๋ง ์ค์ํ ํฌ์ธํธ. ์ด ํฌ์ธํธ๋ฅผ ๋ค๋ฆ๊ฒ ๋ด์ ํ ์คํธ๊ฐ ํต๊ณผ๋์ง ์์๋ ์ ์ด ์๋ค. 1, 2์ฃผ ์ฐจ์๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์ฆ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋๋ฐ, ์ด๋ฒ ๋ฏธ์ ๋ถํฐ๋ ํด๋น ๋ถ๋ถ๋ถํฐ ๋ค์ ์ ๋ ฅ์ ๋ฐ์์ผ ํ๋ค. ๋์ค์ฝ๋ ์ปค๋ฎค๋ํฐ๋ฅผ ์ง์ผ๋ณด๋ ์ด ๋ถ๋ถ์ ๊ฝค ๋ง์ ์ฌ๋๋ค์ด ๋์น๋ ๊ฒ ๊ฐ์๋ค. ์ ๋ง ์๊ตฌ์ฌํญ์ ๋ต์ด ๋ค ๋์์๋ค!
๐จ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ - ์คํ ํ๊ฒฝ
โ Node.js 18.17.1 ๋ฒ์ ์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค.
๐ Node ๋ฒ์ ์ฒดํฌ ํ์๋ค. ์์ ํ ๋ ํ์ธํ๋๋ผ๋ ์ ์ถํ๊ธฐ ์ง์ ์ ๋ค์ ํ๋ฒ ํด๋น ๋ฒ์ ์์ ์ ๋์๊ฐ๋์ง ํ์ธํ์.
โ ํ๋ก๊ทธ๋จ ์คํ์ ์์์ ์ App.js์ play ๋ฉ์๋๋ค.
๐ App.js๋ก ๊ฒ์์ ์คํํ ์ ์๋ ์ง๋ 1์ฃผ ์ฐจ์๋ ๋ฌ๋ฆฌ 2,3์ฃผ ์ฐจ๋ 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์ฃผ ์ฐจ๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ๊ทธ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋๋ก ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ 3์ฃผ ์ฐจ๋ ํด๋น ๋ถ๋ถ๋ถํฐ ๋ค์ ์ ๋ ฅ์ ๋ฐ๋๋ค.
โ ํ๋ก๊ทธ๋จ ๊ตฌํ์ด ์๋ฃ๋๋ฉด ApplicationTest์ ๋ชจ๋ ํ ์คํธ๊ฐ ์ฑ๊ณตํด์ผ ํ๋ค. ํ ์คํธ๊ฐ ์คํจํ ๊ฒฝ์ฐ 0์ ์ฒ๋ฆฌํ๋ค.
๐ ์ด๋ฒ ๋ฏธ์ ์ ApplicationTest๋ ์ด 3๊ฐ์ ํ ์คํธ์๊ณ , ์ด ์ธ ๊ฐ์ง ํ ์คํธ๋ฅผ ๋ชจ๋ ํต๊ณผํด์ผ ํ๋ค.
โ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ์์ ๋ฌ๋ฆฌ ๋ช ์ํ์ง ์๋ ํ ํ์ผ, ํจํค์ง ์ด๋ฆ์ ์์ ํ๊ฑฐ๋ ์ด๋ํ์ง ์๋๋ค.
๐ ๋ํดํธ๋ก ์๋ ํ์ผ(package.json, package-lock.json ๋ฑ)๊ณผ ์ฝ๋, ํด๋๋ ๊ตณ์ด ๊ฑด๋ค์ง ์์๋ค. ํน์๋ ์ง์ ํ๋ซํผ ์์ ํ ์คํธ์ ํต๊ณผํ์ง ๋ชปํ ๊น ๋ด ๊ต์ฅํ ์กฐ์ฌ์ค๋ฌ์ ๋ ๊ฒ๋ ์๋ค. ์ฌ์ค src ํด๋ ๋ฐ๋ก ํ์์ ์๋ Lotto.js๋ฅผ src > model ํด๋ ํ์์ ๋๊ณ ์ถ์์ผ๋.. ์ด ์๊ตฌ ์ฌํญ์ ๋ณด๊ณ ๋ ๊ทธ๋ฅ ๋ ์๋ฐ์ ์์๋ค.
โ indent(์ธ๋ดํธ, ๋ค์ฌ ์ฐ๊ธฐ) depth๋ฅผ 3์ด ๋์ง ์๋๋ก ๊ตฌํํ๋ค. 2๊น์ง๋ง ํ์ฉํ๋ค.
๐ ์ด๋ฒ๋ถํฐ ์๋กญ๊ฒ ์ถ๊ฐ๋ ์๊ตฌ์ฌํญ์ด์ง๋ง, ์ฌ์ค ํจ์ ํ๋์ 15์ค ์ด์ ๋์ด๊ฐ๊ณ depth๊ฐ ๋ง์์ง๋ฉด ํ ๊ฐ์ง ์ผ์ ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฐ๋ผ์ indent depth๋ฅผ ์ค์ด๊ณ ์ ํ๋ค๋ฉด ํจ์ ๋๋ ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋๋ค. ๋๋ถ์ด, ๋ง์ ์ด๋ค์ด depth์ ๋ํด ์ปค๋ฎค๋ํฐ์ ์ง๋ฌธ์ ๋จ๊ฒผ๋๋ฐ, ์๋ฅผ ๋ค์ด while๋ฌธ ์์ if๋ฌธ์ด ์์ผ๋ฉด ๋ค์ฌ ์ฐ๊ธฐ๋ 2์ด๋ค.
โ ํจ์(๋๋ ๋ฉ์๋)๊ฐ ํ ๊ฐ์ง ์ผ๋ง ํ๋๋ก ์ต๋ํ ์๊ฒ ๋ง๋ค์ด๋ผ.
๐ ๊ณตํต ํผ๋๋ฐฑ์ ๋น๋กฏํด ๊ณ์ํด์ ๊ฐ์กฐํ๋ ๋ง์ด๋ค. ํจ์๊ฐ ๋ฑ๋ฑํด์ง์ง ์๋๋ก ์ ๊ฒฝ ์จ์ผ ํ๋ค.
โ
Jest๋ฅผ ์ด์ฉํ์ฌ ๋ณธ์ธ์ด ์ ๋ฆฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ด ์ ์ ๋์ํจ์ ํ
์คํธ ์ฝ๋๋ก ํ์ธํ๋ค.
๐ ๋๋๋ก ๋ชจ๋ ๋ฉ์๋๋ฅผ ํ ์คํธํ๊ณ ์ ํ๋ค. ํนํ ์์ ๋จ์๋ ๊ผญ ํ ์คํธํด์ ์ถํ ์ปจํธ๋กค๋ฌ์์ ํฐ์ง๋ฉด ์ ๋๋๊น.
โ 3์ฃผ ์ฐจ๋ถํฐ ์ถ๊ฐ๋ ์๊ตฌ์ฌํญ
โ ํจ์(๋๋ ๋ฉ์๋)์ ๊ธธ์ด๊ฐ 15๋ผ์ธ์ ๋์ด๊ฐ์ง ์๋๋ก ๊ตฌํํ๋ฉฐ, ํจ์(๋๋ ๋ฉ์๋)๊ฐ ํ ๊ฐ์ง ์ผ๋ง ์ํ๋๋ก ๊ตฌํํ๋ค.
๐ ์ด ์๊ตฌ์ฌํญ์ด ์์ด์ ๋ ์์์ ์ผ๋ก ์ข์ ์ฝ๋๋ฅผ ์ธ ์ ์๊ฒ ๋ ๊ฒ ๊ฐ๋ค. ๋๋ถ์ด, ์ด๋ ์๋์ ๊ฐ์ด ESLint ์์์ ์ค์ ํ๋ฉด ์ข๋ค.
// .eslintrc.cjs
'max-lines-per-function': ['error', { max: 15 }],
โ
else๋ฅผ ์ง์ํ๋ค.
๐ if ์กฐ๊ฑด์ ์์ return ํ๋ฉด ๊ตณ์ด else๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค. ๋ค๋ง, ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ง์ํ๋ค๊ธฐ๋ณด๋ค ๋๋ก๋ if/else์ switch๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊น๋ํด ๋ณด์ผ ์ ์์ด์ ์ด๋ ๊ณ ๋ฏผํด ๋ณด๋ผ๊ณ ํ๋ค.
โ ๋๋ฉ์ธ ๋ก์ง์ ๋จ์ ํ ์คํธ๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๋จ, UI(Console.readLineAsync, Console.print) ๋ก์ง์ ๋ํ ๋จ์ ํ ์คํธ๋ ์ ์ธํ๋ค.
๐ ์ฌ๊ธฐ์ ์ค์ํ ๊ฑด ํต์ฌ ๋ก์ง์ ๊ตฌํํ๋ ์ฝ๋์ UI๋ฅผ ๋ด๋นํ๋ ๋ก์ง์ ๊ตฌ๋ถํ๋ค๋ ๊ฒ. ์น์ ํ๊ฒ๋ ์ง๋ 2์ฃผ ์ฐจ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ์คํธ ๋๊ตฌ ์ฌ์ฉ๋ฒ์ด ์ต์ํ์ง ์์ ์ฌ๋๋ค์๊ฒ ์์ ๋ก ์ฃผ์ด์ง LottoTest.js๋ผ๋ ํ์ผ์ด ์ฃผ์ด์ก๋ค.
๐จ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ - ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โ @woowacourse/mission-utils์ Random ๋ฐ Console API๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ผ ํ๋ค.
โ Random ๊ฐ ์ถ์ถ์ Random.pickUniqueNumbersInRange()๋ฅผ ํ์ฉํ๋ค.
โ ์ฌ์ฉ์์ ๊ฐ์ ์ ๋ ฅ๋ฐ๊ณ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ Console.readLineAsync, Console.print๋ฅผ ํ์ฉํ๋ค.
๐ 1, 2์ฃผ ์ฐจ์ ๋ค๋ฅธ ์ ์ Random.pickNumberInRange()๊ฐ ์๋๋ผ, Random.pickUniqueNumbersInRange()๋ฅผ ํ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ด ๋ฉ์๋๋ ์ธ์๊ฐ 3๊ฐ ๋ค์ด๊ฐ๋ค.
โ Lotto ํด๋์ค
๐ ์ ๊ณต๋ Lotto ํด๋์ค๋ก ๊ตฌํํด์ผ ํ๋ฉฐ, prefix ๋ณ๊ฒฝ์ด๋ ํ๋ ์ถ๊ฐ๋ ๋ถ๊ฐํ๋ค.
๐ ๋ฏธ์ ์ ํตํด ์ ์ฉํ๊ณ ๋ฐฐ์ด ์
1๏ธโฃ README ์์ธํ๊ฒ ์์ฑํ๊ธฐ
์ง๋ 2์ฃผ ์ฐจ ๊ณตํต ํผ๋๋ฐฑ์ 1๋ฒ ์ฌํญ "README.md๋ฅผ ์์ธํ ์์ฑํ๋ค"๋ฅผ ์ค์ํ๊ณ ์ ํ๋ค. ๋ฌผ๋ก ์ง๋ ๋ฏธ์ ๋ค๋ README ์์ฑ์ ๊ผผ๊ผผํ๊ฒ ํ ํธ์ด์ง๋ง, ๋งค ๋ฏธ์ ์ ๊ฑฐ์น๋ฉด์ README์ ๋ฌด์ธ๊ฐ๊ฐ ๋ณ๊ฒฝ๋๋ค. (๊ทธ๋งํผ ํ์ตํ๊ณ ์ฑ์ฅํ๊ณ ์๋ค๋ ๋ป?) ํ์๋ ๊ณตํต ํผ๋๋ฐฑ์ ์๋์ ๊ฐ์ด ๋ฐ์ํ๊ณ ์ ํ๋ค.
โ ํด๋น ํ๋ก์ ํธ๊ฐ ์ด๋ค ํ๋ก์ ํธ์ด๋ฉฐ, ์ด๋ค ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋์ง ๊ธฐ์ ํ๋ค.
๐ ๋ณธ๊ฒฉ์ ์ธ ๊ธฐ๋ฅ ๊ตฌํ ์ ์ ์ด๋ค ํ๋ก์ ํธ์ธ์ง, ํต์ฌ์ ์ธ ๋ก์ง์ ๋ฌด์์ธ์ง ์์ฑํ๋ค. ์ด๋ฅผ ํตํด ํผ๋๋ฐฑ์ด ๊ทธ๋ฅ ํผ๋๋ฐฑ์ด ์๋๋ผ๊ณ ์๊ฐํ๋ค. ํ์คํ ํ๋ก์ ํธ๋ฅผ ํ ์ค๋ก ์ ๋ฆฌํ๋ ๋ ์ดํด๊ฐ ์ ๋์๋ค.
โ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ํด๋์ค ์ค๊ณ์ ๊ตฌํ, ํจ์(๋ฉ์๋) ์ค๊ณ์ ๊ตฌํ๊ณผ ๊ฐ์ด ๋๋ฌด ์์ธํ๊ฒ ์์ฑํ์ง ์๋๋ค.
๐ 1์ฃผ ์ฐจ ๋๋ ๋ฉ์๋ ์ค๊ณ์ ๊ตฌํ์ ์์ฒญ ์์ธํ๊ฒ ์ ์ด๋์๋๋ฐ, ๊ทธ๋ ๊ฒ ๋๋ฉด ๋ฌธ์ ์์ ์๋ ๊ฝค ์๊ฐ์ ์ผ์ด์ผ ํ๋ค. 2์ฃผ ์ฐจ๋ถํฐ๋ ๋๋ฌด ์ธ์ธํ ๋ถ๋ถ๊น์ง ์ ๋ฆฌํ๊ธฐ๋ณด๋ค ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌํ๋ ๋ฐ ์ง์คํ๊ณ ์ ํ๋ค.
โ ์ ์์ ์ธ ๊ฒฝ์ฐ๋ ์ค์ํ์ง๋ง, ์์ธ์ ์ธ ์ํฉ๋ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌํ๋ค.
๐ ์ ๋ง ์ค์ํ ํฌ์ธํธ! ์ง๋ 2์ฃผ ์ฐจ ๋ ๋๋ฆ ์ ๊ฒฝ ์ผ๋ค๊ณ ํ์ง๋ง ์์ธ ์ฒ๋ฆฌ ๋ถ๋ถ์์ ์ค์ค๋ก ์์ฌ์์ด ์์๋ค. ์ด๋ฒ์๋ ์์ธ ์ฒ๋ฆฌ๋งํผ์ ๋นํ์์ด ํด์ผ๊ฒ ๋ค ์๊ฐํ๊ณ , ์์ธ ์ํฉ์ ๋ํ ์ถ๋ ฅ ๋ฉ์์ง๊น์ง ๋ชจ๋ ์ ๋ฆฌํด ๋์๋ค. ์ด๋ ๊ฒ ์ ๋ฆฌํด ๋๋ ๊ธฐ๋ฅ ํ ์คํธ๋ฅผ ํ ๋ QA๋ฅผ ํ๋ ๊ฒ ๊ฐ์ด ํ๋ํ๋ ์์ธํ๊ฒ ์ฒดํฌํ ์ ์์๋ค.
โ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฐ์ดํธํ๋ค.
๐ ์ฒ์๋ถํฐ ๋ชจ๋ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์๋ฒฝํ๊ฒ ์ ๋ฆฌํ๊ธฐ๋ณด๋ค, ์๊ตฌ์ฌํญ์ ์๋ ๊ฒ์ ์ ์ ๋ฆฌํด ๋๋ค ๋ผ๋ ๋๋์ด์๊ณ , ์ดํ ๊ธฐ๋ฅ ๊ตฌํ์ ํ๋ฉด์ README๋ ์์ ํด ๋๊ฐ๋ฉฐ ์ด์์๋ ๋ฌธ์๋ฅผ ๋ง๋ค๊ณ ์ ํ๋ค.
โ ๊ทธ ์ธ ์์ฑํ ๊ฒ
๐ ์ด๋ฒ 3์ฃผ ์ฐจ ๋ ์ฐํ ์ฝ ์ธก์์ ์ ์ํ ๋ชฉํ์ ํจ๊ป ์ค์ค๋ก 2์ฃผ ์ฐจ๋ณด๋ค ๊ฐ์ ํ๊ณ ์ถ์ ๊ฒ๋ค์ ์ ์ด์ ๊ตฌํํ๋ ๋ด๋ด ์ ์งํค๊ณ ์๋์ง ์ฒดํฌํ๊ธฐ๋ ํ๋ค. ๋งค์ฃผ ์ค๋ ฅ์ด ๋๊ฐ์ผ๋ฉด ์ ๋๋ค. ๋ญ๊ฐ ๋งค์ฃผ ๋ ๋์์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
2๏ธโฃ ์์ ์ปจ๋ฒค์
์ง๋ 2์ฃผ ์ฐจ ๋ ์์ ๊ด๋ จ Airbnb ์ปจ๋ฒค์ ์ ๋ฐ๋ฅด์ง ์์์ ๊ด๋ จํด ํผ๋๋ฐฑ์ ๋ฐ์๊ณ , ์๋์ ๊ฐ์ด 3์ฃผ ์ฐจ ๋ ๋ฐ๋ก ๋ฐ์ํด ๋ณด์๋ค. ๋ง์นจ 2์ฃผ ์ฐจ ๊ณตํต ํผ๋๋ฐฑ์์ "๊ฐ์ ํ๋์ฝ๋ฉํ์ง ์๋๋ค"๋ผ๋ ๋ง์ด ์๊ธฐ๋ ํ๋ค. ๋๋ถ์ด, ์์๋ก ๋ง๋๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ํด๋น ๋ณ์์ ์ญํ ์ด ๋ฌด์์ธ์ง ๋ค์ด๋ฐ์๋ ๋ง์ ๊ณ ๋ฏผ์ ํ๋ค.
Airbnb ์ปจ๋ฒค์ ์ ๋ฐ๋ฅด๋ฉด, ์๋์ ๊ฐ์ด ํค๋ ๋๋ฌธ์, ๊ฐ์ ์๋ฌธ์๋ก ์์ฑํ๋ค๊ณ ํ๋ค. ๋ฌด์์์ ์ผ๋ก ์์๋ ๋ฌด์กฐ๊ฑด ๋๋ฌธ์๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ด ๋ถ๋ถ์ ํ๋ฒ ๋ ์ฒดํฌํ ์ ์์ด ์ข์๋ค.
// bad - unnecessarily uppercases key while adding no semantic value
export const MAPPING = {
KEY: 'value'
};
// good
export const MAPPING = {
key: 'value',
};
3๏ธโฃ ๋ฉ์๋ ์ธ์ธํ๊ฒ ์ฒดํฌํ๊ธฐ
์ง๋ 2์ฃผ ์ฐจ ์ฝ๋๋ฆฌ๋ทฐ์์ 2~3๊ฐ์ง ์ ๋๊ฐ ๋ฉ์๋์ ๋ํ ๋ด์ฉ์ด์๋ค. ๋์ฒด๋ก ํ์ํ์ง ์์ ๊ฒ์ ์ถ๊ฐํ๋ค๋ ํผ๋๋ฐฑ์ด์๋ค. ๊ทธ๋์ ์ด๋ฒ์๋ ๊ดํ ๋ถ๋ฆฌํด์ ํ์ํ์ง ์์ ์ญํ ์ ํ๋ ๋ฉ์๋๋ ์๋์ง ์ดํด๋ณด์๋ค. ๊ตฌํ ์ด๋ฐ์๋ ํ์ํด ๋ณด์ด๋ ๋ฉ์๋๋ฅผ ์ผ๋จ ์ถ๊ฐํ๊ณ , ๊ตฌํํ๋ฉด์ ๊ตณ์ด ํ์ํ์ง ์์ ๊ฒ๋ค์ ์๊ฑฐํด ๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
4๏ธโฃ ๊ตฌํ ์์
๋๋ถ์ด, 2์ฃผ ์ฐจ์๋ ์์ ์์ด ๊ธฐ๋ฅ ๊ตฌํ์ ํ๋ค๋ฉด, ์ด๋ฒ 3์ฃผ ์ฐจ์๋ ์์ ๋ฉ์๋๋ถํฐ ์์ฑํ๋ค. ์๋ฌด๋๋ ๋จ์ ํ ์คํธ๋ฅผ ๋๋ ค์ผ ํ๊ธฐ์, ์์ ๋จ์๋ถํฐ ํ ์คํธ ์ฝ๋๋ก ๊ฒ์ฆํด ๋๊ฐ๋ฉด ํฐ ๋จ์์ ํ ์คํธ์์๋ ์ ๋์๊ฐ์ง ์์๊น ์ถ์ด์์๋ค.
๊ทธ๋์ ์ ํธ ํจ์(์ ์ถ๋ ฅ, ์ ํจ์ฑ ๊ฒ์ฌ) → ๊ฐ ํญ๋ชฉ๋น ์์ธ ์ฒ๋ฆฌ ํด๋์ค → ๊ทธ๋ฆฌ๊ณ ์ด ํด๋์ค๋ฅผ ์ปจํธ๋กค๋ฌ์์ ๋ชจ๋ ํฉ์น๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค. ๋ฌผ๋ก ์๊ตฌ์ฌํญ์ด ์ ๋งคํ๊ณ ๋ถํ์คํ ์ํฉ์์๋ ํฐ ๋ก์ง๋ถํฐ ์ง๊ณ ํ์ํ ํจ์๋ค์ ์ง๊ฑฐ๋ ์ ํธ๋ก ๋นผ๋ ๊ฒ์ด ์ข๊ธฐ๋ ํ๊ฒ ์ง๋ง, ์๊ตฌ์ฌํญ์ด ํ์คํ ์ํฉ์ด์๊ธฐ์ ํ์ํ ์์ ํจ์๋ค๋ถํฐ ๋ง๋ค์ด ๋๊ฐ๋ค.
import { LOTTO, ERROR } from '../common/constants.js';
import { throwError } from '../common/utils.js';
// ๋ง๋ค์ด ๋ ์ ํธ์ฑ validator๋ฅผ import ํด์ค๋ ๋ฐฉ์
import { isNumeric, isDivisibleByUnit } from '../common/validator.js';
// ๊ตฌ์
๊ธ์ก ์ ํจ์ฑ ๊ฒ์ฌ ํด๋์ค
class MoneyValidator {
constructor(input) {
this.input = input;
};
validate() {
this.#validateInput();
this.#validateNumber();
this.#validateMoneyUnit();
};
// ๊ณต๋ฐฑ์ด ์๋ค๋ฉด ์๋ฌ ์ถ๋ ฅ
#validateInput() {
if (!this.input) {
throwError(ERROR.empty);
}
};
// ์์ ์ ์๊ฐ ์๋๋ผ๋ฉด ์๋ฌ ์ถ๋ ฅ
#validateNumber() {
if (!isNumeric(this.input)) {
throwError(ERROR.numeric);
}
};
// 1000 ๋จ์๋ก ๋จ์ด์ง์ง ์์ผ๋ฉด ์๋ฌ ์ถ๋ ฅ
#validateMoneyUnit() {
if (!isDivisibleByUnit(this.input, LOTTO.money_unit)) {
throwError(ERROR.money);
}
};
};
export default MoneyValidator;
ํ์ง๋ง ์ด๋ 3์ฃผ ์ฐจ ๋ฏธ์ ์ ํด๋นํ๋ ์ด์ผ๊ธฐ์๊ณ , ์๋ง 4์ฃผ ์ฐจ๋ถํฐ๋ ํต์ฌ ๋ก์ง์ ์๊ฒ ๊ตฌํํด ๋ณด๋ฉด์ ํ์ํ ํจ์๋ค์ ๊ทธ๋๊ทธ๋ ๋ง๋ค์ด ๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ์๋ํด ๋ณผ ๊ฒ ๊ฐ๋ค. (๋ถํ์คํ ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐ์๋ ์ต์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ MVP๋ฅผ ๋ง๋ค์ด ๋๊ณ ํ๋ ๊ฒ์ด ๋ซ์ง ์์๊น ์๊ฐํด์๋ค.) ์ด๋ ๊ฒ์ด ๋ ์ข์์ง๋ ์ด๋ ๊ฒ ๋ค์ํ ์คํ์ ํตํด ์ง์ ๋๊ปด๋ณด๊ณ ์ ํ๋ค.
5๏ธโฃ ๋นํ์๋ ๊ตฌํ
์์ ๋งํ ๊ฒ์ฒ๋ผ ์ง๋ 2์ฃผ ์ฐจ ๋ ์์ธ ์ฒ๋ฆฌ ๋ถ๋ถ์์ ์ค์ค๋ก ์์ฌ์์ ๋ง์ด ๋๊ผ๊ธฐ์ 3์ฃผ ์ฐจ์๋ ์ด ๋ถ๋ถ์ ํกํกํ ์ ๊ฒฝ ์ฐ๊ณ ์ ํ๋ค. ์๋ 2์ฃผ ์ฐจ ๋ ๋ฐ์ ํผ๋๋ฐฑ์ฒ๋ผ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฉ์๋๋ฅผ ์ต๋ํ ๋ถ๋ฆฌํ๊ณ , ๊ทธ์ ๋ง๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ ์ฌ์ฉ์ ์ ์ฅ์์๋ ์ข์ง ์์๊น ์๊ฐํ๋ค.
๋๋ถ์ด, ์์ธ ์ฒ๋ฆฌ๋ฟ๋ง ์๋๋ผ ์๊ตฌ์ฌํญ์ ์ฝ๊ณ ๋ ์ฝ์ผ๋ฉฐ ์ต๋ํ ์งํค๊ณ ์ ๋ ธ๋ ฅํ๋ค. ์์นซํ๋ฉด ๋นผ๋จน์ ์ ์๋ ๊ฒ๋ค๋ ๋ง์๋ค. ์๋ฅผ ๋ค์ด, ๋ก๋ ๋ฒํธ๋ ๊ณต๋ฐฑ์ด ์ค๋ฆ ์ฐจ์์ผ๋ก ๋์ด๋ ๋ฐฐ์ด ํํ๋ก ๋ฐ๋๋ฐ ๋น์ฒจ๋ฒํธ๋ ๊ณต๋ฐฑ ์๋ ๋ฌธ์์ด ํํ๋ก ๋ฐ๊ณ , ์์ต๋ฅ ์ 1000 ๋จ์๋ก ์ผํ๋ฅผ ์ฐ๊ณ ์์์ ๋์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ์ ํ๋ค๋ ๊ฐ. ๋์์ ์ด๋ฅผ ๊ฒ์ฆํ๋ ํ ์คํธ ์ฝ๋ ๋ํ ๊ผผ๊ผผํ๊ฒ ์ง๊ณ ์ ํ๋ค.
ํ์ ์ผ๋ก ๊ฐ๋ฉด ๋ ๊ณ ๊ฐ๊ณผ ์ ์ ์ด ๋ง์ ๊ฒ์ด๊ธฐ์ ๋ค์ํ ์ธํ์ ์์ํ๊ณ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ ๊ผผ๊ผผํ๊ฒ ํด์ฃผ์ด์ผ ํ ํ ๋ฐ, ์ฐํ ์ฝ ๋๋ถ์ ๋ ๋ค์ํ ์ฌ์ฉ์์ ์ธํ์ ๊ณ ๋ คํ๊ณ , ์ธํ์ ๋ฐ๋ฅธ ์ ์ ํ ํผ๋๋ฐฑ์ ์ฃผ๋ ์ฐ์ต์ ํ ์ ์์๋ค.
6๏ธโฃ ํ ์คํธ ์ฝ๋๋ฅผ ์ ์์ฑํด์ผ ํ๋๊ฐ
์ง๋ 2์ฃผ ์ฐจ ๊ณตํต ํผ๋๋ฐฑ์์๋ "ํ ์คํธ๋ฅผ ์์ฑํ๋ ์ด์ ์ ๋ํด ๋ณธ์ธ์ ๊ฒฝํ์ ํ ๋๋ก ์ ๋ฆฌํด ๋ณธ๋ค"๋ผ๋ ๋ฌธ์ฅ๊ณผ ํจ๊ป ํ์ต ์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์๋ค. JUnit์ ํ์ตํ๋ฉฐ ์์ ๋จ์์ ์ ๋ ํ ์คํธ๋ถํฐ ๋ง๋ค๊ณ ์ ํ๋ค.
๋๋ถ์ด, ๋จ์ ํ ์คํธ๋ผ๋ ๊ฒ์ ๋ํด ๊ถ๊ธํด ์์นญํด ๋ณด๋ค๊ฐ ์๋์ ํ ์คํธ ํผ๋ผ๋ฏธ๋๋ผ๋ ๊ฐ๋ ์ ์๊ฒ ๋์๋ค. ์ด ๊ฐ๋ ์์ ์ค๋ช ํ๊ธธ, Unit ํ ์คํธ๋ ๋ ๋ฆฝ๋ ์์ ์กฐ๊ฐ์ผ๋ก ํ ์คํธํ๊ณ , Integration ํ ์คํธ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ทธ๋ฃน์ผ๋ก ๊ฒฐํฉ๋์ด ํ ์คํธํ๋ค๊ณ ํ๋ค.
์ด๋ฒ ๋ฏธ์ ์์ ์๊ตฌํ๋ '๋จ์ ํ ์คํธ'๋ ๋ฌด์์ธ์ง ๋จผ์ ์ ์ํด ๋ณด์.
"๋จ์ ํ ์คํธ๋, ์ํํธ์จ์ด์ ๊ฐ์ฅ ์์ ๊ตฌ์ฑ ์์, ๊ฐ์ฅ ์์ ์ฝ๋ ์กฐ๊ฐ์ธ ๋จ์๋ฅผ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋จ์ ํ ์คํธ๋ฅผ ํ๋ ๋ชฉ์ ์ ๊ฐ ์ฅ์น๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ์ด๋ฏ๋ก ๋ค๋ฅธ ํ ์คํธ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์์ ํ ์คํธํ๋ค. ๋ค์ ๋งํด, ํ ์คํธ๊ฐ ์ธ๋ถ ์์คํ ์ ์์กดํ๋ ๊ฒฝ์ฐ ๋จ์ ํ ์คํธ๊ฐ ์๋ ๊ฒ์ด๋ค. ๊ถ๊ทน์ ์ผ๋ก๋ ๋จ์๋ค์ ๊ฒฐํจ์ด ํ๋ก๋์ ํ๊ฒฝ์ ๋ฐฐํฌ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ตฌํ ์ ์ค๊ณ ๋จ๊ณ์์ ์์ฑ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค."
์ฐธ๊ณ : Unit Testing @developerexperience
๋ฐ๋ผ์ ๋๋ ์ด๋ฒ ๋ฏธ์
์์๋ ์์ ๋จ์์ ํจ์๋ ๋ชจ๋์ด ์๋๋ ๋๋ก ์ ํํ ์๋ํ๋์ง ํ
์คํธํ๊ณ , ์ปจํธ๋กค๋ฌ ํ
์คํธ๋ฅผ ๋ณ๋๋ก ์งํํ์ง ์์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํจ์๋ฅผ ๋ชจํนํ ํ์ฌ๋, ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๋ฃ๋ ๊ฒ์ด ์๋๋ฏ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๋์์๋ ์ ๋๋ก ํ
์คํธ๋๋ ๊ฒ์ธ์ง๋ ์ ์ ์๊ธฐ ๋๋ฌธ์ด์๋ค.
๋ฐ๋ผ์ ํด๋น ํจ์์ ํ ์คํธ์ ์ฑ๊ณต์ ํด๋ ์ค์ ์๋น์ค์ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋ด ๋ ์ ๋ ํ ์คํธ๊ฐ ์๋, ํตํฉ ํ ์คํธ๋ ์์คํ ํ ์คํธ๋ฅผ ์งํํด์ผ ํ ๊ฒ์ด๋ค. (์ฐธ๊ณ : [JEST] ๐ ๋ชจํน Mocking ์ ๋ฆฌ)
๊ฐ๋ ์ ๊ณต๋ถํ๊ณ , ํ ์คํธ ์ฝ๋์ ํจ๊ป ๊ธฐ๋ฅ ๊ตฌํ์ ํ๋ฉฐ ํ ์คํธ๋ฅผ ์์ฑํ๋ ์ด์ ์ ๋ํด ์๋์ ๊ฐ์ด ์ ๋ฆฌํด ๋ณด์๋ค.
์ผ๋จ ๊ฐ์ฅ ์ข์ ์ด์ ๋ "์์ค ์ฝ๋์ ๋ํด ๋น ๋ฅด๊ฒ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์๋ค๋ ๊ฒ"์ด๋ค. ์ฌ์ค ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ๋์๋ 1์ฃผ ์ฐจ ๋ฏธ์ ์์๋ Integration ํ ์คํธ๋ง ํ๋ค ๋ณด๋, ์๋ฌ๊ฐ ๋๋ฉด ์ด๋ ์ฝ๋์์ ๋์๊ฐ ๋์๋์ง ํ์ ์ด ์ด๋ ค์ ๋ค. ๋ฐ๋ฉด, ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ 2์ฃผ ์ฐจ์ 3์ฃผ ์ฐจ์๋ ์์ ๋จ์์ ๋ฉ์๋๋ค๋ถํฐ '์ด๊ฑด ์ ๋์ด' '์ด๊ฑด ์๋ชป๋์ด'๋ผ๋ ํผ๋๋ฐฑ์ ๋ฐ์ผ๋ ๋ด ์ฝ๋์ ๋ํ ์ ๋ขฐ๋๊ฐ ์๊ฒผ๋ค.
์๋ฅผ ๋ค์ด, ๊ณตํต ํผ๋๋ฐฑ์ "์ฒ์๋ถํฐ ํฐ ๋จ์์ ํ ์คํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค"๋ผ๋ ๋ง์ด ์๋ ๊ฒ์ฒ๋ผ ์ด ๋ฏธ์ ์์ ๊ฒ์ฆ์ด ํ์ํ ์ ํธ ํจ์ ๋ ๊ฐ(์์ ์ ์์ธ์ง, 1000์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ์ซ์์ธ์ง)๋ฅผ ๋ง๋ค์๊ณ , ์ด ์์ค์ฝ๋๋ฅผ ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ๊ฒ์ฆํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ๊ฐ์ง ๋ฉ์๋๋ฅผ ํฉ์ณ ๊ตฌ์ ๊ธ์ก ํด๋์ค์ ๊ธฐ๋ฅ ํ ์คํธ๋ฅผ ์๋์ ๊ฐ์ด ๋ค ํํธ๋ก ๋๋์ด ์งํํ๋ค.
import { ERROR } from '../../src/common/constants.js';
import MoneyValidator from '../../src/service/MoneyValidator.js';
describe('๊ตฌ๋งค ๊ธ์ก ํ
์คํธ', () => {
const validateMoney = (input, expectedError) => {
const moneyValidator = new MoneyValidator(input);
if (expectedError) {
expect(() => moneyValidator.validate()).toThrow(expectedError);
} else {
expect(() => moneyValidator.validate()).not.toThrow();
}
};
test('๊ธ์ก์ด ์ ํจํ ํ์์ด๋ผ๋ฉด ์ฑ๊ณต', () => {
validateMoney('10000');
});
test('๊ธ์ก์ด 1000 ๋จ์๊ฐ ์๋๋ผ๋ฉด ์คํจ', () => {
validateMoney('1010', ERROR.money);
});
test('๊ธ์ก์ด ๋ฌธ์์ด์ด๋ผ๋ฉด ์คํจ', () => {
validateMoney('abc', ERROR.numeric);
});
test('๊ธ์ก์ด ๊ณต๋ฐฑ์ด๋ผ๋ฉด ์คํจ', () => {
validateMoney(' ', ERROR.numeric);
});
});
๐ฉ๐ป๐ง ํธ๋ฌ๋ธ ์ํ
์ผ๋ฐ์ ์ธ ์๋ฌ๋ ๋ฐ๋ก ๋ค๋ฅธ ๊ธ๋ก ๋ฐํํ๊ณ ,
๋ณธ ๋ฏธ์ ์์ ๋ง์ฃผํ ์ ์๋ ๋ช ๊ฐ๋ง ๊ธฐ์ ํฉ๋๋ค.
1๏ธโฃ ๋ฌด์ง์ฑ ๋ณต๋ถ ๊ธ์ง
๋ก๋ ๊ตฌ์ ๊ธ์ก์ ๊ฒ์ฆํ๋ ํ ์คํธ ์ฝ๋ ํต๊ณผ๋ฅผ ๋ชปํ๊ณ ์์๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด์๋๋, ๋ค๋ฅธ ์์ธ ์ํฉ์ธ๋ฐ ๊ฐ์ ์๋ฌ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๊ณ ์๋ ๊ฒ์ด๋ค..
// ์์ ์
test('์
๋ ฅํ ๊ตฌ์
๊ธ์ก์ด 1000 ๋จ์๋ก ๋จ์ด์ง์ง ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.', async () => {
const invalidInput = '1010';
Console.readLineAsync.mockResolvedValueOnce(invalidInput);
await expect(isValidPaidAmount()).rejects.toThrow(ERROR.paid_amount); // ์๋ฌ ๋ฌธ๊ตฌ
});
test('์
๋ ฅํ ๊ตฌ์
๊ธ์ก์ด ๋ฌธ์์ด์ด๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.', async () => {
const invalidInput = 'abc';
Console.readLineAsync.mockResolvedValueOnce(invalidInput);
await expect(isValidPaidAmount()).rejects.toThrow(ERROR.paid_amount); // ์๋ฌ ๋ฌธ๊ตฌ
});
// ์์ ํ
test('์
๋ ฅํ ๊ตฌ์
๊ธ์ก์ด 1000 ๋จ์๋ก ๋จ์ด์ง์ง ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.', async () => {
const invalidInput = '1010';
Console.readLineAsync.mockResolvedValueOnce(invalidInput);
await expect(isValidPaidAmount()).rejects.toThrow(ERROR.paid_amount); // ์๋ฌ ๋ฌธ๊ตฌ
});
test('์
๋ ฅํ ๊ตฌ์
๊ธ์ก์ด ๋ฌธ์์ด์ด๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.', async () => {
const invalidInput = 'abc';
Console.readLineAsync.mockResolvedValueOnce(invalidInput);
await expect(isValidPaidAmount()).rejects.toThrow(ERROR.numeric); // ์๋ฌ ๋ฌธ๊ตฌ
});
์์ธ์ ๋ฌด์ง์ฑ์ผ๋ก ๋ณต์ฌ ๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ํ ํ์ด์๋ค. ํ ์คํธ ์ฝ๋๋ (๋ฆฌํฉํ ๋ง์ ํ๊ธฐ ์ ์๋) ์ฝ๋๊ฐ ๋ฐ๋ณต๋๋ ๊ฒฝํฅ์ด ์๋ค ๋ณด๋ ์๋ฌด ์๊ฐ ์์ด ๋ณต๋ถ์ ํด์ ๋ฌด์์ด ํ๋ฆฐ ์ง๋ฅผ ๋ชฐ๋๋ค. ๋ถ๋ช validator์์ ์์ธ ์ํฉ์ ๋ฐ๋ผ ์ถ๋ ฅ๋๋ ๋ฌธ๊ตฌ๋ฅผ ๋๋์ด ๋์๋๋ฐ, ๋ ๋ค ๊ฐ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ฒ ๋์์ผ๋ ๋น์ฐํ ํต๊ณผ๊ฐ ์๋์ง. ์ด๊ฒ ๋๋ฌธ์ ๊ดํ ์์ค์ฝ๋๋ง ๋ค์ฌ๋ค๋ณด์๋ค.
์์ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ ์ดํ์๋ ์ฌ์ํ ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋๋ฅผ ์ํ ์ฃผ์์ ํ์ฉํ๋ค. ์ต๊ด์ ์ ๋ง๋ค์ด์ ์๊ฐ์ ์๊ปด์ผ ํด..
validateWinningNumber() {
this.validateNumber(); // ์ซ์(๊ณต๋ฐฑ ๋ฑ) ์ฌ๋ถ ํ๋จ -> ERROR.numeric ์ถ๋ ฅ
this.validateFormat(); // ์ผํ ๊ตฌ๋ถ ์ฌ๋ถ ํ๋จ -> ERROR.winning_format ์ถ๋ ฅ
this.validateLength(); // ์ซ์ 6๊ฐ ํ๋จ -> ERROR.winning_length ์ถ๋ ฅ
this.validateUnique(); // ์ค๋ณต ์ฌ๋ถ ํ๋จ -> ERROR.winning_duplicate ์ถ๋ ฅ
this.validateRange(); // 1~45 ์ฌ๋ถ ํ๋จ -> ERROR.range ์ถ๋ ฅ
return this.input;
}
2๏ธโฃ true? false?
์ด๋ฒ์๋ ๋ ๋ด๊ฐ ์์ฑํ ํ ์คํธ ํต๊ณผ๊ฐ ์ ๋๋ ์ํฉ์ด์๋ค.
ํ ์คํธ ๋์์ธ ๋ณด๋์ค ๋ฒํธ๋ฅผ ๊ฒ์ฆํ๋ ๋ก์ง ์์ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ค์ ์๋์ ๊ฐ์ด ์์ฑํด ๋์์๋ค. ์ด ์ค์์ 'ํ๊ฒ ์์ ํน์ ์์๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ ๋ฉ์๋'๊ฐ ๋ฌธ์ ์๋ค. ๋ฌด์์ด ๋ฌธ์ ์์๊น?
// ํ๊ฒ ์์ ํน์ ์์๊ฐ ํฌํจ(์ค๋ณต)๋์ด ์๋์ง ํ์ธํ๋ ๋ฉ์๋
const isElementInTarget = (target, element) => target.includes(element);
// ์์ ์ ์์ธ์ง ํ์ธํ๋ ๋ฉ์๋ (์์, ์์, ๊ณต๋ฐฑ, ํน์๋ฌธ์, ๋ฌธ์์ด, 0์ผ๋ก ์์ํ๋ ์ซ์ ๋ถ๊ฐ)
const isNumeric = (input) => UTILS.positive_integer.test(input);
// ํน์ ๋ฒ์ ์์ ๊ฐ์ด ํฌํจ๋์๋์ง ํ์ธํ๋ ๋ฉ์๋
const isInRange = (input, min, max) => input >= min && input <= max;
์๊ณ ๋ณด๋, ์ค๋ณต ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ isElementInTarget ๋ฉ์๋์ true / false ์์๋ฅผ ๋ฐ๊พธ์ด ๋์๊ธฐ ๋๋ฌธ์ด์๋ค.
// ์์ ์
test('๋ณด๋์ค ๋ฒํธ์ ๋น์ฒจ ๋ฒํธ ๊ฐ์ ์ค๋ณต ์ฌ๋ถ', () => {
const winningNumber = '1,2,3,4,5,6';
const uniqueBonusNumber = '7';
const duplicateBonusNumber = '6';
expect(isElementInTarget(winningNumber.split(','), uniqueBonusNumber)).toBe(true);
expect(isElementInTarget(winningNumber.split(','), duplicateBonusNumber)).toBe(false);
});
์๋์ ๊ฐ์ด isNumeric์ด๋ isInRange ๋ฉ์๋์๋ ๋ค๋ฅด๊ฒ isElementInTarget๋ ์ค๋ณต์ด ์์ผ๋ฉด false๋ฅผ ๋ฑ์ด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
isElementInTarget ๐ ์ค๋ณต๋ ๊ฐ์ด ์๋๊ฐ? ๐ ์๋ค(true) ๐ ์คํจ
isNumeric ๐ ์์ ์ ์์ธ๊ฐ? ๐ ๋ง๋ค(true) ๐ ํต๊ณผ
isInRange ๐ ๋ฒ์ ๋ด์ ์๋๊ฐ? ๐ ๋ง๋ค(true) ๐ ํต๊ณผ
์๋์ ๊ฐ์ด ์์ ํด ์ฃผ์๋๋ ํ ์คํธ ํต๊ณผ๊ฐ ๋์๋ค.
// ์์ ํ : true & false ์์ ๋ณ๊ฒฝ
test('๋ณด๋์ค ๋ฒํธ์ ๋น์ฒจ ๋ฒํธ ๊ฐ์ ์ค๋ณต ์ฌ๋ถ', () => {
const winningNumber = '1,2,3,4,5,6';
const uniqueBonusNumber = '7';
const duplicateBonusNumber = '6';
expect(isElementInTarget(winningNumber.split(','), uniqueBonusNumber)).toBe(false);
expect(isElementInTarget(winningNumber.split(','), duplicateBonusNumber)).toBe(true);
});
์ด๋ฒ์๋ ์ฌ์ํ ์ค์๋ก ์ธํด ์๋ฌ๊ฐ ๋ฌ๋ค. ํ์ง๋ง ์ด๋ฐ ์ฌ์ํ ์ค์์ผ์๋ก ๋ค์ ๋ฐ๋ณตํ์ง ์๊ณ ์ ๊ธฐ๋กํด ๋๋ค.
๐งน ๋ฆฌํฉํ ๋ง
1๏ธโฃ while์์ ์ฌ๊ท๋ก
์ด๋ฒ ๋ฏธ์ ๋ถํฐ ๋ฌ๋ผ์ง ๋ถ๋ถ์ ์๋ฌ๊ฐ ๋๋ฉด ์ฆ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋ ๊ฒ์ด ์๋๋ผ, ํด๋น ๋ถ๋ถ๋ถํฐ ๋ค์ ์ ๋ ฅ๋ฐ๋ ๊ฒ์ด์๋ค. ์ฒ์์๋ ์๋์ ๊ฐ์ด while ๋ฃจํ๋ฅผ ์ฌ์ฉํด ๋ฉ์๋๋ค์ ์ฑ๊ณต์ ์ผ๋ก ํต๊ณผํ ๋๊น์ง ๊ณ์ ์๋ํ๊ฒ ๋ง๋ค์๋ค. ์ฆ, ๋ ๋ฉ์๋๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด, break ๋ฌธ์ด ์คํ๋์ด while (true) ๋ฃจํ๋ฅผ ์ข ๋ฃํ๊ณ start ํจ์๊ฐ ์๋ฃ๋๋๋ก ํ๋ค.
// ๋ฆฌํฉํ ๋ง ์ : while ๋ฃจํ ์ฌ์ฉ
async start() {
while (true) {
try {
await this.#initGame();
await this.#runGame();
break;
} catch (error) {
printMessage(error.message);
}
}
};
๊ทธ๋ฌ๋ค while๋ฌธ์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ๋ฟ๋ง ์๋๋ผ, ์์ ๊ฐ์ด ์์ฑํ์ ๋ ESLint์ no-constant-condition๊ณผ no-await-in-loop ์กฐ๊ฑด์ ์๋ฐํ๊ณ ์์ด์ ์๋์ ๊ฐ์ด ์ฌ๊ท๋ก ๋ฐ๊พธ์๋ค.
// ๋ฆฌํฉํ ๋ง ํ: catch ๋ธ๋ก ๋ด์์ startGame ํจ์๋ ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถ
// ์ฌ๊ท ํธ์ถ์ ํตํด ์๋ฌ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๊ณ์ํด์ ์๊ธฐ ์์ ์ ํธ์ถํ์ฌ ๊ฒ์์ ์ด๊ธฐํํ๊ณ ์คํํ๋ ๊ณผ์ ์ ๋ฐ๋ณต
async start() {
const startGame = async () => {
try {
await this.#initGame();
await this.#runGame();
} catch (error) {
printMessage(error.message);
await startGame(); // ์ฌ๊ท ํธ์ถ
}
}
await startGame();
};
์ฌ๊ท๋ก ์์ฑํ์ ๋์ ์ฅ์ ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋๋ฐ, ์ฐ์ ์ ์ฝ๋์์๋ while๋ฌธ๋ณด๋ค ๊ฐ๋ ์ฑ์ด ๋ช ํํด์ก๋ค. ๊ทธ๋ฅ ๋จ์ํ ๋ณด๊ธฐ ์ข๋ค๋ผ๊ธฐ๋ณด๋ค, ์ฌ๊ท์ ์ผ๋ก ์์ ์ ํธ์ถํ๋ ํจ์๋ '๋ฐ๋ณต ์์ '์ ํ๊ณ ์๋ค๋ ๊ฒ์ด ๋ช ์์ ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๋๋ถ์ด, ๊ฐ ๋จ๊ณ์์์ ์ํ๋ฅผ startGame ํจ์ ํธ์ถ์ ์ค์ฝํ์ ํฌํจ์ํฌ ์ ์์ด, ๋ณ์ ์ํ๋ฅผ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ๋ณด๋ค ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ํ๋ฅผ ๋ค๋ฃจ๊ธฐ๊ฐ ๋ ์ฉ์ดํ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
2๏ธโฃ ๋ ์ด์ด๋ ์ํคํ ์ฒ ๋์
์ง๋ 2์ฃผ ์ฐจ์ ์ด์ด ์ด๋ฒ์๋ MVC ํจํด์ ์ ์ฉํด ๊ตฌํํ๊ณ ์์๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ์ ๋ ๊ตฌํ์ ๋ค ํ๊ณ ๋ณด๋ ์ปจํธ๋กค๋ฌ์ ๋๋ฌด ๋ง์ด ์ญํ ์ด ๋ถ์ฌ๋๊ณ , ๋ ์ด์ด๋ณ ์ญํ ๊ตฌ๋ถ์ด ๋ช ํํ์ง ์์ ๋๋์ด์๋ค. ๊ทธ๋์ ์ค๊ฐ์ ํ๋์ ๋ ์ด์ด๋ฅผ ๋์ด ์ผ๋ถ ์ญํ ์ ๋ถ๋ฆฌํด๋ ์ข์ง ์์๊น ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ค ์ด๋ฌํ ๊ณ ๋ฏผ์ ์ด๋ ์ ๋ ์ค๋ง๋ฆฌ๊ฐ ๋์ด ์ค ๊ฒ์ด ๋ฐ๋ก ๋ ์ด์ด๋ ์ํคํ ์ฒ(Layered Architecture)๋ผ๋ ๊ฒ์ด์๋ค. (์ฐธ๊ณ : Layered Architecture @hgraca)
๋ง์ด ๊ฑฐ์ฐฝํด ๋ณด์ด์ง๋ง, ์ฝ๊ฒ ๋งํ์๋ฉด ๊ฐ ๊ณ์ธต์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์์ ํน์ ์ญํ ๊ณผ ๊ด์ฌ์ฌ(UI, ๋น์ฆ๋์ค ๋ก์ง ์ํ, DB ์์ ๋ฑ) ๋ณ๋ก ๊ตฌ๋ถํ๋ค๋ ๊ฒ์ด๋ค. ๊ฐ์ฅ ํฐ ํน์ง์ ๋ช ํํ๊ฒ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ํน์ ๊ณ์ธต์ ๊ตฌ์ฑ ์์๋ ํด๋น ๊ณ์ธต์ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ง ์ํํ๊ธฐ์ ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ์ฌ์ด ํ ์คํธ๋ฅผ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. (์ฐธ๊ณ : ๊ณ์ธตํ ์ํคํ ์ฒ) ๊ทธ๋์ ์ด ์ํคํ ์ฒ๋ผ๋ฉด ๊ฐ ๋ ์ด์ด๋ณ๋ก ์ญํ ๊ณผ ์ฑ ์์ด ๋ช ํํด, ์ปจํธ๋กค๋ฌ์ ์ญํ ์ด ๋๋ฌด ๋ง์ ๊ฒ ๊ฐ๋ค๋ ๊ณ ๋ฏผ์ ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํด๊ฒฐํ๋๋? ์๋์ ๊ฐ์ด ์ปจํธ๋กค๋ฌ ์ ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ '์๋น์ค ๋ชจ๋'์ ํ๋ ๋ ๋๊ธฐ๋ก ํ๋ค.
๐ ์ปจํธ๋กค๋ฌ ๋ชจ๋
๐ controller.js ๐ ์ปจํธ๋กค๋ฌ ์ญํ
๐ ์๋น์ค ๋ชจ๋
๐ LottoService.js ๐ ๋น์ฆ๋์ค ๋ก์ง (๋น์ฒจ ํต๊ณ, ์์ต๋ฅ ๊ณ์ฐ ๋ฑ) ์ํ
๐ BonusNumberValidator.js ๐ ๋ณด๋์ค ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
๐ LottoValidator.js ๐ ๋ก๋ ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
๐ MoneyValidator.js ๐ ๊ตฌ์ ๊ธ์ก ์ ํจ์ฑ ๊ฒ์ฌ
๐ WinningNumberValidator.js ๐ ๋น์ฒจ ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
์๋น์ค ๋ ์ด์ด๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ๊ฒ์ ์ฃผ ๊ด์ฌ์ฌ๋ก ๋๊ณ ๊ทธ์ Model์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์(๋ก๋ ๋ฒํธ, ๊ตฌ์ ๊ธ์ก ๋ฑ), ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๊ณ (๋น์ฒจ ํต๊ณ์ ์์ต๋ฅ ๊ณ์ฐ ๋ฑ)์ ์ํํ๋ค. View๊ฐ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋, Controller๊ฐ View์์ ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ๋ฌผ์ ์ํ๋ ํ์์ผ๋ก ๋ค๋ฌ๋์ง์ ๋ํ ๋ด์ฉ์ ์๊ณ ์์ง ์๋ค.
์ฌ์ค ๋ด๊ฐ ์ ์ฉํ Layered Architecture ์ธ์๋ ์ด๋์ธ ์ํคํ ์ฒ(Onion Architecture), ๋ผ์๋ ์ํคํ ์ฒ(Lasagna Architecture) ๋ฑ๋ฑ ์ฌ๋ฌ ์ํคํ ์ฒ๊ฐ ์์์ง๋ง, ์ด๋ฒ ๋ฏธ์ ์์๋ ์ด๋ค ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋๋ ๊ฒ์ ๋ณธ์ง์ด ์๋์๋ค. ๊ธฐ์กด MVC ํจํด์ ์ฌ์ฉํ๋ฉฐ ์ปจํธ๋กค๋ฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ํ์ ์ด์์ ์ญํ ์ ์ฌ๋ฌ ๋ ์ด์ด๋ก ๋๋๊ณ , ๊ฐ ๋ ์ด์ด๋ณ๋ก ๊ด์ฌ์ฌ์ ์ญํ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด์๋ค.
์ด ์ํคํ ์ฒ๋ฅผ ์ฐธ๊ณ ํ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ์ ๋์ง ์์ผ๋ฉด์ ํต์ฌ์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฒฌ๊ณ ํ๊ฒ ์ ์งํ ์ ์์๋ค. ์๋ฅผ ๋ค์ด ๋ณด๋์ค ๋ฒํธ์ ๊ฐ์๊ฐ 1๊ฐ์์ 2๊ฐ๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค๋ฉด ๊ตณ์ด ์ฌ์ฉ์ ์ ์ถ๋ ฅ์ ๋ณํํ๋ ์ปจํธ๋กค๋ฌ๋ ๊ฑด๋๋ฆด ํ์๊ฐ ์๋ค. ์๋น์ค ๋ ์ด์ด์ ๋ด๋ถ ๋ก์ง๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค. ์ด์ ๋ํด, ์ญํ ๋ถ๋ฆฌ๊ฐ ๋๋ ๊ฐ๊ฐ์ ์ ๋ํ ์คํธ๋ฅผ ์ง๊ธฐ๊ฐ ์์ํ๊ธฐ๋ ํ๋ค.
์ฌ์ค ์งง์ ์๊ฐ ๋์ ์ํคํ ์ฒ์ ๋ํด ๊น๊ฒ ๊ณต๋ถํ๊ฑฐ๋ ์ ์ฉํ๋ ๊ฒ์ ๋ฌด๋ฆฌ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค. ํ์์๋ ์ด๋ฐ ๊ตฌ์กฐ์ ์ธ ๊ณ ๋ฏผ์ ํ ์ผ์ด ์์๋๋ฐ, ์ฐํ ์ฝ ๋ฏธ์ ๋๋ถ์ ์ด๋ฐ ์ํคํ ์ฒ๋ผ๋ ๊ฒ๊น์ง ์ฐพ์๋ณด๊ณ ๊ณ ๋ฏผํด ๋ณธ ๊ฒ์ ์์๋ฅผ ๋๋ค.
๐ค 3์ฃผ ์ฐจ ์์ฌ์ด ์
1๏ธโฃ ์๊ฐ ๋ถ๋ฐฐ
2์ฃผ ์ฐจ์ ๋นํด 3์ฃผ ์ฐจ ๋ฏธ์ ์ ๋์ด๋๊ฐ ์๋ ํธ์ด๊ธฐ๋ ํ๊ณ , ์ด๋ฐ๋ถ์ ์์ธ ์ฒ๋ฆฌ ๋ถ๋ถ์ ํ์ ์ด์์ ๊ผผ๊ผผํ๊ฒ ํ๋๋ผ ์๊ฐ ๋ถ๋ฐฐ๋ฅผ ์ ํ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ๋์๋ณด๋ฉด ์ด๋ ๊ฒ ๊ผผ๊ผผํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์ฌ๋ฌ ์๋๋ฅผ ํด๋ณธ ๊ฒ์ด ๊ฒฐ์ฝ ํ๋ ์ฝ์ง์ ์๋์ง๋ง, ๋ฏธ์ ๋ง๊ฐ ์๊ฐ์ ๋ฅ์ณ ํธ์ํ๊ณ ํ ์คํธํ๋๋ผ ๋ง์ง๋ง์ ์์ํ ์ฝ๋ ์ปจ๋ฒค์ ์ ์ฒดํฌํ์ง ๋ชปํ ๊ฒ์ด ๋ง์์ ๊ฑธ๋ฆฐ๋ค. 4์ฃผ ์ฐจ์๋ ๋น ๋ฅธ ์๊ฐ ๋ด์ ๋์๊ฐ๋ ์ฐ๋ ๊ธฐ๋ผ๋ ๋ง๋ค์ด ์ต์ ๊ธฐ๋ฅ์ด๋ผ๋ ๊ตฌํํด์ผ๊ฒ ๋ค.
2๏ธโฃ ํ ์คํธ ์ฝ๋
์์ ์๊ฐ ๋ถ๋ฐฐ์๋ ์ฐ๊ฒฐ๋๋ ์ด์ผ๊ธฐ์ธ๋ฐ, ๋งํ์ ์๊ฐ์ด ๋ถ์กฑํด์ ํ ์คํธ ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ์ ๋๋ก ๋ชปํ๋ค. ๋๋ฌธ์ ์ง๊ธ ๋ณด๋ ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ๋ง๋ค. ๊ฒ๋ค๊ฐ '๋น์ฒจ ๊ฒฐ๊ณผ์ ์์ต๋ฅ ๊ณ์ฐ'์ ๋ํ ํ ์คํธ ์ฝ๋ ํ๋๋ฅผ ์์ฑํ์ง ๋ชปํ๋ค. ๋ฌผ๋ก Node ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋์๊ฐ๊ณ , ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ค ํด์ค๋ค๋ ๊ฒ์ ๋์ผ๋ก ํ์ธํ์ง๋ง, ํ ์คํธ ์ฝ๋๋ก ๋น์ฆ๋์ค ๋ก์ง์ ํ์ธํ๋๋ผ๋ฉด ๋ ์ข์์ ๊ฒ ๊ฐ๋ค. ๋งค์ฐ ์์ฌ์ด ๋ถ๋ถ์ด๋ค.
โ๏ธ 3์ฃผ ์ฐจ ์๊ฐ
1๏ธโฃ ์ด๋ ต๊ณ , ํ๋ค์๋ค.
ํ๋ค์๋ค. ์ด๋ฒ ๋ฏธ์ ์ ๋์ด๋๊ฐ ๋์ ๊ฒ๋ ์์์ง๋ง, 3์ฃผ ์ฐจ์ ์ ์ด๋ค๋ฉฐ ์ฒด๋ ฅ์ ์ ์ ์ ์ผ๋ก ํ๊ณ์ ๋ถ๋ชํ ๋๊ฐ ์์๋ค. ๊ทธ๋์ ์ ์ ์ค์ธ ํ์ ์ฒด๋ ฅ ๋ถ์ฑ๋ ์์ฌ๊ฐ๋๋ฐ, ์ ์ ๋์ด๋๊ฐ ๋์์ง๋ ๊ฒ์ ๋๊ปด ์กฐ๊ธํด์ง๊ธฐ๋ ํ๋ค. ์ง๋์ฃผ๋ณด๋ค ์๊ฒ ๋ ๊ฒ๋ค์ด ๋ง์์ง๋ค ๋ณด๋ ๋ ์ํ๊ณ ์ถ์ ์์ฌ ๋๋ฌธ์ด์๋ ๊ฒ ๊ฐ๋ค.
2๏ธโฃ ์๊ธฐ๋ฅผ ๊ธฐํ๋ก
ํ์ง๋ง ์ด๋ฐ ์๊ธฐ๋ ์ค์ค๋ก์ ์ ์คํจ๊ณผ ์ฑ์ฅ์ ๋ํ ์์ฌ์ ์๊ฒ ๋ ๊ธฐํ์ด๊ธฐ๋ ํ๋ค. ๋ ์ํ๊ณ ์ถ์ ์์ฌ๊ณผ ์ ์คํ ๋ง์์ ์ ์ ์ค์ด๊ฒ ๋๊ณ , ๋จน๊ฑฐ๋ ์ด ๋๋ ๋๋ฒ๊น ๋ฆฌํฉํ ๋ง ์๊ฐ๋ง ํ๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฅผ ํตํด ์ค์ค๋ก ‘๋ ๊ฐ๋ฐ์ ์ด๋งํผ ์ข์ํ๋๊ตฌ๋, ์ด๋งํผ ์ํ๊ณ ์ถ๊ตฌ๋’ ๋๊ผ๋ค.
3๏ธโฃ ์์ฌ์์ ์ฑ์ฅ์ ๊ธฐํ๋ก
์๊ฐ๋ฌธ์ ์ฐ๋ฉฐ ํ ์ฃผ๋ฅผ ๋์๋ณด๋, ์ด๊ฒ ๋ํ ๊ณผ์ ์ด๊ณ ์ค์ค๋ก ํด๋ธ ๊ฒ์ ํฐ ์ฑ์ทจ๋ฅผ ๋๋๋ค. ํนํ ์ง๋ 2์ฃผ ์ฐจ ๋ ์์ฌ์ ๋ ์ ์ 3์ฃผ ์ฐจ์ ๋งํํ๊ฒ ๋ค๊ณ ๋ค์งํ๊ณ , ์ด๋ฅผ ์ค์ฒํ ๊ฒ์ ๋ฟ๋ฏํจ์ ๋๋ผ๊ณ ์๋ค. ํ์ง๋ง 3์ฃผ ์ฐจ ํผ๋๋ฐฑ์ ๋ฐ์ผ๋ฉด ๋ถ๋ช ์์ฌ์ด ์ ์ด ๋ง๊ตฌ๋ง๊ตฌ ์๊ธธ ๊ฒ์ด๊ณ , ๋๋ ๋ ์ฑ์ฅ์ ๊ธฐํ๋ฅผ ์ป์ ๊ฒ์ด๋ค. ์ด๋ ๋ฏ ์์ผ๋ก ์์ฌ์์ ๋๋ผ๋ฉฐ ๋งค์ผ๋งค์ผ ์ฑ์ฅํ๋ ๊ฐ๋ฐ์๊ฐ ๋์.
๋๊ธ