ํ๋ฆฌ์ฝ์ค 2์ฃผ์ฐจ๊ฐ ๋๋ฌ์ต๋๋ค.๐ข ์ ๋ฒ ์ฃผ์ฐจ ๊ณผ์ ์์ ์์ฌ์ด ์ ์ด ๋ง์์๋๋ฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ณ ์ข ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๊ณ ๋
ธ๋ ฅํ์์ต๋๋ค. ๋ถ๋ช
์ ๋ฒ ์ฃผ๋ณด๋ค ๋ง์ ๋ถ๋ถ์ด ๊ฐ์ ๋์๋ค๊ณ ์๊ฐํ์ต๋๋ค!! ์ฝ๋๋ฆฌ๋ทฐ์ ์คํฐ๋๋ฅผ ํ๊ธฐ ์ ๊น์ง....
์ด๋ค ๊ณผ์ ์ ํตํด 2์ฃผ์ฐจ ๊ณผ์ ๋ฅผ ๊ทน๋ณตํ๋ ค ํ๋์ง ํ๊ณ ๋ฅผ ํตํด ๋์ง์ด ๋ณด๋ ค๊ณ ํฉ๋๋ค.๐
https://github.com/woowacourse-precourse/java-racingcar-7/pull/873
2์ฃผ์ฐจ ๊ณผ์ ์์๋ ์ค์ ์ ์ผ๋ก ์ ๋ฒ ์ฃผ์ฐจ ๊ณผ์ ์์ ์์ฌ์ด ์ ๋ค์ ๊ฐ์ ํ๋ ๊ฒ์ด ๋ชฉํ์์ต๋๋ค!
๋ชฉํ ๋ฌ์ฑ์ ์ํด ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ํ ๋จ๊ณ ํ ๋จ๊ณ์ฉ ์ ์คํ ๊ฐ์ ์ ์ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๋์ฑ ์ค๋ ๊ฑธ๋ ธ๋ ๊ฒ ๊ฐ์ต๋๋ค.๐ข
๋ชฉํ๋ฅผ ์ ์ด๋ค๋์ง? ๋ฐ์ ๊ธ์ ํตํด ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
<์ต์ข
ํ๋ก์ ํธ ๊ตฌ์กฐ>
๊ณผ์ ๋ฅผ ์์ํ๊ธฐ์ ์์ ํ๋ก์ ํธ์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ๊ตฌ์ฑํ์๊ณ ์ด๋ฅผ ํ ๋๋ก ์งํํ์ต๋๋ค๐
src
โโโ main
โโโ java
โ โโโ racingcar
โ โโโ config
โ โ โโโ AppConfig.java
โ โโโ controller
โ โ โโโ RacingGameController.java
โ โโโ domain
โ โ โโโ car
โ โ โ โโโ Car.java
โ โโโ exception
โ โ โโโ ErrorMessage.java
โ โโโ service
โ โ โโโ CarSetupService.java
โ โ โโโ CarSetup.java
โ โ โโโ RacingGameService.java
โ โ โโโ RacingGame.java
โ โโโ validator
โ โ โโโ InputValidator.java
โ โโโ view
โ โโโ InputView.java
โ โโโ OutputView.java
test
โโโ java
โโโ racingcar
โโโ validator
โ โโโ CarNameValidatorTest.java
โ โโโ AttemptCountValidatorTest.java
โโโ service
โ โโโ CarSetupServiceTest.java
โ โโโ RacingGameServiceTest.java
โโโ ApplicationTest
๊ฐ์ฒด ์งํฅ์์น์ ์งํค๊ณ ์ ๋
ธ๋ ฅํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.
์ ๋ฒ ์ฃผ์ฐจ ๊ณผ์ ์์๋ ๊ฐ์ฒด๋ฅผ ์ด๋์ ์์ฑํ๊ณ ์ฃผ์
ํ๋์ง, ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๋ฐฉ๋ฒ๋ฑ ๊ณ ๋ฏผ์ด ๋ง์์ต๋๋ค. ๊ฒฐ๊ตญ ์ปจํธ๋กค๋ฌ์์ ๋ง์ ๊ฐ์ฒด ์์ฑ์ ํ์์๋๋ฐ์, ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ด๋ฒ์๋ ๊ฐ์ฒด์ ์์ฑ์ ํ๋์ ํด๋์ค๋ฅผ ์์ฑ
ํ์ฌ ์๋์ ์ผ๋ก ์ ๋ด์์ผ๋ณด์์ต๋๋ค.
<Appconfig.java>
์ด๋ ๊ฒ ๊ฐ์ฒด์ ์์ฑ์ ๋ถ๋ฆฌํ๋ ๊ด๋ฆฌํ๊ธฐ๋ ํธํ๊ณ ์ปจํธ๋กค๋ฌ๋ ๋ฉ์ธ์์ ๋ง์ ์ญํ ์ ์ฃผ์ง ์์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ท๋ค๊ณ ์ ๋ ์๊ฐํ์ต๋๋ค!๐
Service๋จ์ ๋น์ฆ๋์ค ํด๋์ค๋ค์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ์์ต๋๋ค! ์ ๊ฐ ์ด๋ฒ ๊ณผ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ์ด ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ช
ํํ ์ค๊ณ ๊ตฌ์กฐ
๋ฅผ ๋ณด์ฌ์ฃผ๋๋ฐ ์ด์ ์ ๋์์ต๋๋ค.
์ด๋ฅผ ํตํ์ฌ ๊ตฌํ๋ฐ์ ํด๋์ค๋ค์ด ๋ฌด์จ ์ญํ์ธ์ง ์ง๊ด์ ์ผ๋ก ๋ณด์ผ ๊ฒ ๊ฐ์์ต๋๋ค.
์ ๋ ์ด์ ๊น์ง ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ด ํ์ํ ํด๋์ค๋ค์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ์ฌํ์ฌ ๋คํ์ฑ
์ ์ถ๊ตฌํ์์ต๋๋ค. ํ์ง๋ง ์คํฐ๋๋ฅผ ํตํด ์ธํฐํ์ด์ค์ ๋ํด ๋ง์ ์๊ฒฌ์ ๋๋์๊ณ , ๊ทธ ์ค ๊ธฐ์ต์ ๋จ์ ๋ง์ด ์์์ต๋๋ค.
ํ๋์ ํด๋์ค์๋ง ์ฌ์ฉํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๊ฒ ์ข์ ๋ฐฉ๋ฒ์ธ๊ฐ?
์ด์ ๊น์ง ์์ฐ์ค๋ฝ๊ฒ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์จ ์ ๋ก์๋ ์๊ฐ์ง ๋ชปํ ๋ง์ด์๊ณ , ๊ทธ ์ง๋ฌธ์ ๋ํด ๊ณ ๋ฏผํ์ต๋๋ค. ์ธํฐํ์ด์ค์ ์ฅ์ ๋ค์ ๋์ดํ์๋ฉด ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋ํด ๋ช ํํ ๋ต์ด ๋์ค์ง๋ง ์๊ธฐ ์์ ์๊ฒ "์ด๋ค ์๋๋ฅผ ๊ฐ์ง๊ณ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์๋?" ๋ผ๋ ์ง๋ฌธ์ ๋์ง ์ ์์๊ณ ์ธํฐํ์ด์ค์ ๋ํ ๊ณต๋ถ์ ์ค์ค๋ก์ ๋ฐ์ฑ์ ํ๊ณ ์์ต๋๋ค.๐ค
๋๋ฌด๋๋ ํฐ ์ค์๋ฅผ ํ์๊ธฐ์ ๊ฐ์ ์ ์ ํฌ๊ฒ!!!!!! ํ์ํ์์ต๋๋ค.
์ค์ค๋ก๋ ๋ง์ด ๋ฐ์ฑํ๊ณ ์๊ณ ๊ธด ์๊ฐ ๋ง์ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์ ๊ฑฐ์ณค๋๋ฐ๋ ์๊ฐํ์ง ๋ชปํ๋ค๋, ๋ฐ์ฑ !! ๋ ๋ฐ์ฑ์
๋๋ค!!
<RacingGameService.java>
private final OutputView outputView;
public RacingGameService(OutputView outputView) {
this.outputView = outputView;
}
@Override
public void raceGame(List<Car> cars, int count) {
for (int i = 0; i < count; i++) {
playRound(cars);
outputView.displayCarPositions(cars);
}
}
์ ์ ์ค๋ํ ์ค์๊ฐ ๋ฌด์์ธ์ง ๋ณด์ด์ค๊น์?? ๋ง์ ๋ถ๋ค์ด ๋ด๋ฒ๋ฆฐ ์ ์ ์ค์๋
service
๋จ์์view
๋ฅผ์์กด์ฑ ์ฃผ์
๋ฐ์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
๐ฑ๐ฑ ์์ฐจ์ฐจ! Controller ๋จ์์ Service์ View๋ฅผ ๊น๋ํ๊ฒ ์ฐ๊ฒฐํ๋ ค ํ๊ฑด๋ง, ์ด๋ ์๊ฐ Service์์ ๋ฐ๋ก View๋ก ๊ฒฐ๊ณผ๋ฅผ ๋๊ฒจ ์ฒ๋ฆฌํด๋ฒ๋ฆฐ ๊ฒ์ ๋ค๋ฆ๊ฒ์ผ ์์์ฐจ๋ฆฌ๋ค๋์โฆ! TDD ๋ฐฉ์์ผ๋ก ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ ์คํธํ๊ณ ๊ธฐ๋ฅ์ ์์ฑํ๋ ๊ณผ์ ์์ ์ผ์ด๋ ์ค์๋ผ๊ณ ๋ ํด๋, ์ฌ๋ฌ ์ฐจ๋ก ๋ฆฌํฉํ ๋ง์ ๊ฑฐ์น๋ ๋์์๋ ๋์น์ฑ์ง ๋ชปํ ์ฌ์ค์ ๋ถ๋๋ฌ์ ์จ๊ณ ์ถ์ ์ง๊ฒฝ์ ๋๋ค. ๐ญ
๐ก ์ด๋ฒ ์ค์๋ฅผ ํตํด ๋ฐฐ์ด ๊ตํ ๐ก
์ญํ ์ ์ค์์ฑ
์ด๋ฒ ๊ฒฝํ์ ๋ ์ด์ด ๊ฐ ์ญํ ๋ถ๋ฆฌ์ ์ค์์ฑ์ ๋ค์๊ธ ์ผ๊นจ์์ฃผ์์ต๋๋ค. Service์์ View๋ก ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ ์ถ๋ ฅํ ๊ฒฝ์ฐ, Controller๊ฐ ๊ด๋ฆฌํด์ผ ํ ํ๋ฆ ์ ์ด๊ฐ ๋ถ์ฐ๋๋ฉฐ ์ฝ๋์ ๊ฒฐํฉ๋๊ฐ ๋์์ง ์ํ์ด ์์ต๋๋ค. ์ด๋ก ์ธํด ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์์์ ์ด๋ฒ ์ค์๋ฅผ ํตํด ๊น์ด ๊นจ๋ซ๊ฒ ๋์๊ณ , ์์ผ๋ก๋ ๊ฐ ๋ ์ด์ด์ ์ฑ
์๊ณผ ์ญํ ์ ๋์ฑ ์ ์คํ๊ฒ ๊ณ ๋ คํ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ค ํฉ๋๋ค.
ํ
์คํธ์ ์ฝ๋ ํ๋ฆ ์ ๊ฒ์ ์ค์์ฑ
๋ฆฌํฉํ ๋ง์ ์ฌ๋ฌ ์ฐจ๋ก ๊ฑฐ์น๋ค ๋ณด๋ฉด ์์ ์ค์๊ฐ ๋ฐ์ํ ์ ์๊ธฐ์, ํ
์คํธ์ ํจ๊ป ์ฝ๋ ํ๋ฆ์ ์ ๊ธฐ์ ์ผ๋ก ์ ๊ฒํ๋ ์ต๊ด์ ๋ค์ด๋ ๊ฒ์ด ์ค์ํ๋ค๋ ์ ์ ๋ฐฐ์ ์ต๋๋ค. TDD๋ก ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ
์คํธํ๋ฉฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค ๋ณด๋ ์ค์ํ๊ธฐ ์ฌ์ด ๋ถ๋ถ์ด ์์์ง๋ง, ์ด๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด ๊ฐ ๋ ์ด์ด ๊ฐ ์๋๋ ํ๋ฆ์ ํ
์คํธํ๋ ๊ฒ๋ ํ์ํจ์ ๋๊ผ์ต๋๋ค.
์ฑ์ฅ๊ณผ ๊ตํ์ ๊ธฐํ๋ก ์ผ๊ธฐ
์ค์๋ ์ฑ์ฅ์ ๋ฐํ์ด ๋ฉ๋๋ค. ์ด๋ฒ ๊ฒฝํ์ ํตํด ์ค์์ ๊ณผ์ ์ ๋์ง๊ณ ๊ฐ์ ํด๋๊ฐ์ผ๋ก์จ ๋ ํํํ๊ณ ์ ์ง ๋ณด์ํ๊ธฐ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๊ณ๊ธฐ๋ก ์ผ์ผ๋ ค ํฉ๋๋ค. ์์ผ๋ก๋ ๋ฆฌํฉํ ๋ง ์์ ์ฝ๋์ ํ๋ฆ๊ณผ ์ญํ ์ ์ฌ์ ๊ฒํ๋ ์ต๊ด์ ๋ค์ฌ, ๋ณด๋ค ์ฃผ์ ๊น๊ณ ์ฑ
์ ์๋ ์ฝ๋ ์์ฑ์ ๋ชฉํ๋ก ๋์๊ฐ๊ฒ ์ต๋๋ค!
test
โโโ java
โโโ racingcar
โโโ validator
โ โโโ CarNameValidatorTest.java
โ โโโ AttemptCountValidatorTest.java
โโโ service
โ โโโ CarSetupServiceTest.java
โ โโโ RacingGameServiceTest.java
โโโ ApplicationTest
์ง๋์ฃผ ๊ณผ์ ์์๋ TDD(Test-Driven Development)
๋ฐฉ์์ผ๋ก ๊ฐ๋ฐํ๋ ๋ฐ ๋ฏธ์ํจ์ด ์์๋ ์ ์ ๋ฐ๊ฒฌํ์ง๋ง, ์ด๋ฒ ์ฃผ์ฐจ ๊ณผ์ ๋ฅผ ํตํด ์ด๋ฅผ ๊ฐ์ ํ๊ณ ์ ๋ง์ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์์ต๋๋ค. ํนํ, ์ฝ๋ ์์ฑ์ ์ด๊ธฐ ๋จ๊ณ๋ถํฐ ํ
์คํธ๋ฅผ ์ฃผ๋์ ์ผ๋ก ์์ฑํ์ฌ ์ฝ๋์ ํ์ง์ ๋์ด๊ณ , ์ ๋ขฐํ ์ ์๋ ํ
์คํธ ์ผ์ด์ค
๋ง๋๋ ๋ฐ ์ง์คํ์ต๋๋ค. ๊ฐ์ ๋ ๋ถ๋ถ์ ์ค์ ์ผ๋ก ์๋์ ๊ฐ์ ์ฑ๊ณผ๋ฅผ ์ด๋ฃจ์์ต๋๋ค.
1. ๐๋จ์ผ ๊ธฐ๋ฅ ํ
์คํธ ์ฝ๋ ์์ฑ ํ ๊ธฐ๋ฅ ๊ตฌํ
TDD ๋ฐฉ์์ ์ฒ ์ ํ ๋ฐ๋ฅด๋ฉฐ, ๊ธฐ๋ฅ ์์ฑ์ ์์ ๋จ์ผ ๊ธฐ๋ฅ ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ ๋์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์ณค์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ์์ฑ์ ๋ค์ ์๊ฐ์ด ๊ฑธ๋ ธ์ง๋ง, ํํํ ๊ธฐ๋ฐ์ ๊ฐ์ถ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์์ต๋๋ค. ํ
์คํธ ์ฝ๋๊ฐ ์ ํ๋๋ค ๋ณด๋ ์ฝ๋์ ์ ํ์ฑ๊ณผ ์ ๋ขฐ๋๊ฐ ๋์์ก๊ณ , ์์์น ๋ชปํ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์์์ต๋๋ค. TDD์ ์ฅ์ ์ธ ๋ฒ๊ทธ ๋ฐฉ์ง์ ๊ฒฌ๊ณ ํ ์ฝ๋ ์์ฑ
์ ์๋ฏธ๋ฅผ ์ค๊ฐํ ์ ์๋ ์ข์ ๊ฒฝํ์ด์์ต๋๋ค.
2. ๐JUnit์ ๋ค์ํ ๊ธฐ๋ฅ ํ์ฉ
JUnit์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ ๊ฒ๋ ์ด๋ฒ ํ๋ก์ ํธ์ ์ฑ๊ณผ์
๋๋ค. ํนํ @ParameterizedTest
์ด๋
ธํ
์ด์
์ ํตํด ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ํ
์คํธ ๋ฉ์๋์ ์ ๋ฌํ๋ฉฐ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์์ต๋๋ค. ๋ํ @MethodSource
๋ฅผ ์ฌ์ฉํ์ฌ ๊ณตํต ๋ฉ์๋๋ฅผ ํ๋๋ก ์ ๋ฆฌํจ์ผ๋ก์จ ํ
์คํธ ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ๊ด๋ฆฌํ ์ ์์์ต๋๋ค. ์ด๋ฌํ JUnit์ ๊ธฐ๋ฅ๋ค์ ์ ๋๋ก ํ์ฉํ๋ฉฐ ํ
์คํธ ์ฝ๋๊ฐ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ๊ฐ๋
์ฑ ์๊ฒ ์์ฑ๋๋ ์ฑ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
3. ๐๋ค์ํ ์์ธ ์ํฉ์ ๊ณ ๋ คํ ํ
์คํธ ์ฝ๋ ์์ฑ
์ด๋ฒ ํ๋ก์ ํธ์์๋ ๋จ์ํ ์ ์์ ์ธ ์ ๋ ฅ๋ง์ ํ ์คํธํ๋ ๋ฐ ๊ทธ์น์ง ์๊ณ , ๋ค์ํ ์์ธ ์ํฉ์ ๋๋นํ ํ ์คํธ ์ฝ๋๋ ์ถ๊ฐ์ ์ผ๋ก ์์ฑํ์ต๋๋ค. ๋๋ถ์ ํ๋ก๊ทธ๋จ์ ์์ธ ์ฒ๋ฆฌ๊ฐ ๋ณด๋ค ์์ฑ๋ ๋๊ฒ ๊ตฌํ๋ ์ ์์๊ณ , ์ฌ์ฉ์ ์ ๋ ฅ ์ค์๋ ์๊ธฐ์น ์์ ์ํฉ์์๋ ์์ ์ ์ผ๋ก ๋์ํ ์ ์๋๋ก ๊ฐ์ ํ ์ ์์์ต๋๋ค. ์ด๋ก์จ ์์ธ ์ํฉ์ ํฌํจํ ๋ค์ํ ์๋๋ฆฌ์ค์ ๋๋นํ ์ฝ๋ ์์ฑ์ ์ค์์ฑ์ ๊นจ๋ฌ์ ์ ์์์ต๋๋ค.
๋๋ค ์ถ๋ ฅ์ ๋ํด ๋ง์ ๊ณ ๋ฏผ์ ํ๊ณ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. ํ์ง๋ง ์ฐํ
์ฝ์์ ์ ๊ณตํ ํ
์คํธ์ ํด๋น ๊ธฐ๋ฅ์ด ์์์ต๋๋ค. ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ mock๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ํ
์คํธ๋ฅผ ์งํํ๋ ๋ฐฉ์์ด์๊ณ , ์์ง mock์ ๋ํด ์ดํด๊ฐ ๋ถ์กฑํ ์ ๋ก์๋ ์ฐ์ง ๋ชปํ๊ฒ ์์ฌ์ ์ต๋๋ค.
3์ฃผ์ฐจ ๊ณผ์ ์์๋ ์ฐํ
์ฝ์์ ์ ๊ณตํ ํ
์คํธ๊ธฐ๋ฅ์ ์ ๊ทน ํ์ฉํด ๋ณด๋๋กํ๊ฒ ์ต๋๋ค.
๋ฌธ์ํ
ํ๊ฒ์ด๋ฒ ๊ณผ์ ๋ฅผ ํตํด ์ค์ค๋ก์๊ฒ "์ ๋ ์ ๋ฒ ์ฃผ๋ณด๋ค ์ฑ์ฅํ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋์์๊น?"๋ผ๋ ์ง๋ฌธ์ ๋์ก์ ๋, ์ ๋ ์์ ์๊ฒ "์"๋ผ๊ณ ๋ตํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ ๋ถ๋ถ์์ ๊ฐ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ , ๊ทธ ๋ ธ๋ ฅ์ ๊ฒฐ๊ณผ๋ก ๊ธ์ ์ ์ธ ๋ณํ๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฑ๊ณตํ์ต๋๋ค. ๊ทธ๋ฌ๋ 2์ฃผ์ฐจ ๊ณผ์ ๋ ์ค์์ ์์ฌ์ด ์ ์ด ๋ง์๋ ์ ๋ ์ฌ์ค์ ๋๋ค.
ํนํ 2์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค ์คํ๋ผ์ธ ์คํฐ๋์์๋ ๊ต์ฅํ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ๋ค์ ๋ํด ๋ง์ ์ด์ผ๊ธฐ๋ฅผ ๋๋ ์ ์์์ต๋๋ค. ๋ค์ํ ๊ด์ ์์ ์๊ฒฌ์ ๋๋๊ณ , ์๋ก์ ๊ฒฝํ์ ๊ณต์ ํ๋ ๊ณผ์ ์ด ์ ์๊ฒ ํฐ ์๊ทน์ด ๋์๊ณ , ์ด๋ ์ ๊ฐ๋ฐ ์ญ๋์ ํ์ธต ๋ ํฅ์์ํค๋ ๋ฐ ๊ธฐ์ฌํ์ต๋๋ค.
๐ป1. private ์ ๋ฒ์ : private ๋ฉ์๋์ ๋ํ ํ
์คํธ๋ ์ด๋ป๊ฒ ํด์ผํ๋?
ํด๋์ค์์ ๋ด๋ถ์ ์ผ๋ก๋ง ์ฌ์ฉํ๋ ๋ฉ์๋๋ค์ ๋ํด์ private
์ผ๋ก ์ ๊ทผ์ง์ ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ๋์ค์ ์ผ ๊ฒ์
๋๋ค. ๊ทธ๋ ๋ค๋ฉด TDD๋ฐฉ์
์ผ๋ก ๊ฐ๋ฐ์ ์งํํ๋ค๋ฉด ํด๋น ๋ฉ์๋๋ค์ ๋ํ ํ
์คํธ๋ค๋ ์งํํด์ผํ๋? ๋ผ๋ ์๋ฌธ์ด ๋ค์์ต๋๋ค.
์๋ฌธ์ ํด์ํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ธ๋ค์ ์ฐพ์๋ณด์๊ณ ๊ฒฐ๋ก ์ ์ผ๋ก ๋งํ์๋ฉด TDD๋ ์ ์ฐํ๊ฒ ์งํ
ํด์ผ ํ๋ค๋ ๊ฒ์ด ์ ์ ์๊ฐ์
๋๋ค. private ๋ฉ์๋๋ค์ ์ฐ๋ public ๋ฉ์๋๋ฅผ ํ
์คํธ ํ๋ฉด ์์ฐ์ค๋ ํ์ ๋ฉ์๋๋ค๋ ํ
์คํธ ๋๋ ๊ฒ์ด ์๋๊ฐ?๋ผ๊ณ ์๊ฐํ๊ณ ์ด๋ฅผ ์ ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
๐ป2. ์ธํฐํ์ด์ค์ ์ญํ : input,output๋ ์ธํฐํ์ด์ค๋ก ํ๋ฉด ์ฅ์
์ ๋ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ ์๊ฐ์ ํ์ง๋ชปํ์ต๋๋ค. ํ์ง๋ง ์คํฐ๋์ ํ๋ถ์ด ์ ์ฉํ์ ๊ฑธ ๋ณด์๋๋ฐ์, ์ฒ์์๋ ์ด๋ ๊ฒ๊น์ง ํด์ผํ๋? ๋ผ๋ ์๊ฐ์ด ๋ค์์ง๋ง ์๊ฐํด๋ณด๋ ๊ทธ์ ๋ฐ๋ฅธ ํธ๋ฆฌํจ๊ณผ ์ ์ฉ์ฑ์ด ๋งค์ฐ ์ปธ์ต๋๋ค! ์๋ฅผ ๋ค์ด๋ณด๋ฉด
์
๋ ฅ์ ๋ฐ๋ ๊ธฐ๋ฅ์ ๋ช
์ํ Input์ธํฐํ์ด์ค๊ฐ ์๊ณ ์ด๋ฅผ ๊ตฌํํ ๋๊ฐ์ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
<Input ์ธํฐํ์ด์ค>
public interface Input {
String read(); // ์
๋ ฅ์ ์ฝ๋ ๋ฉ์๋
}
<ํ์ผ์ ๋ ฅ ํด๋์ค์, ์ฝ์์ ๋ ฅ ํด๋์ค>
//ํ์ผ ์
๋ ฅ ํด๋์ค
public class FileInput implements Input {
@Override
public String read() {
}
// ์ฝ์ ์
๋ ฅ ํด๋์ค
public class ConsoleInput implements Input {
@Override
public String read() {
}
}
<main.java>
public class Main {
public static void main(String[] args) {
// Input ์๋ฃํ์ผ๋ก ConsoleInput ๊ฐ์ฒด ์์ฑ
Input consoleInput = new ConsoleInput();
String userInput = consoleInput.read(); // ์ฝ์๋ก๋ถํฐ ์
๋ ฅ ๋ฐ๊ธฐ
System.out.println("User Input: " + userInput);
// Input ์๋ฃํ์ผ๋ก FileInput ๊ฐ์ฒด ์์ฑ
Input fileInput = new FileInput("input.txt");
String fileData = fileInput.read(); // ํ์ผ๋ก๋ถํฐ ์
๋ ฅ ๋ฐ๊ธฐ
System.out.println("File Input: " + fileData);
}
๊ทธ๋ ๋ค๋ฉด main์์๋ ํ์์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ํด๋์ค๋ค์ ๊ต์ฒดํ๋ฉด์ ์งํํ ์ ์์ต๋๋ค.
์ด์ ๋ฐ๋ฅธ ์ฅ์ ์ผ๋ก๋
๐ป3. MVC๋ฅผ ๋ฐ๋์ ์ ์ฉํด์ผ ํ๋๊ฐ? main์์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ๋คํ๋ฉด ์๋๋?
์ ๋ ๊ทธ๋์ MVC ํจํด์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐํด์๊ณ , ์ด ๋ฐฉ์์ด ์ ๊ฐ๋ฐ ์ต๊ด์ผ๋ก ์๋ฆฌ์ก์์ต๋๋ค. ํ์ง๋ง ์ต๊ทผ ์ฐํ ์ฝ ํ๋ฆฌ์ฝ์ค ์์์์, ๊ฐ์ฌ๊ป์ main ๋ฉ์๋ ์์์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ์์ฐํ์ ๊ฒ์ ๋ณด๋ฉด์ ๋ง์ ๊ณ ๋ฏผ์ ํ๊ฒ ๋์์ต๋๋ค. MVC ํจํด์ ๊ณ ์ํ๋ฉฐ ๊ณผ์ ๋ฅผ ์งํํด์จ ์ ์๊ฒ, ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ด ๊ณผ์ฐ ์ณ์ ๊ฒ์ธ์ง์ ๋ํ ์๋ฌธ์ด ๋ค์์ต๋๋ค.
๊ฐ์ฌ๋์ด ๋ณด์ฌ์ฃผ์ ๋ฐฉ์์ ์ฐธ์ฌ์๋ค์ด ๊ฐ๋ฐ์ ํน์ ํ์ ๊ฐ๋์ง ์๊ณ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋์ ํด๋ณด๋ผ๋ ์๋๋ก ์งํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ค์ ๋ก main ๋ฉ์๋ ์์์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ์ํํด๋ ํ
์คํธ๋ ํต๊ณผํ ์ ์๊ฒ ์ง๋ง, ์ฌ๋ฌ ๊ฐ์ง ๊ณ ๋ฏผ ๋์ ๋ด๋ฆฐ ๊ฒฐ๋ก ์ ์ ๊ธฐ์กด ๋ฐฉ์์ ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ์
๋๋ค. ๊ฐ๋ฐ์ ์ ๋ต์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ฐ ๊ฒฝํํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด, MVC ํจํด์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ฉฐ, ์ฑ
์์ ๋ถ์ฐ์ํค๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ ๋ ์ง๊ธ๊น์ง ๊ณต๋ถํด์จ MVC ํจํด์ด ์ ์๊ฒ ์ต์ ์ ํด๊ฒฐ์ฑ
์ด ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
๐ป4. static ์ ํ์์ฑ์?
์ ๋ static ์ ์ต๋ํ ์ง์ํ๋ผ๊ณ ๋ฐฐ์ ๊ณ ๊ทธ๋ ๊ฒ ์จ์์ต๋๋คโ ํ์ง๋ง ์ ํํ ์ธ์ static์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ง ๊ณ ๋ฏผ์ด ๋ง์์๋๋ฐ์, ์ด๋ฒ ๊ธฐํ์ ๊ณต๋ถ๋ฅผ ํ์ฌ ์ถํ์ ํ์ ํ๋ก์ ํธ ์งํ์ util ๊ณผ ๊ฐ์ด ๊ณตํต์ ์ผ๋ก ์ฐ๊ธฐ ํธํ ํด๋์ค์ ์ ์ฉํด๋ณด๋ ค๊ณ ํฉ๋๋ค!.
์์ผ๋ก ๋จ์ 2์ฃผ ๋์ ์ด๋ป๊ฒ ๋ฐ์ ํ ์ ์์์ง์ ๋ํ ๊ฑฑ์ ๊ณผ ๊ธฐ๋๊ฐ ๋์์ ๋ญ๋๋ค. ์๋ก์ด ๊ธฐ์ ๊ณผ ๊ฐ๋ ์ ๋ฐฐ์ฐ๊ณ , ์ด๋ฅผ ์ค์ ๋ก ์ ์ฉํด๋ณด๋ ๊ณผ์ ์์ ๋ง์ ๋์ ๊ณผ ์ด๋ ค์์ด ์๊ฒ ์ง๋ง, ๊ทธ๋งํผ ์ฑ์ฅํ ์ ์๋ ๊ธฐํ๋ ๋ง์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ์ด ๊ธฐ๊ฐ ๋์ ๋์ฑ ์ด์ฌํ ํ์ตํ๊ณ , ์ค๋ ฅ์ ์์๋๊ฐ๋ฉฐ ์ ์์ ์ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆด ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค!