[๊ฐ๋ฐ์ ์ฑ ์ฝ๊ธฐ] ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ - ์ผํธ ๋ฒก (๋ชจ๋๋ฅผ ์ํ ํ๋ฑ)
ํด๋น ๊ธ์ Kent-Beck์ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ By Example ์ด๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ ์์ ํ์ธํด์ฃผ์ธ์.
ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ - Test Driven Development By Example (Kent-Beck)
- ์ธ์ฌ์ดํธ(insight)
- ์ง์์ด: Kent-Beck
- ์ฎ์์ด: ๊น์ฐฝ์ค, ๊ฐ๊ท์ญ
- ์ถ๊ฐ์ผ: 2014.02.15

๋ชจ๋๋ฅผ ์ํ ํ๋ฑ
์ฐ๋ฆฌ๋ Dollar ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒ๋ผ ์ฌ์ฉํ๊ณ ์๋ค.
์ด๋ฐ Dollar ๊ฐ์ฒด๋ฅผ VO ํจํด์ ์ ์ฉํ ๊ฐ์ฒด๋ผ๊ณ ํ๋ค.
ํด๋น ์ฅ์์๋ VO์ ๋ํ ๊ฐ๋
์ด ์ ๊น ๋ฑ์ฅํ๋ค.
TDD ์ผ๋ฐํ
- ์์ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ค.
- ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํด์ ํ ์คํธ๊ฐ ์คํจํ๋ ๊ฒ์ ํ์ธํ๋ค.
- ์กฐ๊ธ ์์ ํ๋ค.
- ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํด์ ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ ๊ฒ์ ํ์ธํ๋ค.
- ์ค๋ณต์ ์ ๊ฑฐํ๊ธฐ ์ํด์ ๋ฆฌํฉํ ๋ง์ ์ํํ๋ค.
Value Object
๊ฐ์ฒด ๊ฐ ํจํด์์ 2๊ฐ์ง ํน์ฑ์ด ์กด์ฌํ๋ค.
- ๋ถ๋ณ์ฑ
- ๋์ผ์ฑ
๋ถ๋ณ์ฑ
VO ํจํด์์ ๊ฐ์ฒด ๊ฐ์ด ์์ฑ์ด ๋๋ฉด ์ ๋๋ก setter๋ ํ๋กํผํฐ ๊ฐ ์ ๊ทผ์ ํตํด์ ์๋ก์ด ๊ฐ์ด ํ ๋น๋๋ฉด ์๋๋ค.
ํ ๋ฒ ์์ฑ์๋ก ์์ฑ๋์๋ค๋ฉด ๊ทธ ๊ฐ์ ๋ถ๋ณํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ํน์ ์ฐ์ฐ์ ์ํํ๋ค๋ฉด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ค
๋์ผ์ฑ
VO ํจํด์ ๋๋ค๋ฅธ ํน์ง์ค ํ๋๋ ๋์ผํ ๊ฐ์ฒด์ฌ์ผ ํ๋ค.
equals
์ฐ๋ฆฌ์ VO๊ฐ์ฒด๊ฐ VO๊ฐ ๋๋ ค๋ฉด ์์ 2๊ฐ์ง ์ํฉ์ ๋ง์กฑํด์ผ ํ๋ค.
์ฒซ ๋ฒ์งธ์ ํน์ฑ์ ์ด๋ฏธ ํ์ธ์ ํ๊ณ (์ง๋ ์๊ฐ์)
๋ ๋ฒ์งธ ํน์ฑ์ ์ง๊ธ ํ์ธํ๊ธฐ ์ํด์ equals ๋ฉ์๋๋ฅผ ์์ฑํ์
TDD ์ค๋ฝ๊ฒ
equals ๋ฉ์๋
@Test
public void testEquality() {
assertTrue(new Dollar(5).equals(new Dollar(5)));
}
class Dollar {
// ... ์๋ต
boolean equals(Dollar dollar) {
return true;
}
}
์ฒ์ assertTrue๋ฅผ ์คํํ๋ฉด ๋น์ฐํ ์คํจํ๋ ์ฝ๋๊ฐ ๋์ค๊ฒ ๋๋ค.
์ด์ ์ฑ๊ณตํ๋ Green ์ฌ์ดํด์ ๋ณด๊ธฐ ์ํด์ ๋น ๋ฅด๊ฒ return์ ์์ ๊ฐ์ด ์์ ํด์ฃผ์.
๋ฆฌํฉํ ๋ง ํ๊ธฐ ํ๋ค ๋ ์ฌ์ฉํ๋, ์ผ๊ฐ ์ธต๋ ๋ฐฉ๋ฒ
์ผ๊ฐ์ธก๋์ด๋ ์ด๋ค ํ ๋ผ๋์ค ์ก์ ๊ตญ์์ ๋ ๊ฐ์ ์์ ๊ตญ์ผ๋ก ๋ผ๋์ค๋ฅผ ์๋ฉด ์ก์ ๊ตญ์ ์ ํํ ์์น๋ฅผ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ฅผ ์ฝ๋์ ์ ์ฉ์์ผ๋ณด์.
testEquality() ์์๋ ๋ฌด์กฐ๊ฑด ํต๊ณผํ ์ ๋ฐ์ ์๋ค.
์๋๋ฉด ๋นจ๋ฆฌ green ์ฌ์ดํด์ ๋ณด๊ธฐ ์ํด์ ์ฃ์
์ ์ ์ง๋ ๊ธฐ ๋๋ฌธ์.
ํ์ง๋ง ์ด๊ฒ Code That Works. ๋์ํ๋ ์ฝ๋๊ฐ ๋๊ธฐ ์ํด์๋ ์ ์ ํ ๋ก์ง์ด ํ์ํ๋ค.
์ด๋ฅผ ์ผ๊ฐ ์ธต๋ ๋๋์ผ๋ก, assertTrue์ assertFalse๋ ์ถ๊ฐ์์ผ๋ณด์.
@Test
public void testEquality() {
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(10)));
}
ํ
์คํธ์ ์คํจํ๋ค.
์๋๋ฉด ์ฐ๋ฆฌ๊ฐ equal ๋ฉ์๋๋ ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฐํํ๊ฒ ํ๊ธฐ ๋๋ฌธ.
์ด์ ํ
์คํธ์ ์ฑ๊ณตํ๊ธฐ ์ํด์๋ ์ค์ ๋ก์ง์ด ๋ค์ด๊ฐ ์ฝ๋๋ฅผ ์ง์ผ ํ๋ค.
์ผ๊ฐ ์ธก๋์ ๋ํ ์ผํธ ๋ฒก์ ์๊ฐ
์ผ๊ฐ ์ธก๋์ ์ฌ์ค ์ค๋ณต๋๋ ์ฝ๋๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์๋ค.
์๋๋ผ๋ฉด ํ
์คํธ๋ฅผ ํ ๋ฒ์ ํต๊ณผ์ํค๊ณ ์ ๋์ํ๋ ์ฝ๋๋ฅผ ์ง๋๊ฒ ๋ง์ง๋ง, ๊ทธ๋ ์ง ๋ชปํ ๊ฒฝ์ฐ๋ ๋ฐ์ํ๋ค.
์ผํธ ๋ฒก์ ์ผ๊ฐ ์ธก๋์ด ํญ์ ์ฐ์ด๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ผญ ํ์ํ ๋ (๋ฆฌํฉํ ๋ง์ ์ด๋ป๊ฒ ์ํํด์ผํ ์ง ์๊ฐ์ด ๋์ง ์์ ๋ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ํ๋ค.)