[๐ ์ฌ์ดํด2 - ๋ฏธ์ (๋ธ๋์ญ ๋ฒ ํ )] ์์ฌ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#1132
[๐ ์ฌ์ดํด2 - ๋ฏธ์
(๋ธ๋์ญ ๋ฒ ํ
)] ์์ฌ ๋ฏธ์
์ ์ถํฉ๋๋ค.#1132yeo-li wants to merge 17 commits intowoowacourse:yeo-lifrom
Conversation
์ ์ปค๋ฐ์ ๋์ค์ ์ปค๋ฐ๋ก๊ทธ๋ฅผ ๋ณด๊ณ ์ด๋ค ๋ณ๊ฒฝ์ด ์์๋์ง ํ์ธํ๊ธฐ ์ํจ์ด๋ผ๊ณ ์๊ฐ๋์ด์์. ์ ๋ ์์ ๋จ์๋ก ์ปค๋ฐํ๋๊ฒ ๋ง๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ง ์์ ๊ฐ์ ์ฌ์ ๋ก ์ปค๋ฐ ๋จ์๊ฐ ๋๋ฌด ์ปค์ง๋ฉด ํ์ธ์ด ์ด๋ ต๊ฒ ์ง์..! ๊ทธ๋์ ์์ ๋จ์๋ก ์ปค๋ฐํ์ค๊ฑฐ๋ผ๋ฉด ์๊ฒ ์์ ์ ์ก๋๊ฒ ์ค์ํ ๊ฒ ๊ฐ์์ :) |
TDD๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ด๊ณ ๋๋ฆฌ ์๋ ค์ง ๊ฒ๊ณผ ๊ฐ์ด ์ ํจํ์ง ์์ ๊ฒ์ ์๋์์. ๋ฌด์กฐ๊ฑด ์ฌ์ฉํ๋ค๊ณ ๋ ๋ง์๋๋ฆฌ๊ธด ์ด๋ ต๊ธดํด์. |
ํ๋๋ |
๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ๊ณ ๋ฏผํ๊ฒ ๋๋ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ค์ด ์ฌ์ค ์ ๋ต์ด ์ ํด์ ธ ์์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๊ณ ์๊ฐํด์. ๊ทธ๋์ ์ด๋ค ์ ํ์ ํ์ ๋ ์ค์ํ ๊ฒ์ ์ด๊ฒ ๋ง๋ค ๋ผ๋ ์ ๋์ ์ธ ๋ต์ด๋ผ๊ธฐ๋ณด๋ค๋, ์ ์ด๋ฐ ์ ํ์ ํ๋์ง์ ๋ํ ๊ธฐ์ค๊ณผ ์ด์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ๊ธฐ์ค์ด ์ถฉ๋ถํ ๋ฉ๋ ๊ฐ๋ฅํ๋ค๋ฉด ํ์๋ค์ ์ค๋ํ ์ ์์ ์ ๋๊ฐ ๋๋ฉด ์ข์ ๊ฒ ๊ฐ์์!!! ๋ค๋ง ์ง๊ธ์ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ๋ฐฐ์๊ฐ๋ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋นจ๋ฆฌ ์ ๋ต์ ์ฐพ์ผ๋ ค๊ณ ํ๊ธฐ๋ณด๋ค๋, ๋ค์ํ ์ ํ์ง๋ฅผ ์ง์ ๊ฒฝํํด๋ณด๋ ๊ฒ๋ ์ค์ํ๋ค๊ณ ์๊ฐํด์. ๋ง์ํด์ฃผ์ ๊ฒ์ฒ๋ผ ์ ๋ต์ด ์๋ ๋ฌธ์ ๋ผ๋ ํญ์ ์ฌ๋ฌ ์ ํ์ง๋ ์กด์ฌํ์์์~ ๊ทธ ์ ํ์ง๋ค์ ์ง์ ์ ์ฉํด๋ณด๊ณ , ์ด๋ค ๋ฐฉ์์ด ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ข์์ง ๊ฒฝํ์ ํตํด ๊นจ๋ซ๋ ๊ณผ์ ์ด ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค! ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์ ๊ฑฐ์์ ์ธ ๊ด์ ์์ ๊ถ๊ธํ๋ค๊ณ ๋ง์ํด์ฃผ์ จ๋๋ฐ, ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๋ถ๋ถ์ด ๊ถ๊ธํ์ ์ง ์กฐ๊ธ ๋ ์ ์ ์์๊น์? ํน์ PR์ ์์ฑํด์ฃผ์ ๋ถ๋ถ์ผ๊น์? |
jurlring
left a comment
There was a problem hiding this comment.
์์ฌ ์๋
ํ์ธ์~
๊ฒ์์ด ์๊ตฌ์ฌํญ๋๋ก ๋์ํ์ง ์๋ ๋ถ๋ถ์ด๋ ์ฝ๋ฉํธ ๋ช๊ฐ์ง ๋จ๊ฒผ์ต๋๋ค!
์๊ฐ ๊ด์ฐฎ์ผ์ค ๋ ํ์ธํด์ฃผ์ธ์~! ๐ฐ
| public static int MONEY_MIN_VALUE = 10; | ||
| public static int MONEY_MAX_VALUE = 100_000_000; | ||
| public static int MONEY_UNIT = 10; |
There was a problem hiding this comment.
final์ด ๋น ์ง ๊ฒ ๊ฐ์์.
์ ๊ฐ์ธ์ ์ธ ํ์ธ๋ฐ, PR ์ ์ถํ๊ณ changes๋ก ์ฝ๋๋ฅผ ํ์ธํ๋ฉด ๋ด๊ฐ ๋ฆฌ๋ทฐํ๋ ์์ ์์ ๋ด ์ฝ๋๋ฅผ ๋ณผ ์ ์์ด์! :)
There was a problem hiding this comment.
ํ ๊ทธ๋ฌ๋ค์.. ๋ค์์ changes๋ ํ์ธํ๊ฒ ์ต๋๋ค! ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค๐
| return action; | ||
| } | ||
|
|
||
| public boolean isHit() { |
There was a problem hiding this comment.
๋ฏธ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณด์ฌ์ ๐ฟ
There was a problem hiding this comment.
๋ฏธ์ณ ํ์ธ ๋ชปํ๋ค์..! ๋ฐ๋ก ์ง์ฐ๊ฒ ์ต๋๋ค!
| private static void validate(String input) { | ||
| validateYesNoActionInput(input); | ||
| } | ||
|
|
||
| private static void validateYesNoActionInput(String input) { | ||
| String normalized = input.strip(); | ||
| if (!normalized.equals(PlayerAction.HIT.getAction()) && !normalized | ||
| .equals(PlayerAction.STAND.getAction())) { | ||
| throw new IllegalArgumentException(ErrorMessage.INVALID_YES_NO_INPUT.getMessage()); | ||
| } | ||
| } |
There was a problem hiding this comment.
validate์์ validateYesNoActionInput๋ง ํธ์ถํ๋๊ฒ ๋ถํ์ํ ๋ถ๋ฆฌ ๊ฐ์๋ณด์ฌ์..! ์ด์ ๊ฐ ์์๊น์?
๋ํ validateYesNoActionInput ๋ฉ์๋๋ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ฅผ ๋ค์ด HIT, STAND์ธ์ ๋ค๋ฅธ enum์ด ๋์ด๋๋ค๋ฉด ์ฝ๋์ ๋ณ๊ฒฝ์ด ์๊ฒจ์ผํ ๊ฒ ๊ฐ์์~
There was a problem hiding this comment.
validate๋ก ๊ฐ์ผ ์ด์ ๋, ๋ ๋ค๋ฅธ ์์ธ์ฌํญ์ด ์ถ๊ฐ๋ ์ ์์ด ํ์ฅ์ฑ์ ์ผ๋ํด๋๊ณ ๋ถ๋ฆฌํด๋ณด์์ด์! ํน์ ์ด๋ฐ ๊ด์ ์์๋ validate๋ก ๊ฐ์ธ๋๊ฑด ๋ถํ์ํ ๋ถ๋ฆฌ์ธ์ง๋ ๊ถ๊ธํด์:)
HIT, STAND ์ธ์ ํ์ฅ์ฑ์ ๊ณ ๋ คํ๊ธฐ ์ํด์ values()๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ๊ฐ์ ์ํํ๋ฉด์, getAction()์ ์ด์ฉํด ์ ๋ ฅ๊ฐ๊ณผ ๊ฐ์๋ ํด๋น enum์ ๋ฐํํ๋๋ก ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฐ๊ณผ ์ผ์นํ์ง ์์ ๋, ์์ธ๋ฅผ ๋ฐ์์ํค๋๋ก ๋ฆฌํฉํ ๋ง ํ์ต๋๋ค!
ํน์ ์ด๋ณด๋ค ๋ ์ข์ ๋ฐฉํฅ์ฑ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ํธํ๊ฒ ์ ์ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค๐
| return result; | ||
| } | ||
|
|
||
| public static Result from(Dealer dealer, Player player) { |
There was a problem hiding this comment.
ํจ์(๋๋ ๋ฉ์๋)์ ๊ธธ์ด๊ฐ 10๋ผ์ธ์ ๋์ด๊ฐ์ง ์๋๋ก ๊ตฌํํ๋ค.
์ข ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ฐ๊ฟ ๋ฐฉ๋ฒ์ด ์์๊น์~?
There was a problem hiding this comment.
์ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ฐ๊พธ๊ธฐ ์ํด, ์ฐ์ from ๋ฉ์๋๋ฅผ ๋น์ทํ ๋จ์๋ก ๋๋์ด ๋ณด์์ต๋๋ค. from์ ์นํจ ํ์ ๋ก์ง์ด ํฌ๊ฒ ์ธ ๊ฐ์ง ๊ธฐ์ค์ผ๋ก ๋๋์ด์ก์ต๋๋ค. ๊ฐ์ฅ ๋จผ์ Bust๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ ํฉ๋๋ค. ํ์ ์ด ๋์ง ์์ ๊ฒฝ์ฐ, Blackjack ์ฌ๋ถ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ ํ๊ณ , ๋ง์ง๋ง์ผ๋ก ๊ทธ๋๋ ํ์ ์ด๋์ง ์์ผ๋ฉด ์ ์๋ฅผ ๋น๊ตํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
// ๋ฆฌํฉํ ๋งํ from() ๋ฉ์๋
public static Result from(Dealer dealer, Player player) {
// Bust๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ ํ์
if (player.isBust()) {
return Result.LOSE;
}
if (dealer.isBust()) {
return Result.WIN;
}
// Blackjack์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ ํ์
Result blackjackResult = determineByBlackjack(dealer, player);
if (blackjackResult != null) {
return blackjackResult;
}
// ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ ํ์
return determineByScore(dealer, player);
}
private static Result determineByBlackjack(Dealer dealer, Player player) {
if (dealer.isBlackjack() && !player.isBlackjack()) {
return Result.LOSE;
}
if (dealer.isBlackjack() && player.isBlackjack()) {
return Result.PUSH;
}
if (player.isBlackjack()) {
return Result.BLACKJACK;
}
return null; // blackjack ์ฌ๋ถ๋ก ๊ฒฐ์ ์ ํ ์ ์์ ๋, null์ ๋ฐ์์ํต๋๋ค.
}
private static Result determineByScore(Dealer dealer, Player player) {
if (dealer.calculateScore() == player.calculateScore()) {
return Result.PUSH;
}
if (dealer.calculateScore() > player.calculateScore()) {
return Result.LOSE;
}
return Result.WIN;
}์๋ ๋ฆฌํฉํ ๋งํ ์ฝ๋์
๋๋ค. determineByBlackjack()์์ blackjack์ผ๋ก ํ๋จ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ, null์ ๋ฐํํ๋๋ก ํ์ด์. ๊ทธ๋ฐ๋ฐ ์ ๋ฒ์ ์ฒจ๋ถํด์ฃผ์ null ๊ด๋ จ ์๋ฃ์์ null์ด ์๋ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ ์ด์ํ ๊ฒฝ์ฐ์ null์ ์ฌ์ฉํ๋ค.๋ผ๊ณ ์ธ๊ธ์ด ๋์ด ์์์ต๋๋ค. ๊ทธ๋์ determineByBlackjack()๊ฐ null์ ๋ฐํํ๋๊ฒ ์ด์ํ ์ํฉ์ด๋ผ ์๊ฐํด, ๋ ๋์ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์์ต๋๋ค!
์ฐพ์๋ณธ ๊ฒฐ๊ณผ Chain Of Responsibility ํจํด์ด ์์์ต๋๋ค. ์ด๋ฅผ ์ ์ฉํ๋ ค๊ณ ํ์ง๋ง null์ ํ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ๊ณ ์ง๊ด์ ์ผ๋ก ์์๋ณด๊ธฐ ์ด๋ ค์ null์ ๋ฐํํ๋, null์ ์๋ฏธ๋ฅผ ์ฃผ์์ผ๋ก ์ ์ด๋๊ธฐ๋ก ํ์ต๋๋ค!
๋ฉ์๋๋ก ๋๋๋ ๊ฒ ๋ณด๋ค ๋๋์ง ์๋๊ฒ ๊ฐ๋
์ฑ์ ๋ ์ข๋ค๊ณ ์๊ฐํด์ ๊ทธ๋ฅ ๋์๋๋ฐ, ํผ๋๋ฐฑ ์ฃผ์ ๋ฐฉํฅ์ผ๋ก ๊ณ ๋ฏผํด๋ณด๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ ์ ์์์ด์! ๊ฐ์ฌํฉ๋๋ค
| public boolean isBust() { | ||
| return hand.calculateScore() > PolicyConstant.BLACKJACK_SCORE; | ||
| } | ||
|
|
||
| public int calculateScore() { | ||
| return hand.calculateScore(); | ||
| } | ||
|
|
||
| public boolean isBlackjack() { | ||
| return hand.calculateScore() == PolicyConstant.BLACKJACK_SCORE && hand.getCardNames().size() == 2; | ||
| } |
There was a problem hiding this comment.
hand๊ฐ Blackjack์ธ์ง Bust์ธ์ง ํ๋จํ๋ฉด ์ด๋จ๊น์? ์ด๋ ๊ฒ ๋ฐ๊พธ๋ฉด ์ด๋ค ์ฅ์ ์ด ์์๊น์?
There was a problem hiding this comment.
๋ฒ์คํธ์ ๋ธ๋์ญ์ ํ๋จ์ Hand๋ก ์ฎ๊ธฐ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์์! ์ฐ์ ๊ฐ ๋๋ฉ์ธ์์์ ์ญํ ์ด ๋ ์์ฐ์ค๋ฝ๋ค๋ ์ฅ์ ์ด ์์์ด์. ๊ทธ๋ฆฌ๊ณ ์์ ์ ์ฝ๋๋ getCardNames()๋ฅผ ํธ์ถํด ์ ์ฒด ์นด๋ ์๋ฅผ ๊ณ์ฐํ๊ณ ์๋๋ฐ, ์ด๋ฅผ ํธ์ถํ์ง ์๊ณ this.cards๋ฅผ ์ด์ฉํด ์นด๋ ์๋ฅผ ๊ณ์ฐํ ์ ์์์ต๋๋ค! ๊ทธ๋์ ๋ถํ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์๋ ๋๋ค๋ ์ฅ์ ์ด ์์์ด์.
๋ฐ๋ฉด hand ๋๋ฉ์ธ์ผ๋ก ์ฎ๊ธฐ์ง ์์ผ๋ฉด ์์ ์ ํ์ง ์์๋ ๋๋ค(?)๋ ์ฅ์ ์ ์์์ง๋ง, getCardNames() ๋ฉ์๋๋ฅผ ์นด๋ ์๋ฅผ ์ธ๊ธฐ ์ํด ์๋ ๋ฉ์๋ ๋ชฉ์ ๊ณผ ๋ง์ง ์์ ์ฉ๋๋ก ์ฌ์ฉํด์ผ ํ๋ค๋ ๋จ์ ์ด ์์์ต๋๋ค.
๋ฐ๋ผ์ ํผ๋๋ฐฑ ์ฃผ์ ๊ฒ ์ฒ๋ผ Hand์์ blackjack, bust๋ฅผ ํ๋จํ๋๊ฒ ๋ ์ข์ ์ค๊ณ์ธ ๊ฒ ๊ฐ์์! ๊ฐ์ฌํฉ๋๋ค:) ์ฃผ๋์ ์๊ฐ๋ ์ด์ผ๊ธฐ ํด์ฃผ๋ฉด ๊ณ ๋ง์ธ ๊ฒ ๊ฐ์์๐
| private void collectBets() { | ||
| for (int playerIndex = 0; playerIndex < blackjackService.getPlayerCount(); playerIndex++) { | ||
| String input = inputView.inputBetAmount(blackjackService.getPlayerName(playerIndex)); | ||
| blackjackService.receivePlayerBets(playerIndex, Money.from(input)); | ||
| } | ||
| } | ||
|
|
There was a problem hiding this comment.
index๋ก ๊ฐ์ ธ์ค๋๊ฒ๋ณด๋ค, player์ ์ด๊ธฐํ๋ฅผ ๋ฒ ํ
๊ธ์ก๊น์ง ๋ฐ๊ณ ํ๋ฉด ์ด๋จ๊น์?
ํ๋ ์ด์ด๋ ๋ฒ ํ
๊ธ์ก์ ๋ฌด์กฐ๊ฑด ๊ฐ์ ธ์ผํ๋๋ฐ Player.placeBet์ด ๋๋ฝ๋๋ฉด ๋ฒ ํ
๊ธ์ก์ ๊ฐ์ง ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณด์ฌ์!
| String.format("๊ฒ์ ์ฐธ๊ฐ์์ ์ด๋ฆ์ %d~%d๊ธ์ ์ฌ์ด์ฌ์ผ ํฉ๋๋ค.", PolicyConstant.PLAYER_NAME_MIN_LENGTH, | ||
| PolicyConstant.PLAYER_NAME_MAX_LENGTH)), | ||
| PLAYER_NAME_BLANK("๊ฒ์ ์ฐธ๊ฐ์์ ์ด๋ฆ์ ๊ณต๋ฐฑ์ด ๋ ์ ์์ต๋๋ค."), | ||
| MONEY_NOT_NUMBER("๋ฒ ํ ๊ธ์ก์ ์ซ์์ฌ์ผ ํฉ๋๋ค."), |
| private boolean isStandSelected(int playerIndex) { | ||
| String name = blackjackService.getPlayerName(playerIndex); | ||
| String input = inputView.inputHitOrStand(name); | ||
| if (PlayerAction.from(input).isStand()) { |
There was a problem hiding this comment.
21์ ์ ๋์ด๋ ์ฌ์ฉ์๊ฐ ๊ณ์ ์นด๋๋ฅผ ๋ฐ์๋ ๋๋์?
| public record PlayerResultDto( | ||
| String name, | ||
| Result result | ||
| double profit |
There was a problem hiding this comment.
๊ธ์ก์ด๋ผ๋ ๊ฐ์ด double๋ก ๋์ฌ ์ ์์๊น์..?!
์ปค๋ฐ๋จ์์ ๋ํด ์๊ฒฌ ์ด์ผ๊ธฐ ํด์ฃผ์ ์ ๊ฐ์ฌํด์! ์์ ์ ์์ ๋จ์๋ก ๋๋๋ ์ฐ์ต์ ํด๋ณด๊ฒ ์ต๋๋ค๐ช๐ป |
์ ์ ๊ฐ ์๊ฐํ ๋ถ๋ถ์ ๋ํด์ ์ํฉ์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค! ๋ธ๋์ญ ๋ฒ ํ ๊ธฐ๋ฅ์ ๋ง๋ ๋ค๊ณ ํ์๋, ์๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํด๋ณผ๊ฒ์! public void receivePlayerBets(int playerIndex, Money money) {
Player player = players.getPlayerByIndex(playerIndex);
/*์ดํ ์๋ต*/
}
์ด๋ ๊ฒ ํ๋์ ๋ฉ์๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ์ถ๊ฐ๋ก ๊ธฐ๋ฅ์ ๋ง๋ค๋ ํ ์คํธ ์ฝ๋๊ฐ ๋ค์ด๊ฐ๊ฒ ๋์ด ์๊ฐ์ด ์์๋๊ณ , ๊ทธ ๊ณผ์ ์์ ํ๋ฆ์ ๋์น๊ฒ ๋๋ ๊ฒ์ด์์ต๋๋ค! ๊ทธ๋ฐ๋ฐ ์์ฑ์ ํ๋ค๋ณด๋ ์ ๋ฆฌ๊ฐ ๋ ๊ฒ ๊ฐ์์..! ์ฒ์๋ถํฐ ์ด๋ค ๊ฒ์ ๋ง๋ค์ง ๋ชจ๋ ์ ๋ฆฌํ ๋ค์์ getPlayerByIndex๋ถํฐ TDD๋ก ์์ ํ๋ฉด ๋๊ฒ ๋ค์! |
ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค!! ์ด๋ฒ์ฃผ์ ํ๊ต์์ ์ฑ ๋น๋ ค์ ์ฝ์ด๋ด์ผ๊ฒ ์ด์! |
์ ๊ฐ ์๊ฐํ ๊ฑฐ์์ ์ธ ๊ด์ ์ pr์ ์์ฑํ ๋ถ๋ถ๊ณผ ์ํํธ์จ์ด ์ํคํ ์ณ์ ์ธ ๋ถ๋ถ์ด์์ต๋๋ค! ์ฃผ๋๊ฐ ์ด์ผ๊ธฐ ํด์ฃผ์ ๊ฒ ์ฒ๋ผ ๋ค์ํ ๊ฒฝํ์ ํ๋ฉด์ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ ๋ ๋ถ๋ถ, ์ข์๋ ๋ถ๋ถ๋ค์ ์ ๋ฆฌํ๋ฉด ๋ง์ด ์ฑ์ฅํ ๊ฒ ๊ฐ์์:) |

์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ์ ์์ด ์ค์ค๋ก ์ ํ ๋ด์ฉ
1. ๋ฒ ํ ๊ธ์ก๊ณผ ๊ด๋ จ๋ ๋ด์ฉ
์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
1. ์ปค๋ฐ ๋จ์๋ ์ด๋ป๊ฒ ํ์๋์?
๊ธฐ๋ฅ์ ๊ฐ๋ฐํ ๋๋ ํ ํ์ผ์ด ์๋๋ผ ์ฌ๋ฌ ํ์ผ ๋จ์๋ก ์์ ์ด ๋๊ธฐ๋ ํฉ๋๋ค. ํ์ผ์ด๋ ๋ฉ์๋ ๋จ์๋ก ์ปค๋ฐ์ ํ๊ธฐ๋ ํ์ง๋ง, ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์์ ๋จ์๋ก ์ปค๋ฐํ๋๊ฒ ๋ ์์ฐ์ค๋ฌ์ด ๊ฒ ๊ฐ์์. ์์ ์ด ๋๋๊ธฐ ์ ์ ์ปค๋ฐ์ ํ๋ฉด์ ๊ฐ๋ฐํ๋ฉด, ์ด๋ฏธ ์ปค๋ฐํ ํ์ผ์ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ ์ปค๋ฐ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ด์์. ์ด๋ ๊ฒ ์์ ๋จ์๋ก ์ปค๋ฐ์ ํ์ ๋, ์ํํ ์ ์ด ์๋์ง ํน์ ์ ์ ํ ๋ฐฉ๋ฒ์ธ๊ฑด์ง ๊ถ๊ธํด์!
2. ํ ์คํธ ๋จผ์ ์์ฑํด์ผํ ๊น์? ์๋๋ฉด ๊ฐ๋ฐ ๋จผ์ ํด์ผํ ๊น์?
์ด๋ฒ ๋ฏธ์ 1์์๋ TDD๋ฅผ ์งํค๊ธฐ ์ํด ๋ ธ๋ ฅํด๋ณด์์ต๋๋ค. TDD๋ฅผ ํ๋ฉด์ ์ข์๋ ๋ถ๋ถ์ ๋ชจ๋ ๋ฉ์๋์ ๋ํด ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์์ง๋ง, ๊ฐ๋ฐ ์๋๋ ๋ง์ด ๋๋์ก์ต๋๋ค. ์ด์ ๋ ํ๋์ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ ๋ ์ถ๊ฐ๋ก ๊ตฌํํด์ผํ๋ ๋๋ฉ์ธ์ด๋ ๋ฉ์๋๊ฐ ์๋๋ฐ, ์ด๋ค์ ๋ํด ๋จผ์ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ณ ๋ง์ง๋ง์ผ๋ก ๊ตฌํํ๋ก ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ฒ๋ผ ์ฌ๊ท์ ์ผ๋ก ํ ์คํธ ์์ฑ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์, ์ค๊ฐ์ ์์ ํ๋ฆ์ ๋์น๊ธฐ๋ ํ์ต๋๋ค. ๊ทธ๋์ ์ ๋ TDD๊ฐ ํ์ ์์๋ ์ ํจํ ๊ฐ๋ฐ ๋ฐฉ์์ธ์ง ๊ถ๊ธํ๊ณ , ์ ํจํ๋ค๋ฉด TDD์ ํ์ค์ ์ธ ๋ฐฉ๋ฒ๊ณผ ์ด๋ค์ ์ด ์ ํจํ์ง๋ ๊ถ๊ธํฉ๋๋ค!
3. ์ข์ ์ค๊ณ์ ๋ํด ๊ถ๊ธํด์!
์ฝ์ ํ๋ก๊ทธ๋จ์์๋ ๊ฐ์ฒด๊ฐ ํ๋ ฅ์ด ์ค์ํ๊ฒ ์์ฉํ๋ ๊ฒ ๊ฐ์์. ์ ๋ ์ฒ์์ ๋ฌด์กฐ๊ฑด MVC ํจํด์ ์ ์ฉํ๋ฉด์ ๊ฐ๋ฐ์ ํ์๋๋ฐ, ๋ฌด์กฐ๊ฑด ์ ๋ต์ธ ๋์์ธ ํจํด์ ์๋ค๋ ๊ฒ์ ์๊ฒ๋์์ด์๐ซข ์ฝ์ ํ๋ก๊ทธ๋จ, ์น ์๋ฒ ์ฒ๋ผ ๊ตฌํ ์ฅ์๊ฐ ๋ค๋ฅธ ๊ณณ์์๋ ์ข์ ์ค๊ณ๋ฅผ ํ๊ธฐ ์ํด์ ์ด๋ค ํ๋๋ ๋ฐฉ๋ฒ์ ์ ์ฉํ๋๊ฒ ์ข์๊น์? ๊ทธ๋ฆฌ๊ณ ์ค๊ณ์ ๋ํด ๊ณต๋ถํ๊ณ ์ถ์๋ฐ, ๊ณต๋ถํ๊ธฐ ์ข์ ์ฑ ๋ ์ถ์ฒํด์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.โบ๏ธ
๋ฆฌ๋ทฐ์ด์๊ฒ
์๋ ํ์ธ์ ์ฃผ๋!โบ๏ธ
์ฌ์ดํด1์์ ์์คํ ํผ๋๋ฐฑ ํด์ฃผ์ ์ ๊ฐ์ฌํด์
์ฌ์ดํด2์์๋ ์ฌ์ดํด1์ ํผ๋๋ฐฑ์ ๋ชจ๋ ์ ์ฉํ์ฌ ๊ธฐ๋ฅ์ ์์ฑํด๋ณด์์ต๋๋ค!
์ฌ์ดํด2์์ ๋ฐฐ์ฐ๊ณ ์ถ์ ๊ฒ์ ์ข์ ์ค๊ณ, ๊ฐ๋ฐ๋ฅผ ํ๊ธฐ ์ํ ์ง์๊ณผ ํ๋์ ๋๋ค.
์ฌ์ค ์์ง ์์ ๋ํด ๊ฐํผ๋ฅผ ๋ชป์ก๊ณ ์์ด์๐ฅบ ์ ๋์ ์ธ ์ ๋ต์ด ์๋ค๋ฉด ์ ๋ต์ด ์๋ ๊ณณ์์ ์ ๋ต์ ๋์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์?
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์๋ ์ธ์ธํ ๋ถ๋ถ๋ณด๋จ, ๊ฐ๋ฐ์ ๊ฑฐ์์ ์ธ ๊ด์ ์์ ๊ถ๊ธํ ๋ถ๋ถ์ด ์์์ด์!
๋ฌผ๋ก ์ฝ๋์์ ๋ถ์กฑํ ๋ถ๋ถ๋ค์ ๋ํด์๋ ์ธ์ ๋ ์ง ํผ๋๋ฐฑ ํด์ฃผ์๋ฉฐ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
์ด๋ฒ ์ฃผ๋ ์ข์ ์ผ๋ง ์๊ธธ ๋ฐ๋ผ๊ฒ ์ต๋๋ค๐