OKKYCON2018 The Real TDD

ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ - ์ •์ง„์šฑ๋‹˜

ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ž€?

  • ๊ฐ™์€ ์ž…๋ ฅ์— ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ - Deterministic
    • ํ•ญ์ƒ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ž€?
      • ์‹œ๊ฐ„์— ์˜ํ•ด ๊ฒฐ๊ณผ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ํ•จ์ˆ˜.
        • ์˜ค๋Š˜ ๋‚ ์งœ๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
      • DB์˜ ์˜ํ•ด ๊ฒฐ๊ณผ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ํ•จ์ˆ˜.
        • ์ „์ฒด ํšŒ์›์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ - No side effect
    • ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ž€?
      • Console.WriteLine(result);

ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ• ๊นŒ?

  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
    • Email : @๊ฐ€ ํฌํ•จ๋˜์—ˆ๋Š”๊ฐ€?
    • ์ด๋ฆ„ : ์ˆซ์ž๊ฐ€ ํฌํ•จ๋˜์—ˆ๋Š”๊ฐ€?
    • ConferenceId : ์Œ์ˆ˜์ธ๊ฐ€?
  • ์ด๋ฏธ ๋“ฑ๋ก๋œ ์ขŒ์„ ์ˆ˜ DB์—์„œ ์ฝ์–ด์˜ค๊ธฐ
  • ์š”์ฒญํ•œ ์ขŒ์„ ์ˆ˜๊ฐ€ ํ™•๋ณด ๊ฐ€๋Šฅํ•œ์ง€ ํŒ๋‹จํ•˜๊ธฐ
    • ์ž”์—ฌ ์ขŒ์„์ˆ˜(์ „์ฒด ์ขŒ์„ ์ˆ˜ - ๋“ฑ๋ก๋œ ์ขŒ์„ ์ˆ˜) >= ์š”์ฒญํ•œ ์ขŒ์„์ˆ˜
    • ํ•œ๊บผ๋ฒˆ์— 10์ขŒ์„์„ ์ดˆ๊ณผํ•ด์„œ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋“ฑ๋ก ์ •๋ณด ์ €์žฅ
  • HTTP ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

์œ„ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„ ์–ด๋Š ๊ณณ์ผ๊นŒ?

  • ์ด๋ฏธ ๋“ฑ๋ก๋œ ์ขŒ์„ ์ˆ˜ DB์—์„œ ์ฝ์–ด์˜ค๊ธฐ
    • DB๋Š” ํ•ญ์ƒ ๊ฐ™์€ ์ž…๋ ฅ(Query)์— ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋“ฑ๋ก ์ •๋ณด ์ €์žฅ

์™ธ๋ถ€ ์ƒํƒœ์— ์˜์กด์ ์ธ ์ฝ”๋“œ.

์–ด๋–ป๊ฒŒ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ• ๊นŒ?

  • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ์™€ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์ž.
    • ์™ธ๋ถ€ ์ƒํƒœ์— ์˜์กด์ ์ธ ๋ถ€๋ถ„์ด ์–ด๋””์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜์ž.
      • DB๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ถ€๋ถ„
      • ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ํ…Œ์ŠคํŠธ.
  • ์™ธ๋ถ€ ์ƒํƒœ์— ์˜์กด ์ ์ด์ง€ ์•Š๋Š” ์ฝ”๋“œ
    • ์ฆ‰ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์—

ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๊ฐ€ ๋งŒ๋‚˜๋Š” ๋ถ€๋ถ„์„ ์ตœ๋Œ€ํ•œ end-point(controller) ์ชฝ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.

TDD ๋ง›๋ณด๊ธฐ

์ด๋ฉ”์ผ์—_๊ณจ๋ฑ…์ด๊ฐ€_์—†์œผ๋ฉด_์œ ํšจํ•˜์ง€_์•Š์€_ํ˜•์‹์ž…๋‹ˆ๋‹ค(){
    //Arrange
    var sut = new ConferenceRegistration{Email = "nesoy.gmail.com"};
 
    //Act
    string actual = sut.validate();
 
    //Assert
    Assert.Notnull(actual);
}

TDD๋กœ Code๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฃผ์˜ํ•  ์ .

  • ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๋งŒํผ๋งŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž.
    • ๊ทธ ์ด์ƒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ํ…Œ์ŠคํŠธ๋กœ ์ปค๋ฒ„ํ•  ์ˆ˜ ์—†๋‹ค.
    • ์ฆ‰ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„์„ ๋†“์น  ์ˆ˜ ์žˆ๋‹ค.
    • ์ž‘๊ฒŒ ์ž‘๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜๊ณ  Coverํ•˜์ž.

๋‘ ๋ถ€๋ฅ˜ ์ฝ”๋“œ(ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ, ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ)๊ฐ€ ๋งŒ๋‚˜๋Š” Edge์—์„œ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋Š”๊ฐ€?

  • ์ˆ˜๋™ ํ…Œ์ŠคํŠธ
    • curl, Postman
  • ์ž๋™ ํ…Œ์ŠคํŠธ
    • DB์— ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ 
    • POST๋กœ API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Mock ์‚ฌ์šฉ ํ•œ๋‹ค๋Š” ๊ฑด?

  • ์ž‘์„ฑ๋œ ์ฝ”๋“œ์‚ฌ์šฉ์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Mock์„ ํ†ตํ•ด ์ด์Œ์ƒˆ(Seam) ๋„์ž…
  • ํ–‰์œ„ ๊ฒ€์ฆ(mock)
    • ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”๊ฐ€?
    • ์ถ”์ƒํ™”๊ฐ€ ํ•„์š”ํ•จ. โ†’ ๋ถˆํ•„์š”ํ•œ ์ถ”์ƒํ™”๊ฐ€ ํ•„์š”
    • Outside-in
  • ์ƒํƒœ ๊ฒ€์ฆ(value)
    • ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ฌด์—‡์ธ๊ฐ€?
    • ๋ถˆํ•„์š”ํ•œ ์ถ”์ƒํ™” ํ•„์š”์—†์Œ.
    • ๊ตฌํ˜„๋œ ์ฝ”๋“œ์—๋งŒ ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”.
    • Inside-out

Mock์˜ ๋‹จ์ ์€ ๋ฌด์—‡์ผ๊นŒ?

  • Mock์ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šฐ๋‹ˆ ๋‚จ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.
    • ๋Œ€๋ถ€๋ถ„ Mock ์‚ฌ์šฉ ์˜ˆ์ œ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์žฅ์ ์ด ํฌ๊ฒŒ ๋ณด์ธ๋‹ค.
    • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋ฉด ํ•œ๊บผ๋ฒˆ์— ๋งŽ์€ ์ˆ˜์˜ Mock์„ ๋‹ค๋ฃจ๋ฉด์„œ ๊ณค๋ž€์„ ๊ฒช๋Š”๋‹ค.
  • ์ ๋‹น ์ˆ˜์˜ Mock ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋‹ต์„ ์ฐพ๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋•Œ๋กœ๋Š” ์ƒํƒœ ๊ฒ€์ฆ์œผ๋กœ ๋Œ์•„๊ฐ€๋ณด์ž.

Mock์„ ๋Œ€์‹ ํ•˜์—ฌ ์ƒํƒœ ๊ฒ€์ฆ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€?

  • TDD๋ฅผ ํ†ตํ•œ ์‚ฌ์ „์ด ์•„๋‹ˆ๋ผ ์‚ฌํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ž.
  • ๋‚œํ•ดํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตณ์ด ์–ด๋ ค์šด ๊ธธ์„ ํƒํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค.
  • ์™„๋ฒฝ์„ ์ถ”๊ตฌํ•˜๋ฉด์„œ Mock์„ ์‚ฌ์šฉํ•˜๋Š” ๋น„์šฉ์„ ๋“ค์ผ ํ•„์š”๊ฐ€ ์žˆ๋Š”๊ฐ€?

์ •๋ฆฌํ•˜์ž๋ฉด?

  • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ž€?
    • ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    • ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ
  • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ
    • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ์™€ ์–ด๋ ค์šด ์ฝ”๋“œ ๋ถ„๋ฆฌ
    • ๋‘ ๋ถ€๋ฅ˜์˜ ์ฝ”๋“œ๋Š” ์ตœ๋Œ€ํ•œ ๊ฐ€์žฅ ์ž๋ฆฌ์— ์œ„์น˜(์˜ˆ์™ธ: ๋กœ๊น…, ํผ์‚ฌ๋“œ)
    • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋งŒ๋‚˜๊ฒŒ ๋งŒ๋“ค์ž.
      • endpoint

Reference

ํ›„๊ธฐ

  • ๊ณผ๋„ํ•œ Mock์€ ์ •๋‹ต์ด ์•„๋‹Œ๋“ฏ ํ•˜๋‹ค.
  • Mock๊ณผ ์ƒํƒœ ๊ฒ€์ฆ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ Point๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ - ๋ฐ•์žฌ์„ฑ๋‹˜

  • TDD < Refactoring

์˜์‹์ ์ธ ์—ฐ์Šต์ด๋ž€?

  • ๋ฌด์กฐ๊ฑด ์—ฐ์Šต์„ ๋งŽ์ด ํ•œ๋‹ค๊ณ  ์ž˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
    • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ๋ˆˆ
    • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฐ(sense)
    • ๋ชฉ์  ์˜์‹ ์žˆ๋Š” ์—ฐ์Šต์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ๋Š๋ƒ?
      • 1๋งŒ ์‹œ๊ฐ„์˜ ์žฌ๋ฐœ๊ฒฌ
    • ๊ตฌ์ฒด์ ์ธ ๋ชฉํ‘œ ์„ธ์šฐ๊ณ  ์‹คํ–‰ํ•˜๊ธฐ
    • ํ”ผ๋“œ๋ฐฑ๊ณผ ํ”ผ๋“œ๋ฐฑ์— ๋”ฐ๋ฅธ ํ–‰๋™ ๋ณ€๊ฒฝ์„ ์ˆ˜๋ฐ˜

์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šต ๊ณผ์ •

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์—ฐ์Šต
    • ์‚ฌ์šฉํ•˜๋Š” API ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๊ธฐ ์œ„ํ•œ ํ•™์Šต ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์‹œ์ž‘
    • xUnit์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ๋‹ค.
    • ์‚ฌ์šฉํ•˜๋Š” API์— ๋Œ€ํ•œ ํ•™์Šต ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.
    • input๊ณผ output์ด ๋ช…ํ™•ํ•œ ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ(๋ณดํ†ต util ์„ฑ๊ฒฉ์˜ ๋ฉ”์†Œ๋“œ)
  • TDD ์—ฐ์Šต
    • ํ† ์ด ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ
    • ์˜์กด๊ด€๊ณ„๊ฐ€ ์—†๋Š” ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ
  • Refactoring ์—ฐ์Šต
    • Method ๋ถ„๋ฆฌํ•˜๊ธฐ
    • Depth๊ฐ€ 2๋‹จ๊ณ„ ์ด์ƒ
    • Else๋ฅผ ์•ˆ ์“ฐ๋Š” ์—ฐ์Šต
    • Method๋Š” ํ•ญ์ƒ SRP๋ฅผ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

ํ•œ ๋ฒˆ์— ํ•œ ๊ฐ€์ง€ ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ์Šตํ•˜๋ผ. ์—ฐ์Šต์€ ๊ทน๋‹จ์ ์ธ Rule์„ ์„ธ์›Œ ์—ฐ์Šตํ•˜๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค. ๊ทธ๋ž˜์•ผ insight๋„ ์ƒ๊ธด๋‹ค.

๊ทน๋‹จ์ ์ธ Rule์ด๋ผ๋ฉด?

  • ์ผ๊ธ‰ Collection๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ.
  • 3๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
  • ์ ์ง„์ ์œผ๋กœ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ถ”๊ฐ€๋ฅผ ํ†ตํ•œ ๋‚œ์ด๋„ ๋†’์ด๊ธฐ

  • ์•ž ๋‹จ๊ณ„ ์—ฐ์Šต์„ ์ž˜ ์†Œํ™”ํ–ˆ๋‹ค๋ฉด ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ์™€ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์—ฐ์Šตํ•˜๊ธฐ
  • ATDD ๊ธฐ๋ฐ˜์œผ๋กœ ์‘์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ
  • ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ Refactoring

Book

Question

  • comfort zone์„ ๋‚˜์˜ค๋Š” ๋…ธํ•˜์šฐ๋Š” ์žˆ์œผ์‹ ์ง€?
    • ์‹œ๊ฐ„๊ณผ ๋งˆ์Œ์ ์ธ ์—ฌ์œ  ํ™•๋ณดํ•˜๊ธฐ.
    • ํ™•๋ณดํ•œ ์‹œ๊ฐ„๊ณผ ์—ฌ์œ ๋กœ ์˜์‹์ ์ธ ์—ฐ์Šตํ•˜๊ธฐ.
  • ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ๋ณ€๊ฒฝ ๋˜ํ•œ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
    • ์ œ๋Œ€๋กœ ์„ค๊ณ„๊ฐ€ ์•ˆ๋œ ๊ฒฝ์šฐ.
      • ์„ค๊ณ„์— ๋‹ค์‹œ ๊ณ ๋ฏผํ•˜๊ณ  ์ƒ๊ฐํ•˜๊ธฐ.
    • ๋ณ€๊ฒฝ์ด ํ•œ ๊ณณ์œผ๋กœ ์ง‘์ค‘๋˜์–ด์•ผ ํ•œ๋‹ค.

ํ›„๊ธฐ

  • ๊ฐ€์žฅ ์žฌ๋ฐ‹๊ฒŒ ๋“ฃ๊ณ  ์ดํ•ด์™€ ๊ณต๊ฐ์ด ๋งŽ์ด ๊ฐ€๋Š” ๊ฐ•์˜์˜€๋‹ค.
  • ์‹œ๊ฐ„์ด ๊ดœ์ฐฎ๋‹ค๋ฉด Toy Project๋กœ ์‹œ์ž‘ํ•ด๋ด์•ผ๊ฒ ๋‹ค.
    • ์šฐ์„  ์‹œ๊ฐ„๊ณผ ์—ฌ์œ  ํ™•๋ณดํ•˜๊ธฐ.

์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ - ํ•œ์„ฑ๊ณค๋‹˜

TDD๋ž€?

  • Fail Test
  • Write Production Code
  • Refactoring

From Test

  • ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ž์‹ ๊ฐ
  • ํšŒ๊ท€ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ์ž์œ ๋กœ์šด ๋ฆฌํŒฉํ† ๋ง
  • ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ง€์‹์ด ์ฆ๊ฐ€
  • ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ

From Test-first

  • ๊ณผ๋„ํ•œ ์„ค๊ณ„๋ฅผ ํ”ผํ•˜๊ณ , ๊ฐ„๊ฒฐํ•œ interface๋ฅผ ๊ฐ€์ง
  • ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ(Gold-Plating)์„ ์ค„์ž„
  • ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฌธ์„œ(Executable documents)๋ฅผ ๊ฐ€์ง
  • ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ž„

TDD Metric

  • Software Quality

    • External Quality + Internal Qulity
  • Internal Qulity

    • Coding Rules : ๊ฐœ๋ฐœ ํ‘œ์ค€ ๋ฐ ๊ธฐ๋ณธ์ ์ธ ๊ด€๋ก€ ์ค€์ˆ˜
    • Potential Bugs : Inspection์„ ํ™œ์šฉํ•œ ์ ๊ฒ€
    • Comments : ์ ์ •ํ•œ ์ฃผ์„, Public Method๋งŒ ํ™•์ธ
    • Duplication : DRY
    • Complexity : ์ ์ ˆํ•œ ๋ถ„ํฌ
    • Unit Tests : Lack of Unit Test

ํ›„๊ธฐ

  • ์ƒ๊ฐ๋ณด๋‹ค ์ธก์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค์–‘ํ•˜๊ณ  ์ธก์ •ํ•˜๋Š” Metric ๋˜ํ•œ ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค.
  • ๋‹จ์ˆœํžˆ Coverage๊ฐ€ ๋†’๋‹ค๊ณ  ์ข‹์€ Software๋Š” ์•„๋‹ˆ๋ผ๊ณ  ๋ง์”€ํ•ด์ฃผ์‹ ๊ฒŒ ๊ธฐ์–ต์ด ๋‚จ๋Š”๋‹ค.

ํ…Œ์•Œ๋ชป ์‹ ์ž…์€ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ์„๊นŒ? - ์ดํ˜œ์Šน๋‹˜

  • ์ด๋ฏธ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

    • ์ˆœ์ˆ˜ ํ•จ์ˆ˜
    • ์™ธ๋ถ€ ์˜์กด์„ฑ(Dependency)์ด ์—†๋Š” ํ•จ์ˆ˜.
    • utility, helper
  • ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ์ฝ”๋“œ์—์„œ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ๋งŒ ๋ถ„๋ฆฌํ•˜๊ธฐ

    • ์ค‘์š”๋„๊ฐ€ ๋†’์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํฌํ•จ๋œ ๋ถ€๋ถ„
    • ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๋ถ€๋ถ„(๊ณผ๊ฑฐ X)
    • ๊ฒฐํ•ฉ์ด ๋‚ฎ๊ณ  ๋…ผ๋ฆฌ๋Š” ๋ณต์žกํ•œ ๋ถ€๋ถ„
  • ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด Parameter๋กœ ์ž‘์„ฑํ•˜๊ธฐ.

  • ์ค‘์š”๋„๊ฐ€ ๋†’์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ.

TDD์˜ ์ข‹์€ ์ ์€?

  • ๋ถˆ์•ˆ๊ฐ์ด ์ œ๊ฑฐ๋œ๋‹ค.
  • ์ŠคํŽ™ ๋ฌธ์„œ ๊ฐ€๋Šฅ
    • ์‹ค์ œ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ญ๊ฐ€ ์žˆ๋Š” ์ง€, ๋ฐ˜ํ™˜ ๊ฐ’์€ ์–ด๋–ค ๋ชจ์–‘์ธ์ง€ ๋“ฑ ์ŠคํŽ™์„ ํ™•์ธํ•  ๋•Œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ด…๋‹ˆ๋‹ค.
  • ๋””์ž์ธ ๊ฐœ์„  ํšจ๊ณผ
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋””์ž์ธ ์ƒ์˜ ๊ฒฐ์ ์„ ๊ฝค ์ž์ฃผ ๋ฐœ๊ฒฌ
  • ํ•™์Šต ๋™๊ธฐ๋ถ€์—ฌ
  • ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ
    • ๋ฒ„๊ทธ๋ฅผ ์ถ”์ ํ•˜๋Š” ์‹œ๊ฐ„์ด ํ˜„์ €ํ•˜๊ฒŒ ์ค„์–ด๋“ค์–ด์š”.
    • ํ…Œ์ŠคํŠธ ์•ˆ ํ•ด์„œ ์•„๋‚€ ์‹œ๊ฐ„ โ‡ ํ…Œ์ŠคํŠธ ์•ˆ ํ•ด์„œ ๋‚˜์˜จ ๋ฒ„๊ทธ ๊ณ ์น˜๋Š” ์‹œ๊ฐ„
  • ํ”„๋กœ์ ํŠธ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ํ—ˆ์ ์„ ์‚ฌ์ „์— ๋ฐœ๊ฒฌํ•˜๊ธฐ๋„ ํ•ด์š”
  • ์ง‘์ค‘๋ ฅ ํ–ฅ์ƒ
    • ๋™์‹œ์— ํ•œ ๊ฐ€์ง€ ์ด์ƒ์˜ ์ผ์„ ํ•˜์ง€ ์•Š๋„๋ก ํ†ต์ œํ•ด์ค€๋‹ค.

TDD๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์‹ค์ˆ˜๋Š”?

  • ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์˜ค๋ฅ˜
    • ๋น„์ฆˆ๋‹ˆ์Šค์™€ ๊ด€๋ จ๋œ ๋ฒ„๊ทธ๋ฅผ ๋‚ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๊ฑฐ๋‚˜ ์—†๊ณ ,
    • ํ…Œ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•จ์œผ๋กœ์จ ์–ป๋Š” ์ด์ต < ํ…Œ์ŠคํŠธ ์œ ์ง€์™€ ๊ด€๋ฆฌ์— ๋“œ๋Š” ๋น„์šฉ์ผ ๋•Œ
    • ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹จ์–ธํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ๊ฐ€์น˜๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹๋•Œ๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฒ€์ฆ๋ ฅ์ด ๋–จ์–ด์ง€๋Š” ํ…Œ์ŠคํŠธ
    • ์ž˜๋ชป๋œ ๊ฒ€์ฆ.
    • ์ฐจ๋ผ๋ฆฌ ์•ˆํ•˜๋Š”๊ฒŒ ๋‚ซ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ฅผ ์•ž์„œ๊ฐ€๋Š” ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ
    • ์•ž์„œ๋‚˜๊ฐ€๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋นˆํ‹ˆ์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.
    • ๋นˆํ‹ˆ์„ ํ†ตํ•ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ.
  • ํ•จ์ˆ˜๊ฐ€ ๊ณณ๊ณณ์— ํผ์ง€๊ฒŒ ๋œ๋‹ค.
    • ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋Š” ์–ป์—ˆ์ง€๋งŒ ๋†’์€ ์‘์ง‘๋ ฅ์€ ์–ป์ง€ ๋ชปํ–ˆ๋‹ค.

๋ฌด์—‡์„ ๊ฒ€์ฆํ•  ๊ฒƒ์ธ๊ฐ€?

  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜๋ฅผ ์ฃผ๋Š” ๋ถ€๋ถ„์„ ํ…Œ์ŠคํŠธ ํ•˜์ž.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ์ฝ”๋“œ. ๊ฐœ์„ ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•œ๋‹ค.

ํ›„๊ธฐ

  • ๋น„์Šทํ•œ ๊ฒฝํ—˜๋„ ํ–ˆ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์— ์•ž์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜๋ฅผ ์ฃผ๋Š” ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…๋„ ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ณด๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์‹ค์ฒœ ๋ฐฉ๋ฒ•, ํšจ๊ณผ - ์–‘์™„์ˆ˜๋‹˜

  • ๊ท€์ฐฎ์€ ๊ฒƒ.

  • ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ.

    • ์ˆจ๊ฒจ์ง„ ๋ณธ์งˆ
    • ํ…Œ์ŠคํŠธ ์š•์‹ฌ์Ÿ์ด
      • ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜
      • ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๋Š” ์˜ค์ง ํ•œ ๊ฐ€์ง€๋งŒ ๋˜‘๋ฐ”๋กœ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•˜๋Š”์ง€? ์ธ์ง€๋Šฅ๋ ฅ์˜ ๊ณผ๋ถ€ํ™”
      • ํฉ์–ด์ง„ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ
      • ๋งค์ง๋„˜๋ฒ„
    • ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง€๊ธฐ ์‰ฌ์šด ๊ฒƒ๋“ค
      • ๋†’์€ ๊ฒฐํ•ฉ
      • ๋‚ฎ์€ ์‘์ง‘
  • ์ถ”์ƒ์ด๋ž€?

    • ๋ฌธ๋งฅ(Context) ์œ„์—์„œ ์˜ค์ง ๊ด€์‹ฌ ์žˆ๋Š” ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ.
  • ์ˆจ๊ฒจ์ง„ ๋ณธ์งˆ

    • ๋‚ฎ์€ ์ถ”์ƒํ™”
    • ๋“ค์ญ‰๋‚ ์ญ‰ํ•œ ์ถ”์ƒํ™”
    • ๋Š์–ด์ง„ ๋…ผ๋ฆฌ
    • ์•Œ ์ˆ˜ ์—†๋Š” ์˜๋„

Reference

ํ›„๊ธฐ

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ฐœ์„ ํ•ด๋‚˜๊ฐ€๋Š” ๋ชจ์Šต์ด ์ธ์ƒ์ ์ด์˜€๋‹ค.

๋‹น์‹ ์˜ TDD๊ฐ€ ํ•ญ์ƒ ์‹คํŒจํ•˜๋Š” ์ด์œ  - ์ด๊ทœ์›๋‹˜

์šฐ๋ฆฌ๊ฐ€ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ

  • ์™ธ๋ถ€ ์„ธ์ƒ
    • ํ˜„์‹ค ์„ธ๊ณ„
    • ์ธํ”„๋ผ
    • ์™ธ๋ถ€ ์„œ๋น„์Šค
    • ๋ ˆ๊ฑฐ์‹œ

์„ค๊ณ„

  • ๋‚ฎ์€ ๊ฒฐํ•ฉ

  • ๋†’์€ ์‘์ง‘

  • ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ณดํ˜ธ

  • ์ •๋ณด ์ˆจ๊น€(information hiding)

    • ์–ด๋ ค์šด ์„ค๊ณ„ ๊ฒฐ์ •๊ณผ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ์„ค๊ณ„ ๊ฒฐ์ •๋“ค์„ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธฐ๋Š” ๊ฒƒ.
    • ์ธํ„ฐํŽ˜์ด์Šค ํ…Œ์ŠคํŠธ
  • ๋ฐ˜๋ณต ์ฃผ๊ธฐ

    • ๊ณ„ํš
    • ์‹คํ–‰
    • ํ‰๊ฐ€
  • ๊ณต์œ ํ•˜๋Š” ๋ฌธํ™”

    • ๋ชฉํ‘œ
    • ์ง€์‹
  • ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ํ”Œ๋žซํผ

    • ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•œ๋‹ค.

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผ๋˜์ง€๋งŒ ํ•ญ์ƒ ์•ˆ์ „ํ• ๊นŒ?

  • ํ•ญ์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ์— ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋„ ํ•„์š”ํ•˜๋‹ค.
    • ๋ฉ”๋‰ด์–ผ ํ…Œ์ŠคํŠธ
    • ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
  • ์™ธ๋ถ€ ์—ฐ๋™ ํ…Œ์ŠคํŠธ์ธ ๊ฒฝ์šฐ?
    • Fake Service๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ง„ํ–‰

ํ›„๊ธฐ

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ๋Š” ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„๋„ ์žˆ๋Š” ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์ง์ ‘๋ณด๊ฒŒ ๋˜์–ด ๊ธฐ์˜๋‹ค.
    • ์‚ฌ๋‚ด์—์„œ๋„ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ์กฐ์–ธ์„ ๋งŽ์ด ํ•ด์ฃผ์…จ๋‹ค.

Q & A

์™œ TDD๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

  • ๋‚˜๋ฅผ ์œ„ํ•ด์„œ ํ•˜์ž.
  • ์ „ํŒŒํ•˜๋Š” ๊ฑด ๋‚˜์ค‘์— ํ•˜์ž.
    • ์Šค์Šค๋กœ ํ•„์š”์„ฑ์„ ๋Š๋ผ๊ฒŒ ํ•˜๋Š”๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”.
  • TDD ์ข‹์€ ์ ์€?
    • ์‚ถ์˜ ๋งŒ์กฑ๋„๋ฅผ ๋†’์—ฌ์ค€๋‹ค.
    • ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ์ง๋ฌด์˜ ํƒˆ์ง„์„ ๋‚ฎ์ถฐ์ค€๋‹ค.
  • TDD๋Š” ์–ด๋””์„œ ์ƒ๊ฒผ์„๊นŒ?
    • Pair Programming์„ ํ•˜๋ฉด์„œ ์ƒ๊ฒผ๋‹ค.
    • ๋จผ์ € ์• ์ž์ผ์ด๋ž€ ํ™˜๊ฒฝ์ด ๊ฐ–์ถฐ์ค˜์•ผ ํ•œ๋‹ค.
      • ์• ์ž์ผ์€ ์‚ฌํšŒ์ ์ธ ํ–‰์œ„.
      • ๋‚˜๋งŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค๊ฐ™์ด ํ•˜๋Š” ํ–‰์œ„
  • ์‹œ๊ฐ„์ด ๋งŽ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์€ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š”?
    • ๋งŽ์€ ๋„์ „๊ณผ ์‹คํŒจํ•˜๊ธฐ
  • TDD๋ฅผ ๋„์ž…ํ•˜๋ ค๋ฉด?
    • ํ•œ๋ฒˆ์— ๋„์ž…ํ•˜๋ ค ํ•˜์ง€ ๋ง๊ณ  ์ž‘์€ Step ์ง„ํ–‰ํ•˜์ž.
    • ํ•œ๋ฒˆ์˜ ํ•˜๋‚˜์˜ ์‹คํŒจ
    • ํ…Œ์ŠคํŠธ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”.

์ฒซ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ํ•ต์‹ฌ์„ ํ…Œ์ŠคํŠธํ•˜์ž. ์ฒซ ๋‹จ์ถ”๋ถ€ํ„ฐ ์ž˜๋ชป ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฉํ–ฅ์„ฑ ์žƒ๊ฒŒ ๋˜์–ด ํ…Œ์ŠคํŠธ์˜ ์ž‘์„ฑ ๋ฐฉํ–ฅ์ด ์™„์ „ ๋‹ค๋ฅด๊ฒŒ ์ง„ํ–‰๋œ๋‹ค.

์ปค๋ฒ„๋ฆฌ์ง€๋Š” ์˜๋ฏธ ์žˆ๋Š” ์ˆซ์ž์ธ๊ฐ€?

  • Metric์— ์ดˆ์ ์„ ๋งž์ถ”๊ฒŒ ๋˜๋ฉด ์žƒ์–ด๋ฒ„๋ฆฌ๋Š”๊ฒŒ ๋งŽ๋‹ค.
    • ํ…Œ์ŠคํŠธ์˜ ํ’ˆ์งˆ๋„ ์ค‘์š”ํ•˜๋‹ค.
    • ์ง€ํ‘œ๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ข‹์ง€ ์•Š๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€์— ์ดˆ์ ์„ ๋งž์ถ”์ง€ ๋ง์ž.

TDD๋ฅผ ๋ฐฐ์šฐ๋Š”๋ฐ ์žˆ์–ด ๋„์›€์ด ๋˜๋Š” ์ฑ…๋“ค.