[์ฐ์ํํ ํฌ์ฝ์ค 6๊ธฐ] ํ๋ฆฌ์ฝ์ค 1์ฃผ์ฐจ ์ซ์์ผ๊ตฌ ๋ฏธ์ ํ๊ธฐ
by rlaehddnd04221์ฃผ์ฐจ ๋ฏธ์ - ์ซ์์ผ๊ตฌ
์ง๋ ์ฐ์ํํ ํฌ์ฝ์ค 5๊ธฐ ์ซ์์ผ๊ตฌ ๋ฏธ์ ๊ณผ ๋์ผํ ๋ฏธ์ ์ด์๋ค. ๋ค๋ง, ์กฐ๊ธ ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด
- 'JDK 17 ๋ฒ์ ์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค.' ๋ ์ .
- 5๊ธฐ ์ซ์์ผ๊ตฌ ๋ฏธ์ ์ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ์ฌํญ(indent depth๋ฅผ 2๋ก ์ ํ, 3ํญ ์ฐ์ฐ์ ์ฌ์ฉ ์ ํ, ๋ฉ์๋๋ ํ ๊ฐ์ง ์ผ๋ง ํ๋๋ก ์ ํ)์ด ์์ด์ก๋ค๋ ์ .
+ ๋์ ๊ผญ ์ง์ผ์ผ ํ ์ปจ๋ฒค์ 4๊ฐ์ง๋ ๊ฐ์ด๋๋ก ์ ์ํด์ฃผ์๋ค.
์๋ฐ ์ปจ๋ฒค์ ์ค์์ ๋ค์ ๋ค ๊ฐ์ง๋ ๋ฐ๋์ ์ค์ํ๋ผ๋ ์๊ตฌ์ฌํญ์ด ์์๋ค.
1. ๋ธ๋ก ๋ค์ฌ์ฐ๊ธฐ : ์ค๋ฐ๊ฟ์ ํ๊ณ ๋๋ฉด ์ต์ด ํ๋ณด๋ค ์ต์ 4์๋ฅผ ๋ค์ฌ์ฐ๊ธฐ ํ์.
2. ์ด ์ ํ : ํ๋์ ๋ฌธ์ฅ์ ์ต๋ 100๊ธ์๋ก ์ ํํ๋ค.
3. ๋ค์ฌ์ฐ๊ธฐ ์ง์์ ์ต์ +8 ์คํ์ด์ค : indent์ depth๊ฐ ์ปค์ง ๋ +4์์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ํ์.
4. ์์ง ๋น ์ค : ํด๋์ค์ ์ฒซ ๋ฒ์งธ ๋ฉค๋ฒ๋ ์ด๊ธฐํ ์์ ์๋ ๋น ์ค์ ๊ฐ์ ํ์ง ์๋๋ค.
์ ๋ค ๊ฐ์ง๋ ๋ฐ๋์ ์งํค๋, ๊ณต์ ๋ฌธ์์ ์ ์๋ ์๋ฐ ์ฝ๋ ์ปจ๋ฒค์ ๋ํ ์งํค๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
Day 1
ํ๋ฆฌ์ฝ์ค๋ฅผ ์์ํ๊ธฐ ์ , ์๋ฐ ์ฝ๋ ์ปจ๋ฒค์ ๊ณผ ์ปค๋ฐ ์ปจ๋ฒค์ ์ ์์งํ๊ณ ๊ฐ์ฒด์งํฅ ์ํ์ฒด์กฐ 9๊ฐ์ง ์์น๋ค์ ์์งํ๋ ์ ๋๊น์ง๋ง ํด๋์๊ณ , ์๊ธฐ์๊ฐ์ ์์ฑ์ด ์๊ฐ๋ณด๋ค ๊ธธ์ด์ง ํ์ ์ง๋ 5๊ธฐ์ ํ๋ฆฌ์ฝ์ค ๋ฌธ์ ๋ค์ ์ดํด๋ง ๋ณด๊ณ ํ์ด๋ณด์ง๋ ๋ชปํ ์ํ์๋ค.
๊ทธ๋์ ๋ฏธ์ ์ ์ฒ์ ํ์ธํ ๋ ๋์ผํ ์ซ์์ผ๊ตฌ ๋ฏธ์ ์ธ ๊ฒ์ ํ์ธํ๊ณ , ๋ฏธ๋ฆฌ ํ ๋ฒ ํ์ด๋ณผ๊ฑธ ํ๋ ํํ๋ ์์์ง๋ง, ์ด์ฐ๋ณด๋ฉด ์ด์ ๊ธฐ์ ๋ถ๋ค์ด ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํ์๋์ง ์ฝ๋๋ฅผ ์ดํด๋ณด์ง ์์ ๊ฒ์ ๋คํ์ด์๋ค.
1. JDK 17 ์ธํ
๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ ๋ฏธ์ ์ ๋ฐ๊ณ ์๊ตฌ์ฌํญ๋ค์ ํ ๋ฒ ์ญ ์ฝ๋ค๊ฐ, 'JDK 17 ๋ฒ์ ์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค.'๋ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ์ฌํญ์ ๋ฐ๊ฒฌํ๋ค. ์ด ์ ๊น์ง ์ญ 11 Version์ ์ฌ์ฉํด์์ด์ ๋ฒ์ ์ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ๋ฐ๊พธ๋ ๋ฐ๊น์ง ๋๋ต 3-40๋ถ์ ๋ ์์ํ ๊ฒ ๊ฐ๋ค.
๋ฒ์ ๋ณ๊ฒฝ์๋ ์๋ ์๋ฃ๊ฐ ๋์์ด ๋ง์ด ๋์๋ค.
2. ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ ์ ๋ฆฌ
JDK 17์ ์ธํ ํ๊ณ , ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ๋ค์ ์ ๋ฆฌํ๋ ๋๋ต ์ด๋ค ํด๋์ค์ ์ด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ ์ง ์ด๋ ดํ์ด ๊ฐ์ ์ก์ ์ ์์๋ค. ํด๋์ค ๋ค์ด๋ฐ์ ํ๊ณ ํด๋์ค์ ์ด๋ค ๊ธฐ๋ฅ์ ๋ฃ์์ง ๊ฐ๋ณ๊ฒ ๋ฉ๋ชจ๋ฅผ ํ์๊ณ , ์ด์ ๋ถํฐ๋ ์ด๋ค ์์, ์ด๋ค ๊ตฌ์กฐ๋ก ๋ง๋ค์ด ๋๊ฐ์ผ ํ ์ง ๊ณ ๋ฏผ์ด์๋ค.
3. ์ค๊ณ๋ฅผ ์ด๋ป๊ฒ ํ ์ง
๊ตฌํ์ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ง๋งํ๋ค. ์์ด ๊ฐ๋๋๋ก ๊ตฌํํด๋ณผ๊น๋ผ๋ ์๊ฐ๋ ํ์ง๋ง, ์ค๊ณ๋ฅผ ์ด๊ธฐ์ ์ ํด๋์ด์ผ ๋์ค์ ๊ณ ์์ ๋ ํ ๊ฒ ๊ฐ์๊ธฐ์ ํ๋ธ๋ฆฟ์ผ๋ก ์ฌ๋ฌ ๋ฒ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ ธ๋ค๊ฐ ์ง์ ๋ค๊ฐ ๋ฐ๋ณตํ๋ฉฐ ์ด์์ ์ด๋ป๊ฒ ๊ทธ๋ ค๋๊ฐ์ง์ ์ง์คํ๋ค.
4. MVC ํจํด์ ์ ๊ฐํด์ ์ง๋ณด์.
- ๋๋ฉ์ธ - ๋๋ฉ์ธ ๊ตฌ์กฐ
์ฒ์์๋ MVC ํจํด์ด ์๋ 'Computer'์ 'Player'๋ผ๋ ๋ ๊ฐ์ง ๋๋ฉ์ธ์ ๋ง๋ค๊ณ ์ด๋ฐ ํ๋ฆ๋๋ก ํด๋ณด๋ ค๊ณ ์๊ฐํ๋ค.
- main์์ Computer๋ฅผ ํธ์ถ
- Computer์์ Player์๊ฒ Input ์์ฒญ
- Player์์ ์ ๋ ฅ๊ณผ ๋์์ Input ๊ฐ์ ๊ฒ์ฆํ ํ Computer์๊ฒ ๊ฐ์ ์ ๋ฌ
- Computer์์ ์ ๋ฌ ๋ฐ์ ๊ฐ์ ํตํด Score๋ฅผ ๊ณ์ฐํด์ Player์๊ฒ ์ ๋ฌ..
์ด๋ ๊ฒ ๋ ๋๋ฉ์ธ์ด ์๋ก ๋ฌธ๋ตํ๋ ๋ฐฉ์์ ์๊ฐํ์๋ค. ๋ฌธ์ ๋ ์ด๋ ๊ฒ ํ๋ฉด ๋ณผ๋ฅจ์ด ์ปค์ง์๋ก, ๋๋ฉ์ธ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๊ณ ๊ทธ๋ ๊ฒ ๋๋ฉด ๊ตฌ์กฐ๊ฐ ์ง๊ด์ ์ผ๋ก ๋ณด์ด์ง ์์ ์ฐ๋ ค๊ฐ ์์ด ์ด ๋ฐฉ์์ ์ฑํํ์ง ์์๋ค.
์ฐพ์๋ณด๋ ์ด์ ๊ฐ์ ์ค๊ณ ๋ฐฉ์์ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(Domain Driven Design)๋ฐฉ์์ด๋ผ๊ณ ํ๋ค๊ณ ํ๋ค.
- MVC ํจํด
MVC ํจํด์ ์๊ฐํ๋ Controller์ ์ด๋ค ๊ฑธ ๋ง๋ค๊ณ , View์ ์ด๋ค ๊ฑธ ๋ง๋ค๊ณ , Model์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ง ๋ฑ๋ฑ ์ข ํฉํ์ฌ ๋๋ต ์ด๋ป๊ฒ ๊ตฌํ์ ํด์ผํ ์ง ๋ณด์ด๊ธฐ ์์ํ๋ค.
5. ๊ฐ์ธ ์ฐ์ต์ฉ ๋ธ๋์น ์์ฑ
์์ง ๊ธฐ๋ฅ๋ง๋ค ์ปค๋ฐํ๋๋ฐ ์ต์์น ์์๊ณ , ์ธ์ ๋ ์ง ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์๊ธฐ์ ์ฐ์ ์ฐ์ต์ ํด๋ณด๊ณ ์ ์ฐ์ต์ฉ ๋ธ๋์น๋ฅผ ํ๋ ์์ฑํ๊ณ ์งํํ๋ค.
์ฐ์ ์๊ตฌ์ฌํญ์ ๋ํด ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ๋ค์ ํ๋์ฉ ๊ตฌํํ๊ณ ์กฐ๋ฆฝํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
๋จผ์ ๋ค์ ๋ค ๊ฐ์ง ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
1) ์ฐ์ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ์ฌํญ์ ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ๋์ 3๊ฐ๋ฅผ ์์ฑํ๋ ํด๋์ค ์์ฑ (NumberGenerator)
2) ์ ๋ ฅ๊ฐ์ ๋ํ ๊ฒ์ฆ๊ธฐ ํด๋์ค ์์ฑ (InputValidator)
3) ์ ๋ ฅ๊ฐ์ ์ค์ฝ์ด๋ก ์ธก์ ํ๊ธฐ ์ ์ปฌ๋ ์ ์ผ๋ก ๋ณํํ๋ ์ปจ๋ฒํฐ ํด๋์ค ์์ฑ (StringToListConvertor)
4) ์ ๋ ฅ๊ฐ์ ๋ํ ์ค์ฝ์ด๋ฅผ ์ธก์ (ex. 1๋ณผ 1์คํธ๋ผ์ดํฌ, 3์คํธ๋ผ์ดํฌ, ๋ซ์ฑ) ํ๋ ํด๋์ค์ ๋ฉ์๋ ์์ฑ (ScoreCalculator)
์ด ํ Domain ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ํจํค์ง ๋ด๋ถ์ Baseball, Computer, Player์ ๋ง๋ค๊ณ , Baseball ๋๋ฉ์ธ์์ ์ธ์คํด์ค ๋ฉค๋ฒ๋ฅผ Computer, Player๋ก ์ค์ ํ์๋๋ฐ ์ด๋ ๊ฒ ํ๋ ๋๋ฉ์ธ์ด ๋๋ฉ์ธ์ ์์กดํ์ฌ ์ด์ํ ๋๋์ ์ฃผ์๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ ๊ตฌ์กฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์๋ก ์ ๋ฆฝํ๋ค.
main์์ Controller๋ฅผ ํตํด ๊ฒ์์ ์คํ -> Controller์์ Service๋ฅผ ํตํด ๋์ ์์ฑ -> View๋ฅผ ํตํด ์ ๋ ฅ๊ณผ ๋์์ ๊ฒ์ฆ -> Controller์์ Service๋ฅผ ํตํด ์ค์ฝ์ด ๊ณ์ฐ -> View๋ฅผ ํตํด ์ถ๋ ฅ
6. ๊ตฌํ
๊ตฌํ ์์ฒด๋ง ๋ณด๋ฉด ๊ทธ๋ฆฌ ์ค๋ ๊ฑธ๋ฆฌ์ง ์์๋ค.
๋ค๋ง ์ปจ๋ฒค์ ์ ์ด๊ธ๋๋ ์์ง ๊ณ ์น์ง ๋ชปํ ์ต๊ด๋ค์ด ์ฝ๋์ ๋๋ฌธ๋๋ฌธ ์กฐ๊ธ์ฉ ๋จ์ ์์๋ค.
์ ์ผ ํฐ ๋ฌธ์ ๋ Controller์ start() ๋ฉ์๋ ๋ด๋ถ while๋ฌธ ์์ if๋ฌธ, if๋ฌธ์์ ๋ if๋ฌธ์ด ๋ค์ด๊ฐ indent๊ฐ 3์ด ๋์ด, ์ด๋ก ์ธํด ๊ฐ๋ ์ฑ์ด ๋๋น ์ง๊ณ , ๋ฉ์๋์ ์์ง๋๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฒ. -> ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋ฉด ๊ณ ์น ์ ์์ ๊ฒ ๊ฐ๋ค.
Day 2
์ฝ๋๋ฅผ ๋ฆฌํํ ๋งํ๊ณ , ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ์ ๋ํด ์๊ฐํด๋ณด์๋ค.
1. ๋ฆฌํํ ๋ง
1. rename : (Output) ์์ PASS -> SUCCESS ๋ณ๊ฒฝ
// private static final String PASS = "3๊ฐ์ ์ซ์๋ฅผ ๋ชจ๋ ๋งํ์
จ์ต๋๋ค! ๊ฒ์ ์ข
๋ฃ";
private static final String SUCCESS = "3๊ฐ์ ์ซ์๋ฅผ ๋ชจ๋ ๋งํ์
จ์ต๋๋ค! ๊ฒ์ ์ข
๋ฃ";
๊ฒ์์์ ์ด๊ฒผ์ ๋ ์ถ๋ ฅํ ๋ฉ์์ง์ ์์ ์ด๋ฆ์ PASS๋ผ๊ณ ๋ค์ด๋ฐ ํ์๋๋ฐ, PASS ๋ณด๋ค๋ SUCCESS๋ WIN์ด ๋ ์ง๊ด์ ์ธ ๋ค์ด๋ฐ์ด๋ผ๊ณ ์๊ฐํด ๋ณ๊ฒฝํ๋ค.
2. ref : (BaseballGameController) ์ง์ญ ๋ณ์ answer ํ๋ -> ์ธ์คํด์ค ํ๋๋ก ๋ณ๊ฒฝ
- '์ง์ญ๋ณ์๋ก ์ฌ์ฉํ๋๋, ์ธ์คํด์ค ํ๋๋ก ์ฌ์ฉํ๋๋'์ ๋ํ ๊ณ ๋ฏผ์ด ์์๋ค.
- ์์ง ๋ช
๋ฐฑํ ๋ต์ ์ฐพ์ง ๋ชปํ์ง๋ง ๊ฐ ํน์ง์ ์๊ฐํด ๋ณผ ์ ์์๋ค.
- ์ธ์คํด์ค ํ๋๋ก ์ฌ์ฉํ ๋ : ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์งํ๊ณ ๊ณต์ ํด์ผ ํ ๋๋ ์ธ์คํด์ค ํ๋๋ฅผ ์ฌ์ฉ.
- ์ง์ญ ๋ณ์ : ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด GC์ ์ํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๋ค.
- ์์ฑํ๋ฉด์ ๊นจ๋ฌ์๊ฑด๋ฐ, ์ฌ๊ธฐ์๋ ์ธ์คํด์ค ํ๋๋ก ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค, ์ง์ญ ๋ณ์๋ก ์ฌ์ฉํ๋๊ฒ ๋ง๋ ๊ฒ ๊ฐ๋ค. ์ธ์คํด์ค ํ๋๋ก ์ฌ์ฉํ๋ฉด ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์์ ํ๋๊ฐ ๊ณต์ ๋ ์ ์๋ค๋ ์ ์ ๊ฐ๊ณผํ๋ค.
- ์ด๋ ๊ฒ ์์ ํ๋ ์ด์ ๋ ํ๋๋ฅผ ์ธ์คํด์ค ํ๋๋ก ํต์ผํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ด๋ ค๋ ์๋์๋๋ฐ, ์ถํ ์ง์ญ๋ณ์๋ก ๋ค์ ๋ณ๊ฒฝํด์ผ๊ฒ ๋ค. (answer ๋ฟ๋ง ์๋๋ผ result ๋ํ)
3. ref : (BaseballGameController) indent depth ๊ฐ 3 ์ธ ๋ฉ์๋ ๋ถ๋ฆฌ
์์ ์
public void start() {
output.printStartMessage();
List<Integer> answer = randomNumberGenerateService.getGeneratedNumbers();
while (true) {
output.printInputRequestMessage();
result = scoreService.calculateScore(input.getInput(), answer);
output.printResult(result);
if (isAllStrike(result)) {
output.printRestartOrExitMessage();
if (input.getExit() == 1) {
answer = randomNumberGenerateService.getGeneratedNumbers();
continue;
}
break;
}
}
}
์์ ํ
public void start() {
output.printStartMessage();
while (true) {
answer = makeNewAnswer();
playOneRound(answer);
if (input.getRestartOrExit() == EXIT) {
break;
}
}
}
private void playOneRound(List<Integer> answer) {
while (true) {
output.printInputRequestMessage();
result = scoreService.calculateScore(input.getSubmit(), answer);
output.printResult(result);
if (scoreService.isAllStrike(result)) {
output.printRestartOrExitMessage();
break;
}
}
}
- indent ๊ฐ ์ปค์ง๋ฉด์ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ณ , ์์ง๋๊ฐ ๋์์ ธ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ ์ง ์ฐ๋ ค๊ฐ ์์๋ค.
- ๋น์ฅ์ ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ๋ฉด์ depth๋ฅผ 2๋ก ๋ฐ๊พธ์์ง๋ง while๋ฌธ ๋ด๋ถ์ if๋ฌธ๋ ๋ฉ์๋๋ก ๋นผ๋ ๋ฐฉ์๋ ์๊ฐํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
4. InputValidator
InputValidator ํด๋์ค์์ ๋ณ๊ฒฝ์ ์ด ์ข ์์๋ค.
1. ์ฐ์ ๋ฉ์๋ ์ด๋ฆ์ ์ซ์๊ฐ ์๋ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ์๋ค.
// public static boolean isBetween1And9(String input) {
public static boolean isBetweenOneAndNine(String input) {
if (input.chars().anyMatch(c -> c < '1' || c > '9')) {
throw new IllegalArgumentException("์
๋ ฅ๊ฐ์ด 1~9 ์ฌ์ด์ ์ซ์๊ฐ ์๋๋๋ค.");
}
// public static boolean isEqualTo1or2(String line) {
// return line.charAt(0) == '1' || line.charAt(0) == '2';
public static boolean isEqualToOneOrTwo(String line) {
if (line.charAt(0) != '1' || line.charAt(0) != '2') {
throw new IllegalArgumentException("1 ๋๋ 2๋ง ์
๋ ฅํด์ผ ํฉ๋๋ค.");
}
return true;
}
2. InputValidator ํด๋์ค์์๋ Player๋ก๋ถํฐ ๋ ์ข
๋ฅ์ ์
๋ ฅ์ ๋ฐ๋๋ค.
- ์ฒซ ๋ฒ์งธ๋ ์ซ์ ์ผ๊ตฌ ๊ฒ์์ ๋ํ ๋ต์ ์ ์ํ๋ ๊ฐ
- ๋ ๋ฒ์งธ๋ ์ฌ์์/์ข ๋ฃ์ ๋ํ ๊ฐ ์ด๋ ๊ฒ ๋ ๊ฐ์ง์ ์ ๋ ฅ๊ฐ.
์ด ๋ ๊ฐ์ง์ ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆํ๋ ๋ก์ง๋ค์ด ํต์ผ์ด ๋์ด์์ง ์์ ํ ๋ก์ง์ผ๋ก ํต์ผํ์๋ค.
- ํต์ผํ ๋ก์ง : if๋ฌธ์์ ์์ธ์กฐ๊ฑด์ ๊ฒ์ฌํ๊ณ ์์ธ๊ฐ ๋ฐ์ํ๋ ์ผ์ด์ค๋ฉด IllegalArgumentException์ ๋์ง๊ณ , ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด true๋ฅผ ๋ฆฌํดํ๋ ๋ฐฉ์์ผ๋ก ํต์ผ
Before
public static boolean isEqualTo1or2(String line) {
return line.charAt(0) == '1' || line.charAt(0) == '2';
}
After
public static boolean isEqualToOneOrTwo(String line) {
if (line.charAt(0) != '1' && line.charAt(0) != '2') {
throw new IllegalArgumentException("1 ๋๋ 2๋ง ์
๋ ฅ ๊ฐ๋ฅํฉ๋๋ค.");
}
return true;
}
3. void validateXXX -> boolean isXXX
- ๊ธฐ์กด : validateXXX ๋ฉ์๋๋ฅผ Input ํด๋์ค์์ ์ ๋ ฅ์ ๋ํ ๊ฒ์ฆ์ ํ ๋ validateXXX(line)๋ฅผ ํธ์ถํ์ฌ ๊ฒ์ฆ
- ๋ณ๊ฒฝ : ์ง๊ด์ ์ผ๋ก ์๋ฟ์ง ์์ ์ฐ๋ ค๊ฐ ์์ด boolean์ผ๋ก ๋ณ๊ฒฝํ๊ณ if(isXXX(line))์ผ๋ก ๋ณ๊ฒฝํ์๋ค.
Before
public static boolean validateInput(String input) {
if (isThreeChar(input) && isNumber(input) && isBetween1And9(input) && isNotDuplicate(input)) {
return true;
}
return false;
}
public static void validateExit(String line) {
if (!isLengthOne(line)) {
throw new IllegalArgumentException("1 ๋๋ 2๋ง ์
๋ ฅํด์ผ ํฉ๋๋ค.");
}
if (!isEqualTo1or2(line)) {
throw new IllegalArgumentException("1 ๋๋ 2๋ง ์
๋ ฅํด์ผ ํฉ๋๋ค.");
}
}
After
public static boolean isSubmitValid(String input) {
if (isThreeChar(input) && isNumber(input) && isBetweenOneAndNine(input) && isNotDuplicate(input)) {
return true;
}
return false;
}
public static boolean isRestartOrExitValid(String input) {
if (isLengthOne(input) && isEqualToOneOrTwo(input)) {
return true;
}
return false;
}
5. ํจํค์ง ๊ตฌ์กฐ ๋ณ๊ฒฝ
- util์ validator๋ฅผ exception ํจํค์ง๋ก ๋นผ๊ณ , converter๋ฅผ ์์ ํจํค์ง๋ก ์ฌ๋ ธ๋ค.
- ๊ทผ๊ฑฐ : util ํจํค์ง๋ผ๊ณ ์ด๋ฆ ์ง๊ธฐ์ ์ง๊ด์ ์ด์ง ์๊ณ , validator๋ ๋ฐ์ง๊ณ ๋ณด๋ฉด ์์ธ๋ฅผ ๊ฒ์ฆํ๋ ํจํค์ง๊ธฐ ๋๋ฌธ์ exception ํจํค์ง๋ก ๋นผ๋ ๊ฒ์ด ๋ ๊ฐ๋ ์ฑ์ด ์ข๋ค๊ณ ํ๋จ
2. ๊ตฌ์กฐ ๋ณ๊ฒฝ
ํ์ฌ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉด
Model์๋ Result ๋ฟ์ด๊ณ , Domain์ด ํ๋๋ ์๋ค. Model์๋ View์ ๋ด์ ๋ฐ์ดํฐ๋ง ๋ด์ผ๋ฉด ๋๋ค๊ณ ์๊ฐํด์ Result ํด๋์ค ํ๋๋ง ๋ง๋ค์๋๋ฐ, ์ํ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด๋ ๋ชจ๋ธ์ด ๋ ์ ์๋ค๋ ๊ฒ์ ๊ฐ๊ณผํ๊ณ ์์๋ค.
Domain์ Player์ Computer๋ฅผ ์์ฑํ๊ณ ์ด ๋ ๊ฐ์ฒด๋ฅผ ํ์ฌ ์ํ๋ฅผ ๋ด๋ ๋ชจ๋ธ๋ก ์ฌ์ฉํด์ Controller์์ ์ด ๋ ๋ชจ๋ธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ก ์ค๊ณํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ ์ค ํ๋์ธ ๊ฒ ๊ฐ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ ์๋ฅผ ๊ณ์ฐํ๋ ๋ก์ง๊ณผ ์ ๋ต์ ์์ฑํ๋ ๋ก์ง์ Computer์ ๋ด๊ณ Service ๊ณ์ธต ์์ฒด๋ฅผ ์ญ์ ํ ์ ์๋ค. ์ฐ์ ๋ด์ผ ๋๋ฉ์ธ์ ๋ง๋ค์ด ์๋น์ค ๋ก์ง์ ๋์ด ๋๋ฉ์ธ์์ ์๋น์ค์ ์ญํ ์ ํ๋๋ก ํ ์ง, ์๋๋ฉด Computer, Player ๋๋ฉ์ธ์ ์ฌ์ฉํ์ง ์๊ณ ๊ธฐ์กด ๋ฐฉ์๋๋ก ๊ฐ ์ง ๊ณ ๋ฏผํด๋ณด์์ผ ํ ๊ฒ ๊ฐ๋ค.
10/21 - Day 3
1. ๋ฆฌํํ ๋ง
์ด์ ์์ด๋์ด๋ฅผ ํ ๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟ์ ํ ๋ฒ ์งํํด๋ณด์๋ค.
- ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด์ ์๋น์ค ๊ณ์ธต์ ์์จ ์ ์์๋ค. MVC ํจํด์ด๋ผ ํจ์ ์คํ๋ง์์๋ Controller ๊ณ์ธต์ด Service ๊ณ์ธต์ ํตํด ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ์ง๋ง, ์ง๊ธ ํ๋ ๋ฏธ์ ์ ์์ ์๋ฐ๋ก ํด๋ฆฌ์ดํด์ผํ๋ ๋ฏธ์ ์ด๋ Service ๊ณ์ธต์ ๋๋ ๊ฒ ๋ณด๋ค Model-Controller-View 3 Layer๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋ง๋ ๊ฒ ๊ฐ๋ค.
1. ์๋ก ์์ฑํ Model : Computer.class
public class Computer {
private static final Integer BALL_SIZE = 3;
private final static Integer FIRST_NUMBER = 1;
private final static Integer LAST_NUMBER = 9;
public List<Integer> getGeneratedNumbers() {
List<Integer> answer = new ArrayList<>();
while (answer.size() < BALL_SIZE) {
int randomNumber = Randoms.pickNumberInRange(FIRST_NUMBER, LAST_NUMBER);
addIfNotInList(answer, randomNumber);
}
return answer;
}
Computer ๋ชจ๋ธ์์ ๋์ 3๊ฐ(์ ๋ต)๋ฅผ ์์ฑํ๋ ๋ฉ์๋, ์ ์๋ฅผ ๊ณ์ฐํ๋ ๋ฉ์๋๋ฅผ ๋์๋ค. ์ด๋ ๊ฒ ํ์ฌ Service ๊ณ์ธต์ ์ญ์ ํ ์ ์์๋ค. ๋ ๊ธฐ๋ฅ์ ํ ํด๋์ค์ ๋ด์ผ๋ ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ๋ฐ์ ์์๋ค. ์ถํ ์ด ๋ ๋ฉ์๋๋ฅผ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ์งง๊ฒ ์ค์ฌ์ผ๊ฒ ๋ค.
2. ์๋ก ์์ฑํ Model : Player.class
public class Player {
private List<Integer> numbers;
private Integer restartOrExit;
public void inputNumbers() {
String input = Console.readLine();
if (!isInputNumbersValid(input)) {
throw new IllegalArgumentException();
}
this.numbers = StringToList(input);
}
public void inputRestartOrExit() {
String input = Console.readLine();
if (!isRestartOrExitValid(input)) {
throw new IllegalArgumentException();
}
this.restartOrExit = Integer.parseInt(input);
}
public List<Integer> getNumbers() {
return numbers;
}
public Integer getRestartOrExit() {
return restartOrExit;
}
}
- Player๋ ๋ ๊ฐ์ง ์ํ(ํ๋)๋ฅผ ๊ฐ์ง๋ค.
- ์ฒซ์งธ, ์ซ์ ์ผ๊ตฌ ๊ฒ์์ ๋ต์ ์ ์ํ๋ ํ๋
- ๋์งธ, ์ซ์ ์ผ๊ตฌ ๊ฒ์์์ ์น๋ฆฌํ์์ ๋, ์ฌ์์/์ข ๋ฃ ์ฌ๋ถ๋ฅผ ์ ์ํ๋ ํ๋
inputXXX() ๋ฉ์๋๋ก ํ์ฌ ์ํ๋ฅผ Console์ ํตํด ์ ๋ ฅ๋ฐ์ ๊ฒ์ฆ๊น์ง ๋ง์น ํ ์ ์ฅํ๊ณ , getXXX()์ ํตํด ํ์ฌ ์ํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
+ ์ด๋ ๊ฒ ์์ ํจ์ผ๋ก์จ BaseballGameController์ start() ๋ฉ์๋์์ indent depth๋ฅผ 1๋ก ์ค์ผ ์ ์์๋ค.
์์ ์ BaseballGameController.start()
public void start() {
output.printStartMessage();
while (true) {
answer = makeNewAnswer();
playOneRound(answer);
if (input.getRestartOrExit() == EXIT) {
break;
}
}
}
์์ ํ BaseballGameController.start()
public void start() {
printStartMessage();
while (player.getRestartOrExit() != EXIT) {
playOneRound(computer.getGeneratedNumbers());
player.inputRestartOrExit();
}
}
3. ๊ธฐ์กด์ Result(Model) ๋ณ๊ฒฝ์
1. Result ๋ณด๋ค Score ๋ผ๋ ์ด๋ฆ์ด ๋ ์ง๊ด์ ์ด์ฌ์ ์ด๋ฆ์ ๋ฐ๊พธ์๋ค.
2. isAllStrike()๋ฅผ ScoreService์์ ๊ฒ์ฌํ๋๋ฐ ์๋น์ค ๊ณ์ธต์ ์์ ๊ณ , ๊ฐ์ฒด ์์ฒด์์ ๊ฒ์ฆํ๋๋ก ๋ณ๊ฒฝํ์๋ค.
- ์๊ฐํด๋ณด๋ฉด Score๋ฅผ ScoreService์์ ๊ฒ์ฌํ๋ ๊ฒ ๋ณด๋ค, Score์์ ๊ฒ์ฆํ๋ ๊ฒ์ด ๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ค๊ณ๋ผ๊ณ ๋ณผ ์ ์๋ค. (์๋น์ค ๊ณ์ธต์ ์ง์ฐ๋ฉด์ ์์ฐ์ค๋ฝ๊ฒ ์ป์ด๊ฑธ๋ฆฐ ๋๋)
- ๊ฐ์ฒด ์งํฅ์ ์ธ ์ค๊ณ ๋ฐฉ์์ ์ฒดํํ๋ ์ฐ์ต์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
public class Score {
private static final Integer THREE_STRIKE = 3;
...
public boolean isAllStrike() {
return getStrike() == THREE_STRIKE;
}
}
4. InputView ์ญ์ .. ์ด๊ฒ ๋ง๋๊ฑธ๊น? ๊ณ ๋ฏผ์ด์ง๋ง ์ฐ์ ๋ฐ๊พธ์ด๋ณด์๋ค.
View์๋ '์ฌ์ฉ์๋ง๋ค ๋ค๋ฅด๊ฒ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ ๋ฐ์ดํฐ'๋ฅผ ๋ด์์ผ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ณตํต์ผ๋ก ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊น? ์์ง ๊ณ ๋ฏผ์ด์ง๋ง ๋ฐ๊พธ์ด๋ณด์๋ค.
๊ธฐ์กด InputView์์ ์ฌ์ฉ์์๊ฒ ๊ณตํต์ผ๋ก ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ '์ ๋ ฅ์ ๊ดํ ์๋ด ๋ฉ์์ง'๋ฅผ ๋ด์๋ค. ํ์ง๋ง View์๋ ์ฌ์ฉ์๋ง๋ค '๋ค๋ฅด๊ฒ' ๋ณด์ฌ ์ฃผ์ด์ผํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ผ ํ๋ค๊ณ ์๊ฐํ๋, InputView์์ ์ํํ๋ ์ญํ ์ ์ปจํธ๋กค๋ฌ์์ ์ํํ๋ ๊ฒ์ด ๋ง๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํด์, ์ปจํธ๋กค๋ฌ๋ก ๋ฉ์๋๋ฅผ ์ด๋ํ๊ณ , InputView๋ฅผ ์ญ์ ํ๋ค.
๊ฒ์ ์์ ๋ฉ์์ง ์ถ๋ ฅ ( BaseballGameController.class )
public void printStartMessage() {
System.out.println(START_MSG);
}
์ซ์ ์ ๋ ฅ ์์ฒญ ๋ฉ์์ง ์ถ๋ ฅ ( BaseballGameController.class )
public void printSuggestNumberMessage() {
System.out.print(REQUEST_NUMBER_MSG);
}
์ข ๋ฃ ์ฌ๋ถ ์ ๋ ฅ ์์ฒญ ๋ฉ์์ง ์ถ๋ ฅ ( BaseballGameController.class )
public void printRestartOrExitMessage() {
System.out.print(REQUEST_RESTART_OR_EXIT_MSG);
}
2. ์์ ํด์ผ ํ ์ฌํญ๋ค
1. BaseBallGameController์ playOneRound() ๋ฉ์๋์ indent depth๊ฐ 2
private void playOneRound(List<Integer> answer) {
while (true) {
printSuggestNumberMessage();
player.inputNumbers();
Score score = computer.calculateScore(player.getNumbers(), answer);
outputView.printResult(score);
if (score.isAllStrike()) {
printRestartOrExitMessage();
break;
}
}
}
- start() ๋ฉ์๋์ indent depth๋ 1๋ก ์ค์ผ ์ ์์์ง๋ง, ์์ง playOneRound()์ indent depth๋ 2๋ก ์ ์ง๋๊ณ ์๋ค. ์ด๋ป๊ฒ ๋ฐ๊ฟ์ผ indent๋ฅผ 1๋ก ์ ์งํ ์ ์์ ์ง ์๊ฐํด๋ณด์์ผ ๊ฒ ์ง๋ง, ํ์ฌ๋ก์ ์ข์ ์์ด๋์ด๊ฐ ๋ ์ค๋ฅด์ง ์๋๋ค. ๊ณ์ ๊ณ ๋ฏผํด๋ด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
2. OutputView์ printResult() ๋ฉ์๋์์ score๋ฅผ ์ธ์๋ก ๋ฐ์ score๋ฅผ ์กฐ๊ฑด๋ถ๊ธฐ๋ก "๊ฒ์ฌ" ํ๊ณ ์๋ค.
public void printResult(Score score) {
if (score.getBall() == 0 && score.getStrike() == 0) {
System.out.println(NOTHING);
return;
} else if (score.getStrike() == 3) {
System.out.println(THREE_STRIKE);
System.out.println(SUCCESS);
return;
}
System.out.println(score.getBall() + BALL + score.getStrike() + STRIKE);
}
- printResult๋ผ๊ณ ํ๋ฉด result๋ก๋ถํฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ '์ถ๋ ฅ'์ ์ค์ ์ ๋ ๋ฉ์๋์ธ๋ฐ, ์ด ๋ฉ์๋์์ score๋ฅผ '๊ฒ์ฌ'ํ์ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ถ๋ ฅ์ ๋ฌ๋ฆฌํ๊ณ ์๋๋ฐ, '์ถ๋ ฅ'๊ณผ '๊ฒ์ฆ'์ ๋ถ๋ฆฌ๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค. ์ด ๋ํ ์์ง ์ข์ ์์ด๋์ด๊ฐ ๋ ์ค๋ฅด์ง ์์ ๊ณ ๋ฏผํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
3. ์๊น๋ ์ธ๊ธํ์ง๋ง, Computer๊ฐ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉด์ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ์๋ค. ํด๋์ค ๋ถ๋ฆฌ๊ฐ ํ์.
public class Computer {
private static final Integer BALL_SIZE = 3;
private final static Integer FIRST_NUMBER = 1;
private final static Integer LAST_NUMBER = 9;
public List<Integer> getGeneratedNumbers() {
List<Integer> answer = new ArrayList<>();
while (answer.size() < BALL_SIZE) {
int randomNumber = Randoms.pickNumberInRange(FIRST_NUMBER, LAST_NUMBER);
addIfNotInList(answer, randomNumber);
}
return answer;
}
private void addIfNotInList(List<Integer> answer, int randomNumber) {
if (!answer.contains(randomNumber)) {
answer.add(randomNumber);
}
}
public Score calculateScore(List<Integer> playerInput, List<Integer> answer) {
Integer strike = calculateStrike(playerInput, answer);
Integer ball = calculateBall(playerInput, answer);
return new Score(strike, ball);
}
public Integer calculateStrike(List<Integer> playerInput, List<Integer> answer) {
return (int) IntStream.range(0, answer.size())
.filter(index -> playerInput.get(index)
.equals(answer.get(index)))
.count();
}
public Integer calculateBall(List<Integer> playerInput, List<Integer> answer) {
return (int) IntStream.range(0, answer.size())
.filter(index -> excludeStrike(playerInput, answer, index) && includeBall(playerInput, answer, index))
.count();
}
private boolean excludeStrike(List<Integer> playerInput, List<Integer> answer, int index) {
return !playerInput.get(index).equals(answer.get(index));
}
private boolean includeBall(List<Integer> playerInput, List<Integer> answer, int index) {
return playerInput.contains(answer.get(index));
}
}
- 50 line์ด ๋์ด๊ฐ ์ ๋๋ก ๋ผ์ธ์ด ๊ธธ์ด์ง๊ณ ์๋๋ฐ, ํด๋์ค๋ฅผ ๋ถ๋ฆฌํด์ ์ํฐํฐ๋ฅผ ์๊ฒ ์ ์งํด์ผ ํ ์ง ๊ณ ๋ฏผ์ค์ด๋ค.
4. Player์ ํ๋๋ค์ ํฌ์ฅํด์ผ ํ ์ง ๊ณ ๋ฏผ.
- ’์ ๋ ฅ‘์ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด ๊ณตํต๋๋ ํ๋์ธ ๋ ํ๋๋ฅผ ํ๋์ ํด๋์ค๋ก ๋ฌถ์ ์ดํ, ๋ฌถ์ ํด๋์ค ๋ด๋ถ์์ ๊ฐ์ ๊ฒ์ฆํ๋๋ก ํ์ฌ ์์ ํด๋์ค์ ๊ณผ๋ํ ์ฑ ์์ ์ฃผ๋ ๊ฒ์ ๋ง์ ์ ์์ ๊ฒ ๊ฐ๋ค.
public class Player {
private List<Integer> numbers;
private Integer restartOrExit;
+ ์๋ํด๋ณธ ๊ฒฐ๊ณผ, Player ๋๋ฉ์ธ์์ ํ๋์ ์ํ์ ๋ํ ๊ฒ์ฌ๋ฅผ ํ๋ '์ฑ ์'์ด ๊ณผ์ค๋๋ ๊ฒ์ ๋ง์ ์ ์์๋ค.
But ๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ ๋ณด์๋ค..
10/22 - Day 4
1. ์ ์ถ์ฉ ๋ธ๋์น ์์ฑ
์ด๋์ ๋ ๊ฐ์ ์ก์์ผ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ ์ถ์ฉ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ์งํํ๋ค.
2. ๋ฆฌํํ ๋ง
0. ์ด์ ๋ํํ Input ํด๋์ค๋ฅผ ๋ํ์ ํ๊ธฐ๋ก ๊ฒฐ์ .
๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ ๋ณด์ด๋ ๊ฑด ๋์งธ์น๊ณ ์ฝ๋์ ํ์ ์ด ์์ด์ ์ฐ์ ๋ค์ ์๋๋๋ก ๋ฐ๊พธ์๋ค.
1. Controller์์ ์ํํ๋ ์ ๋ ฅ ์๊ตฌ ๋ฉ์์ง ์ถ๋ ฅ ๊ธฐ๋ฅ์ InputView ํด๋์ค๋ฅผ ์์ฑํด์ ์ญํ ์์
public class InputView {
private static final String REQUEST_RESTART_OR_EXIT_MSG = "๊ฒ์์ ์๋ก ์์ํ๋ ค๋ฉด 1, ์ข
๋ฃํ๋ ค๋ฉด 2๋ฅผ ์
๋ ฅํ์ธ์.";
private static final String REQUEST_NUMBER_MSG = "์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ : ";
public void printSuggestNumberMessage() {
System.out.print(REQUEST_NUMBER_MSG);
}
public void printRestartOrExitMessage() {
System.out.println(REQUEST_RESTART_OR_EXIT_MSG);
}
}
- View๊ฐ ๋ชจ๋ธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋, '์ฌ์ฉ์๋ง๋ค ๋ค๋ฅด๊ฒ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ ๋ฐ์ดํฐ์ ๋ํด์๋ง ๋ฐ์์ผ ํ๋ค'๋ ๋ฃฐ์ "'๋ทฐ'์๋ ๋ค๋ฅด๊ฒ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ ๋ฐ์ดํฐ๋ง ๋ด์ ์ ์๋ค"๊ณ ์๋ชป ์ดํดํ๊ณ ์์๋ค.
- InputView๋ '๋ชจ๋ธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ง ์๋๋ค'. ๊ทธ๋ ๋ค๋ฉด ๋ค๋ฅด๊ฒ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค..!
- ๊ทธ๋์ ์ปจํธ๋กค๋ฌ์์ ์ํํ๋ ์ ๋ ฅ ์์ฒญ ๋ฉ์์ง ์ถ๋ ฅ ๊ธฐ๋ฅ์ InputView๋ก ๋นผ์ฃผ์๋ค. (์ฌ์ค ์ด๊ฒ๊น์ง ์ปจํธ๋กค๋ฌ๊ฐ ์ํํ๋ ๊ฒ๋ ๋๋ฌด ๊ณผ์ค๋๋ค.)
+ ๊ฒ์ ์์์ ๊ดํ ๋ฉ์์ง ์ถ๋ ฅ์ InputView๋ก ๋นผ์ง ์๊ณ Controller์์ ์ํํ๋๋ก ๋์๋ค.
์ด์ ๋ InputView๋ ์ ๋ ฅ์ ๊ดํ ๋ฉ์์ง, OutputView๋ ๊ฒฐ๊ณผ์ ๊ดํ ๋ฉ์์ง๋ฅผ ๋ด๊ณ ์์ง๋ง ๊ฒ์ ์์์ ๊ดํ ๋ฉ์์ง๋ ๋ ๊ณณ ๋ชจ๋ ํด๋นํ์ง ์๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํ๊ณ , ๊ฒ์ ์์์ ๊ดํ ๋ฉ์์ง๋ ํ๋ ๋ฟ์ด๋ผ ์ด๋ฅผ ์ํ ํด๋์ค๋ฅผ ํ๋ ๊ฒ ๋ณด๋ค, ์ปจํธ๋กค๋ฌ์์ ์ด ํ๋์ฏค์ ์ํํด๋ ๋ฌธ์ ์์ ๊ฑฐ๋ผ ์๊ฐํด์.
public class BaseballGameController {
private static final String START_MSG = "์ซ์ ์ผ๊ตฌ ๊ฒ์์ ์์ํฉ๋๋ค.";
...
public void printStartMessage() {
System.out.println(START_MSG);
}
}
2. Controller์ playOneRound ๋ฉ์๋์ indent depth ์ค์ด๋ ๋ฐ ์ฑ๊ณต
์์ ์
public void start() {
printStartMessage();
while (player.getRestartOrExit() != EXIT) {
playOneRound(computer.getGeneratedNumbers());
player.inputRestartOrExit();
}
}
private void playOneRound(List<Integer> answer) {
while (true) {
printSuggestNumberMessage();
player.inputNumbers();
Score score = computer.calculateScore(player.getNumbers(), answer);
outputView.printResult(score);
if (score.isAllStrike()) {
printRestartOrExitMessage();
break;
}
}
}
์์ ํ
public void start() {
printStartMessage();
while (player.getRestartOrExit() != EXIT) {
playOneRound(computer.generateNumber(), new Score(INIT_STRIKE, INIT_BALL));
player.inputRestartOrExit();
}
}
private void playOneRound(List<Integer> answer, Score score) {
while (!score.isAllStrike()) {
inputView.printSuggestNumberMessage();
player.inputNumbers();
score = computer.calculateScore(player.getNumbers(), answer);
outputView.printResult(score);
}
inputView.printRestartOrExitMessage();
}
- score์ initial ๊ฐ์ ๋ฃ๊ณ argument๋ก ๋๊ธฐ๋ if๋ฌธ์ ์จ์ฃผ์ง ์๊ณ ๋ฐ๋ก while๋ฌธ์์ ๊ฒ์ฌํ๊ฒ ๋ณ๊ฒฝํ ์ ์์๋ค. ์ด๋ก์จ indent depth๋ 1์ด ๋์๋ค. ๋ฟ๋ฏํ๋ค.
+ ๊ฐ๋ ์ฑ์ ์ํด ๋ฉ์๋๋ช ์ ๋ฐ๊พธ๊ณ , ์ปจ๋ฒค์ ์ ๋ง์ง ์๋ ์ฝ๋๋ค์ ์์ ํด ๋๊ฐ๋ฉด์ ์ ์ถ์ฉ ๋ธ๋์น์ ๊ธฐ๋ฅ๋ณ๋ก ์ปค๋ฐํ๋ ํ๋ฃจ๊ฐ ๋ค ์ง๋๊ฐ๋ค.
10/23 - Day 5
์๋ ์ค๋์ ์ฝ๊ฐ์ ๋ฆฌํํ ๋ง ์ดํ ํ ์คํธ ์ฝ๋ ์์ฑ์ ํ์ ์ฃผ๋ ค ํ์ง๋ง ์ด์ฐํ๋ค๋ณด๋ ๋ฆฌํํ ๋ง๊ณผ ๋๋ฒ๊น ํ๋๋ฐ ๋ง์ ์๊ฐ์ ์๊ฒ ๋์๋ค.
1. util ํจํค์ง
model๋์๋๊ณ view๋์๋๊ณ controller๋ ์๋ ํด๋์ค๋ค์ 'util'์ด๋ผ๋ ํจํค์ง๋ก ๋ฌถ์ผ๋ ์ง๊ด์ฑ์ด ๋จ์ด์ ธ ๋ณด์๋ค. ๋ฌด์๋ณด๋ค๋ util์ ๋ง์ ํด๋์ค๋ค์ด ๋ถํฌํ๋ค ๋ณด๋, ์ด ์ญํ ์ ๋๋ฉ์ธ์์ ์ํํ ์ ์์ง ์์๊น ์ถ๊ธฐ๋ ํ๋ค.
util ํจํค์ง๋ฅผ ๋ณด๋ฉด NumberGenerator, ScoreCalculator๋ Computer์์ ์ฌ์ฉํ๊ณ , InputValidator, StringToIntegerListConverter๋ Player์์ ์ฌ์ฉํ๋ค. NumberGenerator๊ฐ ํ๋ ๊ธฐ๋ฅ์ Computer์ ๊ตฌํํ๋ฉด NumberGenerator ํด๋์ค๋ฅผ ์ญ์ ํด๋ ๋์ง ์์๊น? ์๊ฐํ๋ค๊ฐ ๋ ์ฌ๋ฆฐ ๊ฒ์ด '์ผ๊ธ ์ปฌ๋ ์ '์ด๋ค.
"์ผ๊ธ ์ปฌ๋ ์ "์ ์ ์ฉํ ๊ตฌ์กฐ๋ ์ด๋ ๋ค.
Computer๊ฐ GameAnswer, Score์ ์ธ์คํด์ค ๋ฉค๋ฒ๋ณ์๋ฅผ ๊ฐ์ง๋ค.
ํ๋์ฉ ์์๋ณด์.
Computer
GameAnswer
- ์ด ๋ GameAnswer๋ List<Integer> answer์, makeAnswer()๋ผ๋ ์ธ์คํด์ค ๋ฉค๋ฒ๋ฅผ ๊ฐ์ง๋๋ฐ, makeAnswer()์ NumberGenerator๊ฐ ํ๋ ์ญํ ์ ๊ตฌํํ์ฌ answerํ๋์ ์์ฑํ ์ซ์๋ฅผ ํ ๋นํด์ฃผ๋๋ฐฉ์์ด๋ค.
Score
- Integer strike, Integer ball์ด๋ผ๋ ํ๋์, calculate()๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- calculate() ๋ฉ์๋์ ScoreCalculator๊ฐ ํ๋ ์ญํ ์ ๊ตฌํํ์ฌ ์ ์๋ฅผ ๊ณ์ฐํ๋ค. ๊ณ์ฐํ ๊ฐ์ strike, ball์ ๊ฐ์ ํ ๋นํด์ค๋ค.
Player
GuessNumbers
- List<GuessNumber> guessNumbers ํ๋์, validateGuessNumbers() ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค.
- ์ฌ๊ธฐ์ GuessNumber๋ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ 3๊ฐ์ ์ซ์ ์ค ํ๋์ ์ซ์๋ฅผ ๋งํ๋ค.
- GuessNumber
- Integer number ํ๋์ validateGuessNumber() ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค.
- validateGuessNumber() ๋ฉ์๋๋ก ์ ๋ ฅํ ์ซ์ 'ํ๋'์ ๋ํ ๊ฒ์ฆ์ด ์ด๋ฃจ์ด์ง๋ค.
- validateGuessNumbers()์์๋ ์ ๋ ฅํ ์ซ์ 3๊ฐ์ ๋ํ ๊ฒ์ฆ์ด ์ด๋ฃจ์ด์ง๋ค. ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด List<GuessNumber> guessNumbers์ ๊ฐ์ด ํ ๋น๋๋ค.
์ผ๊ธ ์ปฌ๋ ์ ์ ์ ์ฉํ๋ ํด๋์ค๊ฐ ๋ถ๋ฆฌ๋จ์ผ๋ก์จ ์ฑ ์์ด ๋ถ๋ฆฌ๋๋ ์ฝ๋๊ฐ ์กฐ๊ธ ๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ฐ๋๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.
2. ApplicationTest์ ํ ์คํธ์ฝ๋๊ฐ ๋์๊ฐ์ง ์๋ ๋ฌธ์
- ๊ตฌํ์ด ์๋ฃ๋๋ฉด ApplicationTest์ ๋ชจ๋ ํ ์คํธ๊ฐ ์ฑ๊ณตํด์ผ ํ๋ค.
- ๋ฌธ์ ๋ ๋ฏธ์ ์์ ์ ์ํ ๋ ๊ฐ์ง์ ํ ์คํธ ์ฝ๋๋ฅผ ํ๋์ฉ ๋๋ฆฌ๋ฉด ์ฑ๊ณตํ๋๋ฐ, ์ ์ฒด๋ฅผ ์คํํ๋ ๋ ๋ฒ์งธ ํ ์คํธ์ฝ๋๊ฐ ๋์ํ์ง ์๋ ๊ฒ์ด์๋ค.
๋ถ๋ช ๋ฉ์ธ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๊ธธ์ด๊ฐ 3์ด๊ณผ์ธ ์ ๋ ฅ์ ๋ํด์ ์์ธ๊ฐ ์ ๋ฐ์ํ๋๋ฐ ๋์ ํ ์ ์ ์๋ ๋ ธ๋ฆ์ด์๋ค.
๊ฒฐ๊ตญ ์ด์ ํ ์คํธ๊ฐ ๋ค์ ํ ์คํธ์ ์ํฅ์ ์ค๋ค๋ ๊ฒ์ธ๋ฐ.. ์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ผ๊น?
"ํ๋์ฉ ๋์๊ฐ๋ฉด ์ฑ๊ณต" + "์ ์ฒด๋ฅผ ๋๋ฆฌ๋ฉด ์คํจ" + "์์ธ๋ฅผ ์ก์ง ๋ชปํ๋ค๋ ๋ฉ์์ง๋ง ์ถ๋ ฅ" + "๋ฉ์ธ์์๋ ์์ธ๋ฅผ ์ ์ก์" = ๋๋์ฒด ๋ฌธ์ ๊ฐ ๋ฌด์์ธ๊ฐ..
๋ฉ์ธ ๋ก์ง์ ๋ฌธ์ ๊ฐ ์๋ ์ดํด๋ดค์ง๋ง ๋ฌธ์ ๋ ์์๋ค.
๊ฒฐ๊ตญ ์ด๊ฒ์ ๊ฒ ์๋ํด๋ณด๋ค๊ฐ ํน์๋ GameStateNumber enum์ด ๋ฌธ์ ์ธ๊ฐ ์ถ์ด, enum์ class๋ก ๋ณ๊ฒฝํด ๋ณด์๋ค.
public enum GameStateNumber {
DEFAULT(0), RESTART(1), EXIT(2);
private Integer stateNumber;
GameStateNumber(Integer stateNumber) {
this.stateNumber = stateNumber;
}
public void input() {
String input = Console.readLine();
validateGameStateNumber(input);
this.stateNumber = Integer.parseInt(input);
}
private void validateGameStateNumber(String input) {
if (!isGameStateNumberValid(input)) {
throw new IllegalArgumentException();
}
}
public boolean isExit() {
if (this.stateNumber == EXIT.stateNumber) {
return true;
}
return false;
}
}
์ถ์ธก์ปจ๋ฐ, ์ ์ํด ์ค ํ ์คํธ ์ฝ๋์์๋ enum์์ ๋์ง ์์ธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ ๊ฒ ๊ฐ์๋ค. ์ ์ํด์ค ํ ์คํธ ์ฝ๋๋ฅผ ์์ ํ ์๋ ์๋ ์ํฉ์ด๋ผ ๊ทธ๋ฅ enum์ class๋ก ๋ฐ๊พธ์ด์ ์งํํ๊ธฐ๋ก ํ๋ค.
์์ ํ
public class GameStateNumber {
private static final Integer START = 1;
private static final Integer EXIT = 2;
private Integer stateNumber;
public GameStateNumber() {
this.stateNumber = START;
}
public void input() {
String input = Console.readLine();
validateGameStateNumber(input);
this.stateNumber = Integer.parseInt(input);
}
private void validateGameStateNumber(String input) {
if (!isGameStateNumberValid(input)) {
throw new IllegalArgumentException();
}
}
public boolean isExit() {
if (this.stateNumber == EXIT) {
return true;
}
return false;
}
}
'์ค๋ง ์ด๊ฑด๊ฐ?' ํ๋ ๊ฒ์ด ์ป์ด ๊ฑธ๋ฆฐ ๋๋์ด๋ผ ํ๋ จํ๊ธฐ๋ ํ์ง๋ง, ๋๋ฒ๊น ๊ณผ์ ์ด ์ฐธ์ผ๋ก ์ํ์น ์์๋ค.
10/25 - Day 6
์ค๋์ ๊ธฐ์ด์ฝ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋ค๊ณ ๋ค์งํ๊ฑด๋ง, ์๊พธ ๋ ์ฝ๋๋ฅผ ์ข๊ฒ ๋ฐ๊พธ๊ณ ์ถ์ ์์ฌ์ด ๋ ์ปธ๋ค.
์ฌ๋ฌ ์ํ์ฐฉ์ค๊ฐ ๋ง์์ง๋ง, ๊ตต์ง๊ตต์งํ ๋ฆฌํํ ๋ง๋ค๋ง ๋ชจ์์ ์ดํด๋ณด์.
1. CommonView ๋์
OutputView์์๋ ๊ฒ์์ ๋ํ ํ๋ ์ด์ด์ ์ ์๋ฅผ, InputView์์๋ ์ ๋ ฅ์ ๋ํ ์๋ด ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฌ์ฉ์์๊ฒ ๊ณตํต์ผ๋ก ๋ณด์ฌ์ฃผ์ด์ผ ํ ๋ฉ์์ง๋ ์ด๋์ ๋์ด์ผ ํ ๊น?
๊ณตํต์ ์ผ๋ก ๋ณด์ฌ์ฃผ์ด์ผ ํ ๋ฉ์์ง๊ฐ ํ๋๋ฟ์ด๋ผ ์ด๊ฑธ ์ํด View๋ฅผ ๋ง๋ค๊ธฐ๋ ์ ๋งคํด ๋ณด์๊ณ , Controller์์ ์ด ํ๋์ฏค์ ์ํํด๋ ๋์ง์๋ ์ถ๊ธฐ๋ ํ๋ค. ๊ทธ๋์ Controller์์ ๊ฒ์ ์์์ ๊ดํ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์์๋ค. ํ์ง๋ง ๊ณตํต์ผ๋ก ๋ณด์ฌ์ฃผ์ด์ผ ํ ๋ฉ์์ง๊ฐ ๋ง์์ง๋ฉด ์ด์ฐจํผ View ํด๋์ค๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋, ๋ฏธ๋ฆฌ ์ญํ ์ ๋ง๊ฒ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ณ๋ค๊ณ ์๊ฐํ์ฌ CommonView ํด๋์ค๋ฅผ ๋ง๋ค์๋ค. CommonView์์๋ ์ฌ์ฉ์์๊ฒ ๊ณตํต์ผ๋ก ๋ณด์ฌ ์ฃผ์ด์ผํ ๋ฉ์์ง์ ์ถ๋ ฅ์ ๋ด๋นํ๋๋ก ์ค์ ํ๋ค.
2. InputValidator ๋ถ๋ฆฌ
๊ธฐ์กด InputValidator์์ ๋ง์ ๊ธฐ๋ฅ์ ๋ด๋นํ๊ณ ์์๋ค. -> ์ซ์ 1๊ฐ์ ๋ํ ๊ฒ์ฆ, ์ซ์ 3๊ฐ์ ๋ํ ๊ฒ์ฆ, ๊ฒ์ ์ํ ์ซ์์ ๋ํ ๊ฒ์ฆ
๊ทธ๋์ ์ด InputValidator๋ฅผ 3๊ฐ์ ํด๋์ค๋ก ๋๋์ด ์ซ์ 1๊ฐ์ ๋ํ ๊ฒ์ฆ, ์ซ์ 3๊ฐ์ ๋ํ ๊ฒ์ฆ, ๊ฒ์ ์ํ ์ซ์์ ๋ํ ๊ฒ์ฆ์ ๋ถ๋ฆฌํ์๋ค.
- GuessNumberValidator(์ซ์ ํ๋๋ฅผ ๊ฒ์ฌ - 1~9์ฌ์ด์ ์ซ์์ธ์ง)
- GuessNumbersValidator(์ซ์ 3๊ฐ๋ฅผ ๊ฒ์ฌ - ์ค๋ณต, ๊ธธ์ด )
- GameStateNumberValidator(์ซ์ 1 or 2์ธ์ง ๊ฒ์ฌ)
3. ScoreCalculator๋ฅผ ๋ค์ ๋ง๋ฆ
Score์ ScoreCaluator๊ฐ ํ๋ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ๋ ๋๋ฉ์ธ ์ฝ๋๊ฐ ์์ฒญ ๊ธธ์ด์ก์๋ค. ์ด๋๋ก ๊ฐ๊น, ๋ค์ ๋ถ๋ฆฌํ ๊น ๊ณ ๋ฏผํ๋ค๊ฐ ScoreCalculator๋ฅผ util๋ก ๋ค์ ๋บด๋ด๊ณ Score ํด๋์ค์ calculate() ๋ฉ์๋๋ ScoreCalculator์ ์ ์ ๋ฉค๋ฒ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ๋ค.
10/25 - Day 7
0. ํ ์คํธ ์ฝ๋ ์์ฑ
์ค๋์ ํ ์คํธ ์ฝ๋ ์์ฑ์ ํ์ ๋ค์๋ค.
์๋๋ผ๋ฉด '1.๊ตฌํ -> 2.ํ ์คํธ' ์์๋ก ์งํํด์ผ ํ์ง๋ง, ํ ์คํธ ์ฝ๋ ์์ฑ์ ์ต์์น ์์์ ๋ชจ๋ ๊ตฌํ์ด ๋๋ ํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ์์๋ก ์งํํ๋ค. ์์์ ๋ํด์ ์์๋ณด๋ค๊ฐ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๊ณ ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๋ TDD(Test Driven Development)๋ผ๋ ๋ฐฉ๋ฒ๋ก ์ด ๋ํด์๋ ์๊ฒ ๋์๋ค.
์ฝ์ด๋ณด๋ฉด ์ข์ ๊ฐ๋ฐ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐ์ ๋์ง๋ง, ๋น์ฅ ํ๋ฆฌ์ฝ์ค์์ ์งํํ๊ธฐ์ ๊ฐ๋ฐ ๋ฐฉ์์ ์์ ๋ฐ๊พธ์ด์ผ ํ ๊ฒ ๊ฐ์ ์์ฐ์ฑ์ด ๋ง์ด ๋จ์ด์ง ๊ฒ ๊ฐ๋ค. ์ด ๋ถ๋ถ์ ํ๋ฆฌ์ฝ์ค๊ฐ ๋๋๋ฉด ํ ๋ฒ ๊ณต๋ถํด ๋ด์ผ๊ฒ ๋ค.
๊ฐ์คํ๊ณ ์ด๋ฒ ๋ฏธ์ ์์ ๋ชจ๋ ๊ตฌํ์ด ๋๋ ํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํ๋๋ฐ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ์ด ์์๋ ์ ๋ง ์ข์ง ์๋ค๊ณ ๋๊ผ๋ค. ์ฝ๋์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ฉด ์ง์ ๋ฉ์ธ์ ์คํ์์ผ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ ์ง์ ์ ์ฐพ๊ธฐ ์ผ์ค์๋๋ฐ, ๊ธฐ๋ฅ ๊ตฌํ ์ดํ ๋ฐ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ์ด๋ฐ ๋ญ๋น๋๋ ์๊ฐ๋ค์ ๋ง์ด ์ค์ผ ์ ์์ ๊ฒ ๊ฐ๋ค. 2์ฃผ์ฐจ ๋ฏธ์ ๋ถํฐ๋ ์ด ํ ์คํธ๋ฅผ ์ ํ์ฉํด์ผ๊ฒ ๋ค.
* ํ ์คํธ ์ฝ๋๋ ์ตํ๋จ ๋งํฌ ์ฐธ์กฐ
์ ๋ฐ์ ์ธ 1์ฃผ์ฐจ ํ๊ธฐ
์๋ ์๊ฐ์ด ์๊น์ธ ์ ๋๋ก ์ฆ๊ฑฐ์ ๋ ํ ์ฃผ ์์ต๋๋ค.
์๊ณ ๋ฆฌ์ฆ๋ง ๋ณด๋ฉด ์ฒซ ์ฃผ์ฐจ ๋ฏธ์ ์ ๊ธฐ๋ฅ์ ์ธ ์๊ตฌ์ฌํญ๋ค์ ์ด๋ ต์ง ์์์ต๋๋ค. ๊ทธ๋งํผ ๋ฌธ์ ๋ฅผ ์ถ์ ํ์ ๋ถ๋ค๊ป์ ์ด๋ฒ ๋ฏธ์ ์์๋ ๋ถ๋ช ‘์ข์ ์ค๊ณ’์ ๋ํด ๊ณ ๋ฏผํ๊ณ ์๊ฐํด๋ณด๋ผ๋ ์ทจ์ง๋ก ๋ฏธ์ ์ ๋ด์ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌํ์ฌ ์ ๋ ์ด๋ฒ ๋ฏธ์ ์์ ‘์ข์ ์ค๊ณ’๋ผ๋ ํ๋์ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด์, 3๊ฐ์ง์ ๋ชฉํ๋ก ์ธ๋ถํํ์ฌ ์งํํ์ต๋๋ค.
1. ๊ฐ๋ ์ฑ ์ข์ ์ฝ๋ ์์ฑํ๊ธฐ
์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ด ์ฝ๊ธฐ ํธํ๊ฒ ์์ฑํ๋๊ฒ ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ด๋ฒ ์ฃผ์ฐจ๊ฐ ๋๋๋ฉด ํผ์ด ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์งํํ ํ ๋ฐ, ์ ๊ฐ ์๋ฌด๋ฆฌ ์ค๊ณ๋ฅผ ์ํ๋ค ํ๋ค, ๊ฐ๋ ์ฑ์ด ์๋ง์ด๋ผ๋ฉด ๋๊ตฌ๋ผ๋ ์ฝ๊ธฐ ์ซ์ ๊ฒ์ด ๋ถ๋ช ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ์ฌํญ์ ์ ์ํด์ฃผ์ ์ปจ๋ฒค์ ๋ง๊ณ ๋ ์์นญํด๋ณด๋ ์๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ์ง์ผ์ผ ํ ์ปจ๋ฒค์ ๋ค์ด ๋ฌธ์ํ๋์ด ์์์ต๋๋ค. ์ด ์ค์ ์๊ณ ์๋ ๊ฒ๋ค๋ ์๊ณ , ๋ชจ๋ฅด๊ณ ์๋ ๊ฒ๋ค๋ ๋ง์์ต๋๋ค. ๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ ๋ณด์ด๋ ์ ์ฝ๋๋ค์ ์ปจ๋ฒค์ ์ ์ด๊ธฐ๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋๋ฐ, ํ์คํ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์ฝ๊ณ ์์ฑํ๊ณ ๋ฐ๋ณตํ๋ค ๋ณด๋ ์ปจ๋ฒค์ ์ ์งํค๋ ๊ฒ์ด ๊ฐ๋ ์ฑ์ ๋์ด์ฌ๋ฆฌ๋ ๋ฐ ๋ง์ ๋์์ด ๋๋ ๊ฒ์ ์ฒด๊ฐํ ์ ์์์ต๋๋ค. ์ปจ๋ฒค์ ๋ฟ๋ง ์๋๋ผ ๋ฉ์๋๋ช , ํ๋๋ช , ํด๋์ค๋ช ์ ๋ํ ๊ณ ๋ฏผ๋ ์ ๋ง ๋ง์ดํ์ต๋๋ค. ‘์ด๋ป๊ฒ ์์ฑํด์ผ ์ด๋ฆ์ ๋ณด๊ณ ์๋๋ฅผ ๋ฐ๋ก ์บ์นํ ์ ์์๊น?’์ ๋ํด ๋ง์ด ์๊ฐํ๋ฉฐ, ๋์ฑ ๊ฐ๋ ์ฑ ์ข์ ์ฝ๋๊ฐ ๋ ์ ์๋๋ก ๋ ธ๋ ฅํ ์ ์์๋ ํ ์ฃผ ์์ต๋๋ค.
2. ๊ฐ์ฒด์งํฅ ์ํ์ฒด์กฐ 9๊ฐ์ง ๊ท์น ์ค์ํ๊ธฐ
ํ๋ฆฌ์ฝ์ค๋ฅผ ์์ํ๊ธฐ ์ , ๊ฐ์ฒด์งํฅ ์ํ์ฒด์กฐ 9๊ฐ์ง ๊ท์น์ ๊ณต๋ถํ์์ต๋๋ค. ์ฒ์์๋ ์ด 9๊ฐ์ง ๊ท์น์ ๋ณด๊ณ ‘์ด ๊ท์น๋ค์ ์ด๋ป๊ฒ ์ ์ด๊ธฐ๋ฉด์ ์ฝ๋๋ฅผ ์งค ์๊ฐ ์์ง..?’๋ผ๊ณ ์๊ฐํ์์ต๋๋ค.
์ ์ด๋ฐ ๊ท์น๋ค์ ์ ํด ๋์๋ ์ง๋ ๊ตฌํ์ ํ๊ณ ๋ ํ ๊ท์น์ ์ ๊ฐํด์ ๋ฆฌํํ ๋ง์ ์งํํ ๋ ์ ํํ ์บ์นํ ์ ์์์ต๋๋ค.
ํนํ ์ผ๊ธ ์ปฌ๋ ์ ์ ์ ์ฉํ ๋ ์ ๋ง ํฌ๊ฒ ๊ฐ๋ช ๋ฐ์์ต๋๋ค. ์ ๋ ์ซ์๊ฒ์์์ ํ๋ ์ด์ด๊ฐ ์ ๋ ฅํ๋ ์ซ์๊ฒ์์ ๋ํ 3๊ฐ์ ์ซ์๋ฅผ ์ผ๊ธ ์ปฌ๋ ์ ์ผ๋ก ๊ด๋ฆฌํ๋๋ฐ, ์ด๋ ๊ฒ ์ค๊ณํ๋ “1๊ฐ์ ์ซ์”์ ๋ํ ๊ฒ์ฆ์ ๋จ์ผ ํด๋์ค์์ ๊ฒ์ฆํ๊ณ , “3๊ฐ์ ์ซ์”์ ๋ํ ๊ฒ์ฆ์ ์ผ๊ธ ์ปฌ๋ ์ ์์ ํ๋ ๊ธฐ๋ฅ๋ ๋ถ๋ฆฌ๋๊ณ , ์ญํ ๊ณผ ์ฑ ์์ด ๊น๋ํ๊ฒ ๋๋์ด์ก๋ค๋ ๊ฒ์ ํฌ๊ฒ ์ฒด๊ฐํ์ต๋๋ค.
์ด๋ฐ ๊ท์น๋ค์ด ์ด๋์ ๋ ์ฒดํ๋๊ณ ์ข์ ์ค๊ณ์ ๋ํด ๊ณ ๋ฏผํ ์์ ์๋ ์ด ๊ท์น๋ค์ ์ ์ฉํ๋ ์ข์ ์ค๊ณ๊ฐ ๋์๋ค๋ ๋๋๋ณด๋ค, “๊ฐ์ฒด์งํฅ์ ์ธ ์ค๊ณ๋ฅผ ์งํฅํ๋ ์ด๋ฐ ๊ท์น๋ค์ด ์๋์ ์ผ๋ก ๋ฐ๋ผ์จ๋ค” ๋๋์ ํฌ๊ฒ ๋ฐ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ด๋ฒ ํ์ฃผ๊ฐ '์ด๋ฐ ์ฝ๋ ๊ฐ์ฒด์งํฅ์ ์ธ ์ค๊ณ๊ตฌ๋, ์ด๋ ๊ฒ ์์ฑํ๋ฉด ์ข์ ์ฝ๋๊ฐ ๋ ์ ์๊ฒ ๋ค.’๊ณ ๋ง์ด ๋๊ผ๋ ๊ฒ ๊ฐ์ต๋๋ค.
3. MVC ํจํด ์ ๋ฆฝํ๊ธฐ
์ฒ์์๋ ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ๋ค์ ์์ฑํ๊ณ ์ปดํจํฐ์ ํ๋ ์ด์ด ๋ ๊ฐ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ด ํด๋์ค๋ฅผ ์๋ก ์์กด์ํจ ํ, ์ปดํจํฐ์ ํ๋ ์ด์ด๊ฐ ์๋ก ๋ฌธ๋ตํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๊ฐํ์ต๋๋ค. ์ด๋ฌ๋ฉด ํ ํด๋์ค์ ์ฝ๋๊ฐ ์์ฒญ ๊ธธ์ด์ง๊ณ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ค๊ณ์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ง๊ธฐ๋ํด์ ์ฒ์์ ์ด๋ป๊ฒ ๊ตฌํํ ์ง ํ ๋ธ๋ฆฟ์๋ ๊ทธ๋ ค๋ณด๋ฉด์ ๊ณ ๋ฏผํ๋ ์๊ฐ์ด ์ ๋ง ๊ธธ์์ต๋๋ค.
๊ฐ์ข ์ํ์ฐฉ์ค๋ฅผ ๊ฒช๋ค๊ฐ Spring์ ๊ณต๋ถํ๋ฉด์ ์๊ฒ ๋ MVC ํจํด์ ์ ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ผ๋ก MVC ํจํด์ ์ฑํํด์ ๋ฏธ์ ์ ์งํํ์ต๋๋ค. ์ฒ์์๋ ๋จ์ํ๊ฒ ์ด ํจํด์ ์ ์ฉํ๊ธฐ๋ง ํ๋ฉด ๊ฐ์ฒด ์งํฅ์ ์ธ ์ค๊ณ๋ฅผ ๊ฐ์ ธ๊ฐ๊ณผ ๋์์ ๋ฏธ์ ์ ํด๋ฆฌ์ด ํ ์ ์์ ๊ฒ ๊ฐ์๋๋ฐ, ํ์ค์ ์ ํ ๊ทธ๋ ์ง ์์์ต๋๋ค. MVC ํจํด์ ์ ์๊ณ ์๋ค๊ณ ์๊ฐํด ํจํด์ ๋ง์ถฐ์ ๊ตฌํํ๊ณ ๋ณด๋, ์ฝ๋์ ์ข์ ์ค๊ณ๋ผ ํ๊ธฐ์๋ ์กฐ๊ธ์ฉ ๋ถํธํ ๋ถ๋ถ๋ค์ด ์๊ธฐ๋ ํ๊ณ , ๋์น๊ณ ์๋ ๋ถ๋ถ๋ค์ด ๋ง์์ต๋๋ค. ์์ผ๋ก์ ๋ฏธ์ ๋ค๋ ์ด MVC ํจํด์ ์ ๊ฐํ๋ฉด ๋ง์ ๋์์ด ๋ ๊ฑฐ๋ผ ์๊ฐํด ์ด๋ฒ์ ๊ธฐํ ์ผ์ ํ์คํ๊ฒ ๋ค์ ํ๋ฒ MVC ํจํด์ ๊ณต๋ถํ ์ ์์์ต๋๋ค.
ํจํด์ ๋ค์ ํ๋ฒ ๊ณต๋ถํ๊ณ ์ฝ๋๋ฅผ ๋ณด๋ ๋ฆฌํํ ๋งํ ๋ถ๋ถ๋ค์ด ๋ณด์ด๊ธฐ ์์ํ์ต๋๋ค. ์ฌ์ค ๊ตฌํ๋ง ๋ณด๋ฉด ์ ๋ง ๋นจ๋ฆฌ ๋๋ฌ๋๋ฐ, ๋ฆฌํํ ๋งํ๋ ๊ณผ์ ์ด ์ ๋ง ๊ธธ์์ต๋๋ค. ์ถ๊ฐ๋ก MVC ํจํด ๋ด์์๋ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์ด ๋๋๊ณ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ ์ข์ ๊ตฌ์กฐ๊ฐ ์๊ฐ๋๊ณ , ์ข์ ๊ตฌ์กฐ๊ฐ ์๊ฐ๋๋ฉด ๊ณผ๊ฐํ๊ฒ ๊ตฌ์กฐ๋ฅผ ๋ฏ์ด ๊ณ ์น๋ฉด์ ์ข์ ์ฝ๋๋ฅผ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ์ด ๋์ ์๊ฐํ๊ณ ๊ณ ์ณ๋ณด๊ณ , ์๊ฐํ๊ณ ๊ณ ์ณ๋ณด๊ณ ํ๋ ๊ณผ์ ์์๋ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฌ๊ณ ๋ ฅ์ ๋ง์ด ๋์ด ์ฌ๋ฆด ์ ์์๋ ํ ์ฃผ์์ต๋๋ค.
+ ์ฒ์์๋ ๋ฆฌํํ ๋งํ ๊ฒ๋ค์ ํ๋ํ๋ ๋ชจ๋ ์ธ๋ถ์ ์ผ๋ก ๊ธฐ๋กํ๋ ค ํ๋๋ฐ, ์๊ฐ๋ณด๋ค ๊ธ์ด ๊ธธ์ด์ง๊ธฐ๋ ํ๊ณ ์ฒ์๋ถํฐ ์ฝ์ด๋ณด๋ ์ ์ฒด์ ์ผ๋ก ๋์๊ฐ ์๋ ๋๋์ด ๊ฐํด 2์ฃผ์ฐจ๋ถํฐ๋ ํ๊ณ ๋ ํ๊ณ ์ง๋ง ๋ฏธ์ ์ ์จ์ ํ ๋์ฑ ์ง์คํ๋ฉฐ ํ๊ณ ๋ก์ ๊ตต์ง๊ตต์งํ ๋ฆฌํํ ๋ง์ด๋ ์ฌ๊ณ ๊ณผ์ ์์ ๊นจ๋ฌ์ ๊ฒ๋ค ์์ฃผ๋ก ์์ฑํ ์์ ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ฏธ์
์ ๊ดํ ์ ์ฝ๋๋ ์๋ ๋งํฌ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
<์ด๋ฒ ๋ฏธ์
์ ์ฐธ์ฌํ๋ฉด์ ๋์์ด ๋์๋ ์ฐธ๊ณ ์๋ฃ>
https://www.youtube.com/watch?v=ogaXW6KPc8I
'๐ Etc > Rev' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422