๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- ๊ธฐํƒ€

[๊ฐœ๋ฐœ์ž ์ฑ…์ฝ๊ธฐ] ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ - ์ผ„ํŠธ ๋ฒก (๋ชจ๋‘๋ฅผ ์œ„ํ•œ ํ‰๋“ฑ)

by Wonit 2021. 4. 10.

ํ•ด๋‹น ๊ธ€์€ Kent-Beck์˜ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ By Example ์ด๋ผ๋Š” ์ฑ…์„ ์ฝ๊ณ  ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ ํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ YES 24 ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ - Test Driven Development By Example (Kent-Beck)

  • ์ธ์‚ฌ์ดํŠธ(insight)
  • ์ง€์€์ด: Kent-Beck
  • ์—ฎ์€์ด: ๊น€์ฐฝ์ค€, ๊ฐ•๊ทœ์—ญ
  • ์ถœ๊ฐ„์ผ: 2014.02.15

๋ชจ๋‘๋ฅผ ์œ„ํ•œ ํ‰๋“ฑ

์šฐ๋ฆฌ๋Š” Dollar ๊ฐ์ฒด๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.
์ด๋Ÿฐ Dollar ๊ฐ์ฒด๋ฅผ VO ํŒจํ„ด์„ ์ ์šฉํ•œ ๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค.
ํ•ด๋‹น ์žฅ์—์„œ๋Š” VO์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์ž ๊น ๋“ฑ์žฅํ•œ๋‹ค.

TDD ์ผ๋ฐ˜ํ™”

  1. ์ž‘์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  2. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.
  3. ์กฐ๊ธˆ ์ˆ˜์ •ํ•œ๋‹ค.
  4. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.
  5. ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Value Object

๊ฐ์ฒด ๊ฐ’ ํŒจํ„ด์—์„œ 2๊ฐ€์ง€ ํŠน์„ฑ์ด ์กด์žฌํ•œ๋‹ค.

  1. ๋ถˆ๋ณ€์„ฑ
  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๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ.
์ด์ œ ํ…Œ์ŠคํŠธ์— ์„ฑ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹ค์ œ ๋กœ์ง์ด ๋“ค์–ด๊ฐ„ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค.

์‚ผ๊ฐ ์ธก๋Ÿ‰์— ๋Œ€ํ•œ ์ผ„ํŠธ ๋ฒก์˜ ์ƒ๊ฐ

์‚ผ๊ฐ ์ธก๋Ÿ‰์€ ์‚ฌ์‹ค ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
์›๋ž˜๋ผ๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ํ†ต๊ณผ์‹œํ‚ค๊ณ  ์ž˜ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๊ฒŒ ๋งž์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ๋ชปํ•  ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•œ๋‹ค.
์ผ„ํŠธ ๋ฒก์€ ์‚ผ๊ฐ ์ธก๋Ÿ‰์ด ํ•ญ์ƒ ์“ฐ์ด๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ํ•„์š”ํ•  ๋•Œ (๋ฆฌํŒฉํ† ๋ง์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผํ• ์ง€ ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š์„ ๋–„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.)

๋Œ“๊ธ€