๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Programming/Django

โœ… TDD๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•œ ์„ค๋ช…

by Mandy's 2025. 8. 6.

๐Ÿ’ก TDD๋ž€?

TDD(Test-Driven Development)๋Š” ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ,
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , ๊ทธ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋‚˜์ค‘์— ์ž‘์„ฑํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹”์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ „ํ†ต์ ์ธ ๊ฐœ๋ฐœ์€ ๊ธฐ๋Šฅ์„ ๋จผ์ € ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธ๋Š” ๋งˆ์ง€๋ง‰์— ํ•˜๊ฑฐ๋‚˜, ์•„์˜ˆ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ฃ .
ํ•˜์ง€๋งŒ TDD๋Š” ์™„์ „ํžˆ ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.


๐Ÿ” TDD์˜ ๊ฐœ๋ฐœ ํ๋ฆ„

TDD๋Š” ๋ณดํ†ต ๋‹ค์Œ์˜ 3๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค:

  1. Red – ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
    : ์•„์ง ๊ธฐ๋Šฅ์ด ์—†์œผ๋‹ˆ ํ…Œ์ŠคํŠธ๋Š” ๋‹น์—ฐํžˆ ์‹คํŒจํ•จ (์˜๋„๋œ ์‹คํŒจ)
  2. Green – ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ ์ž‘์„ฑ
    : ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ฒŒ ํ•จ
  3. Refactor – ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
    : ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณด์žฅํ•ด์ฃผ๋‹ˆ ๋งˆ์Œ ๋†“๊ณ  ๊ตฌ์กฐ ๊ฐœ์„  ๊ฐ€๋Šฅ

์ด ์‚ฌ์ดํด์„ Red → Green → Refactor๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.


๐Ÿ“ฆ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณผ๊นŒ์š”?

์š”๊ตฌ์‚ฌํ•ญ:

์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ๋ฐ›์•„ ์ธ์‚ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ ์ž‘์„ฑ

TDD ๋ฐฉ์‹ ๊ฐœ๋ฐœ ํ๋ฆ„:

# Step 1 - ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋จผ์ € ์ž‘์„ฑ (Red)
def test_say_hello():
    assert say_hello("Minjoo") == "Hello, Minjoo!"
NameError: name 'say_hello' is not defined

# Step 2 - ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (Green)
def say_hello(name):
    return f"Hello, {name}!"

โœ” ํ…Œ์ŠคํŠธ ํ†ต๊ณผ!


# Step 3 - ๋ฆฌํŒฉํ† ๋ง (Refactor)
# ์ง€๊ธˆ์€ ๋ฆฌํŒฉํ† ๋งํ•  ๋ถ€๋ถ„์ด ์—†์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊น… ์ถ”๊ฐ€ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ์Œ

์ด๋ ‡๊ฒŒ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ์™€ ๊ตฌํ˜„์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์•ˆ์ •์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์™„์„ฑํ•ด ๊ฐ‘๋‹ˆ๋‹ค.


โœ… TDD์˜ ์žฅ์ 

  • ์‹ค์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ๋ฆฌํŒฉํ† ๋ง์ด ์•ˆ์ „ํ•˜๋‹ค (ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณด์žฅํ•ด์ฃผ๋ฏ€๋กœ)
  • ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค
  • ํ˜‘์—… ์‹œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋„ ์‹ ๋ขฐ๋ฅผ ์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค

โš ๏ธ TDD์˜ ๋‹จ์  ํ˜น์€ ์ฃผ์˜์ 

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

โœจ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

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

์ฒ˜์Œ์—๋Š” ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ํ•œ ์ค„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”.
“ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง€์ง€ ์•Š์œผ๋ฉด, ๋‚ด ์ฝ”๋“œ๋„ ๋ฌด๋„ˆ์ง€์ง€ ์•Š๋Š”๋‹ค”๋Š” ํ™•์‹ ์„ ์ค„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!