์ฐํ ์ฝ ํ๋ฆฌ์ฝ์ค๊ฐ ๋๋๊ณ , ํต์ฌ ๊ธฐ๋ฅ ๋ถํฐ ๊ตฌํํ๊ธฐ ์ํด '์ซ์ ์ผ๊ตฌ ๊ฒ์' ๋ฏธ์ ์ ๋ค์ ํ์ด๋ณด์๋ค.
ํ์ง๋ง, ํต์ฌ ๊ธฐ๋ฅ๋ถํฐ ๊ตฌํ ํ๊ธฐ ์ํด, ๊ณ ๋ฏผํ๊ณ ๋ต์ ์ฐพ๋ ๊ณผ์ ์ด 2์ฃผ๊ฐ ๊ฑธ๋ ธ๋ค.
์ด ๊ณผ์ ์์ ์๊ฒผ๋ ๊ถ๊ธ์ฆ๋ค์ Q&A ํ์์ผ๋ก ๋จผ์ ์๊ธฐํด๋ณด๊ฒ ๋ค!
*์์๋ก ๋์ค๋ ์ฝ๋์ ์ ๋ฌธ์ ๋๋ค.
โ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด ๊ฒ์ฆ(validate)์ ์ด๋์ ํ ๊ฒ์ธ๊ฐ?
์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ ์กฐ๊ฑด๋ค์ ์ด๋์ ๊ฒ์ฆํด์ผ ํ ๊น?
๋์ ์๊ฐ์ ๊ฐ ๊ฐ์ฒด์ ์์ฑ์์์ ๊ฒ์ฆ์ ํ๋ ๊ฒ์ด๋ค.
์ด ๋, ๊ฐ์ฒด๊ฐ ์์ฑ์ด ๋๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ ์๊ตฌ์ฌํญ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๋ณด์ฅ๋ ๊ฐ์ฒด์์ ๋ปํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด, ์ซ์ ์ผ๊ตฌ ๊ฒ์์ "์๋ก ๋ค๋ฅธ ์ธ ์๋ฆฌ์" ๋ผ๋ ์๊ตฌ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด๋ค์ ๋ดํฌํ๊ณ ์๋ค.
โ ์๋ก ๋ค๋ฅธ ์ธ ์๋ฆฌ์์ ์ซ์๋ ์ค๋ณต๋์ง ์์์ผ ํ๋ค
โก 1~9์ฌ์ด์ ์ซ์์ฌ์ผ ํ๋ค
โข์ธ ์๋ฆฌ ์ซ์์ฌ์ผ ํ๋ค.
์ด๋ฌํ ์กฐ๊ฑด๋ค์ ๋ง์กฑํ๊ธฐ ์ํด ์ธ ์๋ฆฌ ์ซ์๋ฅผ ์์ฑํ๋ ๊ฐ์ฒด์ธ GameNumber ๋ฅผ ์์ฑํ ๋, ์์ฑ์์์ ์กฐ๊ฑด๋ค์ ๊ฒ์ฆ(validate)์ ํ๋๋ก ํ๋ค.
public class GameNumber{
private final List<Integer> numbers;
public GameNumber(List<Integer> numbers){
validate(numbers);
this.numbers = numbers;
}
... ๋ค๋ฅธ ๋ก์ง๋ค ...
private void validate(List<Integer> numbers){
1. ์ค๋ณต๋๋์ง ์ฌ๋ถ
2. ์ซ์๊ฐ 1~9์ฌ์ด์ธ์ง ์ฌ๋ถ
3. ์ธ ์๋ฆฌ์์ธ์ง ์ฌ๋ถ
}
}
์ ๋ ฅ๊ฐ์ธ String์ List<Integer>๋ก ํ์ ์ ๋ณํํ ํ, GameNumber ์๊ฒ ๋๊ฒจ ์ฃผ์์ ๋!!
GameNumber ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ ๋๋ค๋ฉด ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๋ง๋ ์ ๋ ฅ์ด๋ ๊ฒ์ด ๋ณด์ฅ๋๋ค๋ ์๋ฏธ์ด๋ค.
์ฆ, GameNumber ์ ์ํด ์์ฑ๋ ์ซ์๋ ์ค๋ณต๋์ง ์๊ณ , ์ซ์๊ฐ 1~9์ฌ์ด ์ด๊ณ , ์ธ ์๋ฆฌ์๊ฐ ๋ณด์ฅ๋๋ค๋ ์๋ฏธ์ด๋ค.
์ด๊ฒ์ด ์ผ๊ธ์ปฌ๋ ์ ์ ๊ธ์ 1๋ฒ์ ํด๋น๋๋ ๋ด์ฉ์ด๋ค.
๊ทธ๋ฌ๋, ์กฐ์ํธ๋์ ๊ฐ์ฒด์งํฅ ์ธ๋ฏธ๋์ 1์๊ฐ 23๋ถ 15์ด๊ฒฝ์ ๋ณด๋ฉด ๊ฐ ๊ฐ์ฒด์ ์๋ validate ๋ค์ ํ๊บผ๋ฒ์ ๊ด๋ฆฌํ๋ Validator ๋ฅผ ๋ง๋์ ๋ค.
๊ทธ๋ฆฌ๊ณ , validate ๋ฅผ ํ๊บผ๋ฒ์ ๊ด๋ฆฌํ๋ ์ด ์ค๊ณ(Validator)๋ ํฉ์ด์ ธ ์๋ validate ๋ค์ ๋ฌถ์ ์ ์๊ธฐ์ ์ข๋ค๊ณ ๋ง์ํ์ ๋ค.
validate ๊ฐ ํฉ์ด์ ธ ์๋ค๋ฉด ์ ์ฒด์ ์ธ ๋ก์ง์ ํ๋ก์ฐ์ ๋์น ์ ์๊ณ , ์ด๋ค ์ํฉ์์ ์ค๋ฅ๊ฐ ์๊ธฐ๋์ง ์ด๋ ต๋ค๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ฑ์์์ ๊ฒ์ฆํ๋ ๊ฒ๊ณผ ๊ฒ์ฆ ๋ก์ง๋ค์ ๋ชจ์ ๋์ Validator ์ค ์ด๋ค ๊ฒ์ด ๋ ์ข์ ์ค๊ณ์ผ๊น?
โ Wrapping์ ์ด๋๊น์ง ํ๋๊ฐ?
์ ์์์ ์๋ List<Integer> numbers ์ ํด๋นํ๋ Integer๋ Wrapping์ ํ ์ ์๋ค.
List<Integer> numbers ๋ฅผ List<Number> numbers ๋ก ๋ฐ๊ฟ ์ ์๋ค๋ ์๊ธฐ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, Wrapping์ ํด์ผ ํ ๊น? ๋ง์์ผ ํ ๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ๋๋ List ์์ ์๋ ์ซ์๋ค์ Number ๋ก Wrapping ์ ํ๋ค.
์๋ํ๋ฉด Number ๊ฐ์ฒด์ ์ํด ์์ฑ๋ ์ซ์๋ค์ 1~9์ฌ์ด์ ์ซ์์์ ๋ณด์ฅํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ด๋ค.
public class GameNumber{
private final List<Number> numbers;
public GameNumber(List<Number> numbers){
validate(numbers);
this.numbers = numbers;
}
... ๋ค๋ฅธ ๋ก์ง๋ค ...
private void validate(List<Number> numbers){
1. ์ค๋ณต๋๋์ง ์ฌ๋ถ
2. ์ธ ์๋ฆฌ์์ธ์ง ์ฌ๋ถ
}
}
public class Number{
private final int value;
public Number(int value){
validate(value);
this.value = value;
}
private void validate(int value){
1. ์ซ์๊ฐ 1~9์ฌ์ด์ธ์ง ์ฌ๋ถ
}
}
์ด๋ก ์ธํด GameNumber ์ ์๋ "๊ฐ ์ซ์๋ 1~9์ฌ์ด ์ธ์ง ํ์ธ" ํ๋ ๊ฒ์ฆ ์กฐ๊ฑด์ Number ์๊ฒ๋ก ์ฎ๊ฒจ์ง๊ฒ ๋์๋ค.
* [๋ฐ๋ ๊ฒ์ฆ ์กฐ๊ฑด]
GameNumber : ๊ฐ ์ซ์๊ฐ ์ค๋ณต๋๋์ง ํ์ธ, ์ธ ์๋ฆฌ ์ ์ธ์ง ํ์ธ
Number : ๊ฐ ์ซ์๊ฐ 1~9์ธ์ง ํ์ธ
์ด์ Number ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ค์ 1~9์ฌ์ด์ ์ซ์๋ฅผ ์ด์ฉํ๋ค๋ ๋ณด์ฅ์ด ๋์๋ค.
* ์ง๊ธ๊น์ง์ ๋ด์ฉ์ด ์ดํด๊ฐ ์ ๊ฐ์ง ์๋๋ค๋ฉด ํฌ๋น๋์ด ์งํํ์ ๋ฆฌํฉํ ๋ง ์์์ 45๋ถ ๊ฒฝ์ ๋์ค๋ Positive ๊ด๋ จ ์ค๋ช ์ ์ถ์ฒํ๋ค!
์ด ์ค๋ช ์์ ๋๋ Positive๊ฐ 0 ์ด์์ ์ซ์๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด์์ด ๋ณด์ฅ๋๋ค๊ณ ์ดํดํ๋ค.
ํ์ง๋ง, Wrapping ์ ๊ผญ ํด์ผ ํ ๊น? ๊ทธ๋ฅ ๋ ๋๋ฉด ์๋๋?
๊ทธ๋ ๋ค๋ฉด, ์คํธ๋ผ์ดํฌ์ ๋ณผ ๊ฐ์๋ฅผ ๊ฐ๊ณ ์๋ Result ์ ํ๋์ธ int ballCount ์ int strikeCount ๋ Wrapping ํด์ผ ํ ๊น?
๋๋ ballCount ์ strikeCount ๋ฅผ ํตํด ์๊ตฌ์ฌํญ์ผ๋ก๋ถํฐ ๋ณด์ฅํ๊ณ ์ถ์ ๊ฐ์ ์์๊ธฐ ๋๋ฌธ์ Wrapping ํ์ง ์๊ณ ์์ ํ์ ์ผ๋ก ๋์๋ค.
๋ฌผ๋ก , ๋์ ๋ค๋ฅธ ์ค๊ณ๋ฅผ ํ ๋๊ตฐ๊ฐ๋ Number ๋ฅผ Wrapping ํ์ง ์์์ ๊ฒ์ด๋ค.
์คํ๋ ค, ๋ณผ ๊ฐ์์ ์คํธ๋ผ์ดํฌ ๊ฐ์๋ฅผ Wrapping ํ์ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด Wrapping์ ์ด๋๊น์ง ํด์ผ ์ข์ ์ค๊ณ๋ผ๊ณ ๋งํ ์ ์์๊น?
โ ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆ์ ์ด๋์ ํ๋๊ฐ?
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๊ฐ์ ํ์ ์ String ์ด๋ค.
GameNumber ๊ฐ String ํ์ ์ ์ฌ์ฉํด์ ์ซ์๋ฅผ ๋ง๋๋ ๊ฒ์ ์ง๊ด์ ์ด์ง ์์ ๋ฟ๋๋ฌ ์ซ์๋ฅผ ์์ฑํ๋ค๋ ์ฑ ์ ์ด์ธ์ ํ์ ์ ๋ณํํ๋ ์ฑ ์๋ ๊ฐ๊ฒ ๋๋ค. (String ํ์ → List<Integer> ํ์ )
๋ํ, validate ๋ ์ซ์๋ฅผ ๊ฒ์ฆํด์ผ ํ๋๋ฐ String ํ์ ์ ์ด์ฉํด์ ๊ฒ์ฆํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ง๊ด์ ์ด์ง ์๋ค.(์๋ก ๋ค๋ฅธ ์ซ์๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ GameNumber๋ int ํ์ ์ ์ฌ์ฉํ ๊ฒ์ด๋ผ ์๊ฐํ๋๋ฐ String ํ์ ์ด๋ค.)
public class GameNumber{
private final List<Integer> numbers;
public GameNumber(String input){
validate(input);
this.numbers = Arrays.stream(input.split(""))
.map(Integer::parseInt)
.collect(toList());
}
private void validate(String input){
1. ์ค๋ณต๋๋์ง ์ฌ๋ถ
2. ์
๋ ฅ๊ฐ์ ๊ธธ์ด๊ฐ ์ธ ์๋ฆฌ์ธ์ง ์ฌ๋ถ
}
}
๊ทธ๋ ๊ธฐ์ GameNumber ์๊ฒ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ธ String ํ์ ์ ๊ทธ๋๋ก ๋๊ฒจ์ฃผ์ง ๋ง๊ณ , ๋๊ตฐ๊ฐ๊ฐ String ์ List<Integer> ๋ก ํ์ ์ ๋ณํํด์ ์ค์ผ ํ๋ค.
๋๋ ์ด๊ฒ์ GameNumberFactory ์์ ์งํํด์ฃผ์๊ณ , ๋์์ ์ ๋ ฅ๊ฐ์ด ์ซ์๋ก ๋ณํ ๋ ์ ์๋์ง๋ ๊ฒ์ฆํด์ฃผ์๋ค.
public class GameNumberFactory(){
public static GameNumber createNumber(String input){
validate(input); // ์
๋ ฅ๊ฐ์ด ์ซ์๋ก ๋ณํ๋๋์ง ๊ฒ์ฆ, ๋ณํ์ด ์๋๋ค๋ฉด ์์ธ ๋ฐ์
return GameNumber.from(generateNumbers(input)); // String ํ์
์ List<Integer> ํ์
์ผ๋ก ๋ณํ
}
// ์
๋ ฅ๊ฐ์ด ์ซ์๋ก ๋ณํ๋ ์ ์๋์ง ๊ฒ์ฆ
private void validate(String input){
try {
Integer.parseInt(input);
catch (NumberformatException e) {
throw new Illegal~~;
}
}
}
์ด ๋, DTO๊ฐ ์๊ฐ์ ์ผ๋ก ๋ ์ฌ๋๊ณ , DTO์ ๋ํด ํ์ตํ๊ฒ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ , ํ์ตํ ๊ฒฐ๊ณผ๋ก, ๋ง์ฝ์ ๋ด๊ฐ DTO ๋ฅผ ์ฝ๋์ ์ ์ฉํ ์ค ์์๋๋ผ๋ฉด DTO ์์ ์ต์ํ์ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ์ ํ๊ณ (์ซ์ ์ผ๊ตฌ ๊ฒ์์ ์๋ก ๋ค๋ฉด, ์ ๋ ฅ๊ฐ์์ ์ซ์์์ ๊ฒ์ฆํ๊ธฐ), ํ์ ์ ๋ณํ ํ์ ๊ฒ์ด๋ค.
* DTO๋ฅผ ์ ํํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค ใ ใ
๊ทธ ์ด์ ๋ DTO ์์ ํ๋ค๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํค๊ธฐ ์ํด ๋ด๋ถ ๋ก์ง๊น์ง ์๊ฐ๋ ๋๋ ์ฅ์ ๊ณผ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ View ๋ ์ ๋ ฅ๋ง ๋ฐ์ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
*DTO : Controller ๊ณ์ธต ์์ Service ๊ณ์ธต์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ชฉ์ ์ด๋ค. ๊ด๋ จ ์์ → ์ธ๋น์ DTO vs VO
*Service ๊ณ์ธต : ๋ด ์๊ฐ์ ํ๋ก๊ทธ๋จ์ด ๋์ํ ๋, ํ๋์ ํธ๋์ญ์ (์ผ๋ จ์ ํ๋) ์ ์ฒ๋ฆฌํ๋ ๊ณ์ธต์ด๋ผ ์๊ฐํ๋ค.(!!์๋ ์๋ ์์ ์ฃผ์!!)
'์ ๋ ฅ๊ฐ์ ๊ฒ์ฆ์ ์ด๋์์ ํด์ผ ํ๋๊ฐ?'๋ 6๊ธฐ ๋์ค์ฝ๋ ๋ฐฉ์์๋ ํ๋ฐํ ์งํ๋์๋งํผ ์๊ฒฌ์ด ๋งค์ฐ ๋ถ๋ถํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ํ ์๊ฐ์ด ์ ๋ต์ ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋์ ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆ์ ํด์ผ ์ข์ ์ค๊ณ์ผ๊น?
โ ์ด๋์ ๋ถํฐ ๊ตฌํ์ ์์ํ ๊น?
๊ฐ์ฒด์งํฅ์ ์ ๋ฌธํ๋ค๋ฉด "๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด"๋ "์ค๋ธ์ ํธ"๋ฅผ ์ฝ์ด๋ดค์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด ๋ ์ฑ ์ ์์ ์ฝ๋๋ ํน์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์์ฑ์ํค๋ ๊ฒ๋ถํฐ ๊ตฌํํ๊ธฐ ์์ํ๋ค.
"์ค๋ธ์ ํธ"์ ์ํ ์๋งค ์์ ์ฒ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ์ฌํ ๊ฐ์ฒด๋ถํฐ ๊ตฌํํ๋ ๊ฒ์ฒ๋ผ ์ซ์ ์ผ๊ตฌ ๊ฒ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ์ฌํ์ด๋ ๊ฐ์ฒด๋ถํฐ ๊ตฌํํ๊ณ ์ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด Result ๋ ๋ณผ ๊ฐ์์ ์คํธ๋ผ์ดํฌ ๊ฐ์๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด,, Computer ๋ ๋๋ค์ผ๋ก ์์ฑ๋๋ ์ซ์, User๋ ์ ๋ ฅ๊ฐ์ ์ํด ์์ฑ๋๋ ์ซ์๋ก ๋ฉ์๋์ ์๊ทธ๋์ฒ๋ฅผ ์์ฑํ๋ค.
public class Referee{
public Result compare(Computer computer, User user){
return new Result(? , ?); // ์๋ง ๋ณผ ๊ฐ์, ์คํธ๋ผ์ดํฌ ๊ฐ์๊ฐ ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
}
}
๊ทธ๋ฌ์, Result, Computer, User์ ๋ํ ์๋ง์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ฅผ ๋ฐ๊ฒผ๊ณ , ์ด ๋ฉ์๋์ ๋ํด ํ ์คํธ ์ฝ๋์ ์์ฑ์ ๋๋ฌด ์ด๋ ค์ ๋ค.
๊ฐ์ฒด ์งํฅ์์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , ๋ฉ์์ง๋ฅผ ์ํํ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ณ , ๋ค์ ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ํ๋ ๋ฐ๋ณต๋๋ ๊ณผ์ ์ ์ดํด ํ ์ ์์ง๋ง, ์ฑ ์ ์๋ ์์ ์ฝ๋์ฒ๋ผ ํน์ ๊ฐ์ฒด์ ๋ฉ์๋ ๋ถํฐ ๊ตฌํํ๊ธฐ๋ ๋ถ๋ช ์ด๋ ค์ ๋ค.
๊ทธ์ ๋ฐํด, ๋ฉ์์ง๋ฅผ ์ํํ ์ต์ ๋จ์์ธ ๋๋ฉ์ธ๋ถํฐ ๊ตฌํํ๋ ๊ฒ์ ํจ์ฌ ์ฌ์ ๊ณ , ํ ์คํธํ๊ธฐ์๋ ์ฉ์ดํ๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด ๋ฐฉ์์ด Bottom-Up์ด๋ ๊ตฌํ ๋ฐฉ์์ด๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
Bottom-Up๊ณผ ๋๋น๋๋ Top-Down ๋ฐฉ์์ด ์์๊ณ , ์ด๋ค์ GPT์๊ฒ ๋ฌผ์ด๋ณด์๋ค.
- Top-down ๋ฐฉ์ ์ฌ์ฉ ์์:
- ์๋ก์ด ์ํํธ์จ์ด ์ ํ์ด๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ๋, ์ฌ์ฉ์์ ๊ธฐ๋ฅ์ ์๊ตฌ์ฌํญ์ ๋จผ์ ์ดํดํ๊ณ ๊ณ ์์ค์ ์ค๊ณ๋ฅผ ์๋ฆฝํ ๋.
- ๋๊ท๋ชจ ์์คํ ์ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ ๋, ๊ณ ์์ค์ ๋ชจ๋๋ค์ ๋จผ์ ์ ์ํ๊ณ ์ด๋ค ๊ฐ์ ์ํธ ์์ฉ์ ๊ณ ๋ คํ ๋.
- Bottom-Up ๋ฐฉ์ ์ฌ์ฉ ์์:
- ์ด๋ฏธ ์ ์๋ ์์คํ ์ด๋ ๋ชจ๋์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋, ๊ธฐ์กด ๋ชจ๋์ ์ธ๋ถ ์ฌํญ์ ๋จผ์ ๊ณ ๋ คํ๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋.
- ์ด๊ธฐ ๋จ๊ณ์์๋ ์ ์ฒด์ ์ธ ์์ด๋์ด๊ฐ ๋๋ ทํ์ง ์์ ๊ฒฝ์ฐ, ๋จผ์ ์์ ๋จ๊ณ๋ก ์์ํ์ฌ ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ณ ์ ํ ๋.
์ซ์ ์ผ๊ตฌ ๊ฒ์์ Bottom-Up ๋ฐฉ์์ผ๋ก ์ค๋ช ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Number(int value) → GameNumber(List<Number>) → GameNumberFactory(new GameNumber) ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด๋ค.
1~9์ฌ์ด์ ์ซ์๋ฅผ ๋ณด์ฅํ๋ Number๋ฅผ ๋จผ์ ๋ง๋ค๊ณ , ์ด Number ๋ฅผ ์ธ ์๋ฆฌ ์๋ก ๊ฐ์ง๊ฒ ๋๋ GameNumber๋ฅผ ๋ง๋ค๊ณ , ์ด GameNumber๋ฅผ ์์ฑํ๋ ์ญํ ์ธ GameNumberFactory ์์ผ๋ก ๊ตฌํํ๋ฉฐ ํ ์คํธ ํ๋ ๋ฐฉ์์ด๋ค.
๋๋ ์ด ๋ฐฉ์์ด ํต์ฌ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ํ์ํ ๋๋ฉ์ธ์ ๋ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ๋ ์ต๋ํ ๋น ๋ฅด๊ฒ ๋ฐ์ ์ ์๋ค ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ์์ ์ด์ฉํ๊ณ ์ ํ๋ค!
์ฆ, ์ค๊ณ๋ ์ค๋ธ์ ํธ์ ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด์์ ๋งํ๋ ๊ฒ์ฒ๋ผ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด์ ์์ํด์ Top-Down ์ ์ด์ฉํ๊ณ ,
๊ตฌํ์ ๋ฉ์์ง๋ฅผ ์ํํ ์ต์ ๋จ์๋ถํฐ ๊ตฌํํ๋ Bottom-Up์ ์ฌ์ฉํ๊ธฐ ์ด๋ค.
๋ํ, ์ด ๋ฐฉ์์ ์ฐ์ํ ATDD(1์๊ฐ 5๋ถ 30์ด~ 1์๊ฐ 9๋ถ)์์๋ ์๊ฐ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.
๊ทธ๋์, ๊นจ์ฐ์น ๋ฐฉ์์ ๋์ฑ ๋ ๋ฏฟ์์ด ๊ฐ๋ค.
์ต์ ๋จ์์ ๋๋ฉ์ธ์ด Number ์ธ์ง ์ด๋ป๊ฒ ์์ง? ๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค๋ฉด, ํ๋ฆฌ์ฝ์ค์์ ์๊ตฌํ๋ ๊ฐ์ฒด ๋ถ๋ฆฌ์ ํจ์ ๋ถ๋ฆฌ๋ฅผ ๊ณ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ผ๋ ๋ง์์ ๋๋ฆด ์ ์๋ค.
์ ๋ํ ์ด์ฌํ ๊ฐ์ฒด๋ถ๋ฆฌ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ , ํจ์๋ถ๋ฆฌ๋ฅผ ํ๋ค๋ณด๋ ๋๋ฉ์ธ์ ๋ํ ์ง์์ด ์์ฐ์ค๋ฝ๊ฒ ๋์ด๋ฌ๋ค.
(๋ฌผ๋ก , ์ซ์ ์ผ๊ตฌ ๊ฒ์๋ง 2์ฃผ๋์ ์ณ๋ค๋ด์ ๊ทธ๋ฐ ๊ฑฐ์ผ ์๋ ์๋ค๐)
๋๋ฉ์ธ ์ง์์ด ์ฝ๊ฒ ์ป์ด์ง์ง ์๋๋ค๊ณ ์๊ฐํ๋ค.
๊ฐ์ฒด ๋ถ๋ฆฌ๋ฅผ ํ๊ณ , ํจ์ ๋ถ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด ํฌ๋น๋์ด ์งํํ์ ๋ฆฌํฉํ ๋ง ์์๋ง ์ ๋ง 7๋ฒ ์ด์์ ๋ณธ ๊ฒ ๊ฐ๋ค.
* 7๋ฒ์ ๋ณด๋ฉด์ ๋๋ ๊ฒ์ด '์๋ ๋งํผ ๋ณด์ธ๋ค' ๋ผ๋ ๋ง์ฒ๋ผ ์๋ ๊ฒ์ด ์์ผ์๋ก ๋๊ฐ์ ์์์ด์์ง๋ง ์ป๋ ๊ฒ์ด ๋งค๋ฒ ๋ฌ๋ผ์ก๋ค.
์ด ์ธ์๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฐพ๊ณ , ์ฝ๋๋ฅผ ์ฝ๊ณ , ๊ฐ์ข ์์์ ๋ณด๋ฉฐ ๋๋ฉ์ธ ์ง์์ ์ป๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ค.
โ ๋๊ณ ๋์ ์ข์ ์ค๊ณ์ ์ ๋ต์ ์๋ค๋ฅผ ๋ค์ ํ ๋ฒ ์๊ฒ ๋์๋ค.
ํต์ฌ ๊ธฐ๋ฅ๋ถํฐ ๊ตฌํํ๊ธฐ ์ํด ์ฐพ๋ ๊ณผ์ ์์ ์๊ฒผ๋ ์ข์ ์ค๊ณ๋ ๋ฌด์์ผ๊น?
์ ๋ต์ ์ฐพ๊ณ ์ ๋ ธ๋ ฅํ์ง๋ง ๊ฒฐ๋ก ์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. ์ ๋ต์ ์๋ค.
์ค๋ธ์ ํธ์์๋, ์กฐ์ํธ๋์ ์ธ๋ฏธ๋ ์์์์๋ ์ฝ๋์ ์ ๋ต์ ์๋ค๊ณ ํ๋ค.
์ข์ ์ค๊ณ๋ฅผ ์ํ ์ ๋ต์ ์๊ณ , ๋จ์ง ์ฝ๋๋ trade-off์ ์ฐ๋ฌผ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฒ์ ๊ฐ์ํ๊ณ ์ด๋ค ๊ฒ์ ๋๋ฆด ๊ฑด์ง ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ๊ทธ์ '์ ์ ํ๊ฒ' ํด์ผํ๋ค๊ณ ํ๋ค.
* trade-off : ๋ ๊ฐ์ง ์ด์์ ๋๋ฆฝ์ ์ธ ์์๋ ๊ฐ์น ์ฌ์ด์์ ๊ท ํ์ ๋ง์ถ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด๋ค ํ ๊ฐ์ง๋ฅผ ์ป๊ธฐ ์ํด์๋ ๋ค๋ฅธ ์ธก๋ฉด์์ ์ด๋ค ๊ฒ์ ํฌ๊ธฐํด์ผ ํ๋ ์ํฉ
์ด '์ ์ ํ๊ฒ' ๋ ์ฃผ๊ด์ ์ธ ๋จ์ด๋ ์ข์ ์ฝ๋, ์ข์ ์ค๊ณ๋ฅผ ํ๊ณ ์ถ์ดํ๋ ๊ฐ์ฒด์งํฅ ์ ๋ฌธ์์ธ ๋ด๊ฒ ๋์์ด ๋์ง ์์๋ค.
ํ์ง๋ง, ์ง๊ธ์ "์ค๊ณ๋ ์ ์ ํด์ผํ๋ค"๋ ๋ง์ ์ ์ฐจ ๊ณต๊ฐํ๊ณ ์๋ค.
๊ทธ๋ฆฌ๊ณ , '์ ์ ํ๊ฒ'๋ผ๋ ๋ง์ ๊ณต๊ฐํ๊ธฐ ์์ํ ๋!! ๋น๋ก์ ์ข์ ์ค๊ณ๋ฅผ ์์ํ ์ ์๋ค๊ณ ์๊ฐ์ด ๋ ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ ํ๊ฒ ์ค๊ณ๋ฅผ ํ๊ธฐ ์ํด ๋ด๊ฐ ๋ ธ๋ ฅ ํ ์ ์๋ ๊ฒ์ ์๊ฐํด๋ดค๋ค.
1. '์ฝ๋๋ฅผ ์ ์ด๋ ๊ฒ ์งฐ๋๊ฐ?' ๋ฅผ ์๋ ๊ฒ. ์ค์ค๋ก์ ์ฝ๋๋ฅผ ์ค๋ช ํ ์ ์์ด์ผ ํ๋ค.
2. "๊ณ ๋ฏผ ๋์ ๊ฒฐ์ ํ ๋ด ์ค๊ณ๊ฐ ์ณ์!!" ๋ผ๋ ์๊ฐ ๋ฒ๋ฆฌ๊ธฐ. ๋ค๋ฅธ ์ฌ๋์ ์๊ฒฌ์ ๋ฌผ์ด ๋ค์ํ ๊ด์ ์ ์ป๊ธฐ
3. ์๋ก์ด ์ค๊ณ ๋ฐฉ์์ ๋ฐฐ์ธ ๋, ๋ด ๊ธฐ์กด ์ค๊ณ ๋ฐฉ์๊ณผ ๋น๊ตํด์ ์๋ก์ด ๋ฐฉ์์ ๋์ ํ๋ฉด ์ด๋ค ์ฅ์ ์ด ์์์ง ๊ผญ!! ์๊ฐํด๋ณด๊ธฐ
(๋ถํธ์บ ํ์์ ์ค๋ฌด ํ์ ์๋ค์๊ฒ ํผ๋๋ฐฑ ๋ฐ๋๊ฒ ์ต๊ณ ๊ฒ ์ง๋ง.. ๋ชป๋ฐ๋๋ค๋ฉด ๋ชป๋ฐ๋๋๋ก ์์ฝ์ง๋ง ๋์๊ฐ์ผ์ง!)
์ข์ ์ค๊ณ, ์ข์ ์ฝ๋๋ฅผ ์ํด โ ์ ๋ํด ์ค์ค๋ก ์๊ฐํ๊ณ ๊ธฐ์ค์ ๋ด๋ ค๋ณด์๋ค.
๊ธฐ์ค์ ๋ํ ์ ๋ต์ด ์์๊ธฐ์ ๊ธฐ์ค์ ๋ด๋ฆฌ๊ธฐ ๊น์ง ์ ๋ง ๋ง๋งํ์ง๋ง, ์ฝ์งํ ๋งํผ ์ฑ์ฅํ๋ค๋ ํ์ ์ด ๋ ๋ค!
๊ทธ๋ ๊ฒ ํต์ฌ ๊ธฐ๋ฅ๋ถํฐ ๊ตฌํํ๋ ๊ฒ์ ๋ํ ์๋ฏธ๋ฅผ ์ฐพ๋ ๊ณผ์ ์์ ๋ง์ ๊ฒ์ ๊นจ๋ซ๊ณ ์ป๊ฒ ๋์๋ค.