์ถ์ฒ: https://www.youtube.com/watch?v=3LMmPXoGI9Q

๐ TDD(ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ)์ ๋จ์ ํ
์คํธ๋ ๋ฌด์์ด๋ฉฐ, ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
TDD๋ ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ ํ๋ก๋์
์ฝ๋๋ฅผ ๋์ค์ ๋ง๋๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ์ด๋ฉฐ, ๋จ์ ํ
์คํธ๋ ์ฝ๋์ ๊ฐ์ฅ ์์ ๋จ์๋ฅผ ๊ฒ์ฆํ์ฌ ์ฝ๋์ ์์ ์ฑ๊ณผ ํ์ง์ ๋์ด๋ ์ ์ฐจ์
๋๋ค.
๐ก TDD์ ์ง์ ํ ์ฅ์ ์ ๋ฌด์์ธ๊ฐ?
- ์์ฐ์ค๋ฌ์ด ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ์ฆ๊ฐ
- ์ค๋ฒ ์์ง๋์ด๋ง ๋ฐฉ์ง
- ์ค๊ณ์ ๋ํ ๋น ๋ฅธ ํผ๋๋ฐฑ ์ ๊ณต
๋ฐฐ๊ฒฝ์ง์: TDD์ ๋จ์ ํ
์คํธ, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ ๋ฌธํ
์ด ๋
ธํธ๋ ์์ ๋ค๋ฃจ๋ TDD(ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ)์ ๋จ์ ํ
์คํธ๋ฅผ ์ฒ์ ์ ํ๋ ๋ถ๋ค์ด ๋ด์ฉ์ 100% ์ดํดํ ์ ์๋๋ก ๋๊ธฐ ์ํด ์์ฑ๋์์ต๋๋ค. ํนํ TDD์ ๋ฐฐ๊ฒฝ, ๊ทธ ์ฐฝ์์์ ์๋, ๊ทธ๋ฆฌ๊ณ ์ข์ ํ
์คํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ตฌ์ฒด์ ์ธ ์์น์ ์ฝ๊ฒ ํ์ด ์ค๋ช
ํฉ๋๋ค.

1. TDD์ ์ฐฝ์์, ์ผํธ ๋ฒก(Kent Beck)๊ณผ ๊ทผ๋ณธ์ ์ธ ์ด์
TDD(Test-Driven Development)๋ ๋จ์ํ 'ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๋ ๊ฒ' ์ด์์ ์ฒ ํ์ ๋ด๊ณ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ๋ก ์ ์ฐฝ์ํ ์ผํธ ๋ฒก์ ํ๋ก๊ทธ๋๋ฐ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ , ์ฆ ๋๋ ค์(Fear)์ ํด๊ฒฐํ๊ธฐ ์ํด TDD๋ฅผ ์ ์ํ์ต๋๋ค.
- ์ผํธ ๋ฒก์ ์ ์ฒด:
- ์ผํธ ๋ฒก์ ์ต์คํธ๋ฆผ ํ๋ก๊ทธ๋๋ฐ(XP)์ ์ฐฝ์์ ์ค ํ ๋ช
์ด๋ฉฐ, ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ถ์ผ์ ์ ๊ตฌ์๋ก ๊ผฝํ๋๋ค. ๊ทธ๋ ๊ฐ๋ฐ์๋ค์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ถ๊ฐํ ๋ ๋๋ผ๋ ๋ถ์๊ฐ์ ์ค์ด๋ ๋ฐ ์ง์คํ์ต๋๋ค.
- ๊ทธ๋ TDD๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ด ์ฝ๋ฉ ๊ฒฐ์ ํ๋ํ๋์ ๋ํ ํผ๋๋ฐฑ์ ์ฆ๊ฐ์ ์ผ๋ก ์ป๊ณ , ๊ถ๊ทน์ ์ผ๋ก ๊ฐ๋ฐ์ ๋๋ ค์์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ต๋๋ค .
- TDD์ ํต์ฌ ์ฌ์ดํด (Red-Green-Refactor):
- TDD๋ ๋ค์๊ณผ ๊ฐ์ ์ธ ๋จ๊ณ์ ์ํ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ์งํ๋ฉ๋๋ค . ์ด ์ฌ์ดํด์ ์งํค๋ ๊ฒ์ด TDD์ ํต์ฌ์
๋๋ค.

- TDD์ ์ฅ์ (Why We Use TDD):
- ๋๋ฒ๊น
์๊ฐ ์ ๊ฐ: ํ
์คํธ๊ฐ ํน์ ๊ธฐ๋ฅ์ ์ค๋ฅ ์ง์ ์ ๋ฐ๋ก ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ถ๋ถ์ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์์ต๋๋ค .
- ์ค๋ฒ ์์ง๋์ด๋ง ๋ฐฉ์ง: ์๊ตฌ์ฌํญ์ ๋ฑ ๋ง๋ ํ
์คํธ๋ฅผ ๋จผ์ ์์ฑํ๊ธฐ ๋๋ฌธ์, ๋ฏธ๋์ ํ์ํ ์ง ๋ชจ๋ฅด๋ ๋ถํ์ํ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ง ์๊ฒ ๋ฉ๋๋ค (์ค๋ฒ ์์ง๋์ด๋ง ๋ฐฉ์ง) .
- ๋์ํ๋ ๋ฌธ์ ์ญํ : ํ
์คํธ ์ฝ๋๊ฐ ๊ณง ํ๋ก๋์
์ฝ๋๊ฐ '์ด๋ป๊ฒ ๋์ํด์ผ ํ๋์ง'๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฐ์ฅ ํ์คํ ๋ฌธ์๊ฐ ๋ฉ๋๋ค .

2. '10๋ถ ํ
์ฝํก'์ ๋งฅ๋ฝ๊ณผ ์ด๊ท์์ ๋
ผ์
์๋ณธ ์๋ฃ๋ '์ฐ์ํ ํ
ํฌ์ฝ์ค(์ฐํ
์ฝ)' ๊ต์ก ๊ณผ์ ์ ์ผํ์ธ 'ํ
์ฝํก'์
๋๋ค. ์ด๋ ๊ต์ก์๋ค์ด ์ง์์ ๊ณต์ ํ๋ ๋ฐํ ์ธ์
์
๋๋ค. ๋ฐ๋ผ์ ๋ฐํ์์ธ ํผ์นด(Pika)๋์ ์ด ๊ต์ก ๊ณผ์ ์ ๊ฒฝํํ ๊ฐ๋ฐ์๋ก์ ์ค์ง์ ์ธ ๋
ธํ์ฐ๋ฅผ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
- ์ฐ์ํ ํ
ํฌ์ฝ์ค(์ฐํ
์ฝ) ๋ฐฐ๊ฒฝ:
- ์ฐํ
์ฝ๋ ๋ฐฐ๋ฌ์๋ฏผ์กฑ์ ์ด์ํ๋ ์ฐ์ํํ์ ๋ค์์ ์ด์ํ๋ ๊ฐ๋ฐ์ ๊ต์ก ํ๋ก๊ทธ๋จ์ผ๋ก, ์๊ธฐ์ฃผ๋ ํ์ต, ํ์ด ํ๋ก๊ทธ๋๋ฐ, TDD, ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฑ์ ํตํด ํ์ง ์ข์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ฐ์ต์ ์ค์ํฉ๋๋ค .
- ์ด๋ฌํ ๋ฐฐ๊ฒฝ ๋๋ฌธ์, ์ด ์๋ฃ๋ ๋จ์ํ ์ด๋ก ์ด ์๋ ์ค์ ๊ต์ก ํ๊ฒฝ์์ ์ฒด๋ํ TDD ๊ฒฝํ๊ณผ ๊ทธ ์ด๋ ค์์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
- TDD๋ ์ค๊ณ ๋ฐฉ๋ฒ๋ก ์ธ๊ฐ? ๋
ผ์์ ๋ฐฐ๊ฒฝ:
- ์์์์ "TDD๋ ์ค๊ณ ๋ฐฉ๋ฒ๋ก ์ด ์๋๋ค"๋ผ๋ ์ด๊ท์ ๋์ ๋ฐ์ธ์ด ์ธ์ฉ๋ฉ๋๋ค . ์ด ๋
ผ์์ TDD์ ๋ํ ์ค๋ฌด์ ์ธ ์ดํด๋ฅผ ๋์ด๋ ์ค์ํ ์ง์ ์
๋๋ค.
- ์ด๊ท์ ๋์ OKKYCON 2018 ๋ฑ์์ TDD์ ํ์ค์ ์ธ ์ ์ฉ๊ณผ ์คํจ ์ด์ ์ ๋ํด ๊ฐ์ฐํ ๋ฐ ์๋ ๊ฐ๋ฐ ์ ๋ฌธ๊ฐ์
๋๋ค.
- ๊ทธ์ ํต์ฌ ์ฃผ์ฅ์ TDD ์์ฒด๊ฐ '์ข์ ์ค๊ณ'๋ฅผ ๋ณด์ฅํ์ง๋ ์๋๋ค๋ ๊ฒ์
๋๋ค. TDD๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฉํ๋ ค๋ฉด, ๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋์ ๊ฐ์ ์ค๊ณ ๊ธฐ๋ฒ(SOLID ์์น ๋ฑ)์ด ๋จผ์ ๋์
๋์ด์ผ ํฉ๋๋ค .
- ์คํจํ๋ TDD: TDD๊ฐ ์คํจํ๋ ํํ ์ด์ ๋ ๊ตฌํ์ฒด์ ์์กด์ ์ธ ํ
์คํธ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ธํฐํ์ด์ค๋ ์๊ตฌ์ฌํญ ๋์ , ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ํ
์คํธํ๋ฉด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ ๋๋ง๋ค ํ
์คํธ๊ฐ ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค .
3. ์ข์ ์ฝ๋๋ฅผ ์ํ ๋ ๊ฐ์ง ์์น: SOLID์ FIRST
๋จ์ ํ
์คํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ํํ๊ณ , TDD๋ฅผ ํตํด ์ข์ ์ค๊ณ๋ฅผ ์ ๋ํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ํต์ฌ ์์น์ ์ดํดํด์ผ ํฉ๋๋ค.
3.1. TDD๊ฐ ์ถ๊ตฌํ๋ ์ข์ ์ค๊ณ (SOLID ์์น)
TDD๊ฐ ์ง์ ์ ์ผ๋ก SOLID ์์น์ ๊ฐ์ ํ์ง๋ ์์ง๋ง , TDD๋ฅผ ํตํด ์ป์ผ๋ ค๋ '์ข์ ์ค๊ณ'๋ ๊ถ๊ทน์ ์ผ๋ก SOLID ์์น์ ์งํฅํฉ๋๋ค. SOLID๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ํต์ฌ ์์น์ ์ฝ์์
๋๋ค.
| ์์น | ์์ด ํ๋ค์ | ํต์ฌ ์ค๋ช
| TDD์์ ์ฐ๊ฒฐ์ |
|---|
| S | Single Responsibility Principle | ํ๋์ ํด๋์ค๋ ์ค์ง ํ๋์ ์ฑ
์๋ง ๊ฐ์ง๋ค. | ํด๋์ค๋ ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์ ์ผ์ ํ๋ฉด ํ
์คํธ ์ฝ๋ ์์ฑ์ด ๋ณต์กํด์ ธ TDD๊ฐ ์ด๋ ค์์ง๋ค . |
| O | Open/Closed Principle | ํ์ฅ์ ์ด๋ ค ์๊ณ , ์์ ์ ๋ซํ ์์ด์ผ ํ๋ค. | ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ฏ๋ก ์์ ์ฑ์ ํ๋ณดํ ์ ์๋ค. |
| L | Liskov Substitution Principle | ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค๋ก ๋์ฒด ๊ฐ๋ฅํด์ผ ํ๋ค. | ๋คํ์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฉํ์ฌ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค. |
| I | Interface Segregation Principle | ํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง ์์์ผ ํ๋ค. | ์ธํฐํ์ด์ค์ ์ผ๊ด์ฑ์ ๋์ด๊ณ ํ
์คํธ ๋จ์ ๋ถ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ๋ค. |
| D | Dependency Inversion Principle | ์ถ์ํ์ ์์กดํด์ผ ํ๋ฉฐ, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์ ๋๋ค. | ๋์ ์์ค์ ๋ชจ๋(์ธํฐํ์ด์ค)์ ํ
์คํธํ์ฌ ๊ตฌํ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ด๋ ํ
์คํธ๊ฐ ๊นจ์ง์ง ์๊ฒ ํ๋ค. |
3.2. ์ข์ ๋จ์ ํ
์คํธ์ ์กฐ๊ฑด (FIRST ์์น)
์์ ์ข์ ๋จ์ ํ
์คํธ์ ์กฐ๊ฑด์ผ๋ก ์ธ๊ธ๋ ํญ๋ชฉ๋ค์ FIRST๋ผ๋ ์ฝ์๋ก ์ ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ ๋จ์ ํ
์คํธ๊ฐ ๊ฐ์ ธ์ผ ํ 5๊ฐ์ง ๋๋ชฉ์
๋๋ค.
- Fast (๋น ๋ฅด๊ฒ, Fast)
- ํ
์คํธ๋ ์ปดํจํฐ์ฒ๋ผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์คํ๋์ด์ผ ํฉ๋๋ค. ํ
์คํธ๊ฐ ๋๋ฆฌ๋ฉด ์์ฃผ ์คํํ์ง ์๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ์ฝ๋ ํ์ง์ด ๋๋น ์ง๋๋ค.
- Independent (๋
๋ฆฝ์ ์ผ๋ก, Independent)
- ๊ฐ ํ
์คํธ๋ ์๋ก ์์กดํด์๋ ์ ๋ฉ๋๋ค. ํ ํ
์คํธ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ํ
์คํธ์ ์ํฅ์ ์ฃผ๋ฉด ์ ๋ฉ๋๋ค.
- ๋ง์ฝ ์์กด์ฑ์ด ์๋ค๋ฉด, ํ๋๊ฐ ์คํจํ ๋ ๋๋ฏธ๋
ธ์ฒ๋ผ ๋ชจ๋ ํ
์คํธ๊ฐ ์คํจํ์ฌ ์คํจ ์์ธ์ ์ง๋จํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- Repeatable (๋ฐ๋ณต ๊ฐ๋ฅํ๊ฒ, Repeatable)
- ํ
์คํธ๋ ์ด๋ค ํ๊ฒฝ(๊ฐ๋ฐ ํ๊ฒฝ, ํ
์คํธ ์๋ฒ, ์ธํฐ๋ท์ด ๋๊ธด ํ๊ฒฝ ๋ฑ)์์๋ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผ ํฉ๋๋ค .
- Self-Validating (์๊ฐ ๊ฒ์ฆ, Self-Validating)
- ํ
์คํธ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋์ด ์ฃผ๊ด์ ์ผ๋ก ํ๋จํ ํ์ ์์ด, ์ฑ๊ณต(True) ๋๋ ์คํจ(False)์ ๋ถ๋ฆฐ ๊ฐ์ผ๋ก ๋ช
ํํ๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค .
- Timely (์ ์์, Timely)
- ํ
์คํธ ์ฝ๋๋ ํ๋ก๋์
์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ง์ ์ ์์ฑ๋์ด์ผ ํฉ๋๋ค . ์ฝ๋๋ฅผ ๋ค ์ง๊ณ ๋์ ํ
์คํธ๋ฅผ ๋ง๋ค๋ฉด, ์ฝ๋๊ฐ ํ
์คํธํ๊ธฐ ์ด๋ ต๊ฒ ๋์ด ๊ฒฐ๊ตญ ์ฝ๋๋ฅผ ๋ค์ ์ง์ผ ํ ์๋ ์์ต๋๋ค .

1. TDD(ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ)์ ์ ์์ ๊ฐ๋ฐ ์ฌ์ดํด
1.1. TDD์ ๊ฐ๋
๋ฐ ๊ฐ๋ฐ ํ๋ก์ธ์ค

- TDD์ ์ ์: TDD๋ ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ(Test Driven Development)์ ์ฝ์๋ก, ํ๋ก๊ทธ๋จ ์์ฑ ์ ์ ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ ์ค์ ํ๋ก๋์
์ฝ๋๋ฅผ ๋์ค์ ๋ง๋๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ์ด๋ค.
- TDD์ ์ฐฝ์์: TDD์ ์ฐฝ์์์ธ ์ผํธ ๋ฒก(Kent Beck)์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ธฐ ์ ์ ํ
์คํธ๋ฅผ ๋จผ์ ํ๋ผ๊ณ ๊ฐ์กฐํ๋ค.
- ๊ธฐ์กด ํ๋ก์ธ์ค์์ ์ฐจ์ด:
- ๊ธฐ์กด ํ๋ก์ธ์ค: ์ค๊ณ โ ๊ฐ๋ฐ ์ฝ๋ ์์ฑ โ ํ
์คํธ ์ฝ๋ ์์ฑ ์์์ด๋ค.
- TDD ํ๋ก์ธ์ค: ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ ํ ๊ฐ๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- TDD ๊ฐ๋ฐ ์ฌ์ดํด (๋ ๋, ๊ทธ๋ฆฐ, ๋ฆฌํฉํฐ): TDD๋ ์ธ ๊ฐ์ง ์ฌ์ดํด๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ๋ ๋ (Red): ํ
์คํธ๋ฅผ ์คํจํ๋ ๋จ๊ณ์ด๋ค.
- ๊ทธ๋ฆฐ (Green): ํ
์คํธ๋ฅผ ์ฑ๊ณตํ ์ ์๋๋ก ํ๋ก๋์
์ฝ๋๋ฅผ ๊ตฌํํ๋ ๋จ๊ณ์ด๋ค.
- ๋ฆฌํฉํฐ (Refactor): ํ๋ก๋์
์ฝ๋์ ํ
์คํธ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๋จ๊ณ์ด๋ค.
1.2. TDD๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์ฅ์

- ์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง TDD์ ์ฅ์ :
- ๊ฐ๋ฐ์ ๋ํ ๋๋ ค์์ ์ค์ฌ์ค๋ค.
- ๋๋ฒ๊น
์๊ฐ์ ์ค์ฌ์ค๋ค.
- ๋์ํ๋ ๋ฌธ์ ์ญํ ์ ํ๋ค.
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ํฅ์: ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๋ฏ๋ก ์์ฐ์ค๋ฝ๊ฒ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋์์ง๋ค.
- ํ
์คํธ ์ฝ๋ ์์ฑ์ ๋ฏธ๋ฃจ๊ฑฐ๋ ํ์ง ์๋ ๊ฒฝํ์ ๋ฐฉ์งํด ์ค๋ค.
- ์ค๋ฒ ์์ง๋์ด๋ง ๋ฐฉ์ง:
- TDD๋ฅผ ์ํํ๋ฉด ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ๊ฐ๋ฐ ์ฝ๋๋ฅผ ๊ตฌํํ๋ฏ๋ก, ๋ฑ ํ์ํ ๋งํผ๋ง ์ฝ๋ฉํ ์ ์๋ค.
- ๋ฏธ๋์ ํ์ํ ๊ฒ ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์ํ์ฌ ๋ถํ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ค๋ฒ ์์ง๋์ด๋ง์ ๋ฐฉ์งํด ์ค๋ค.
- ์ค๊ณ์ ๋ํ ๋น ๋ฅธ ํผ๋๋ฐฑ:
- ์ค๊ณ๋ฅผ ์ฒ์๋ถํฐ ์ํ๋ฉด ์ข์ง๋ง, ์๋ชป ์ค๊ณํ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ธ ๋ ๋น๋ก์ ๊นจ๋ซ๊ฒ ๋๋ค.
- TDD๋ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ๋ณต์กํ๊ฑฐ๋ ์๋ชป๋ ์ค๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํ
์คํธ ์ฝ๋ ์์ฑ์ด ์ด๋ ค์์ง๋ ๊ฒ์ ํตํด ๋น ๋ฅด๊ฒ ์ค๊ณ์ ๋ํ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ค๊ณ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐ๊ฟ ์ ์๋ค.
1.3. TDD๊ฐ ์ค๊ณ ๋ฐฉ๋ฒ๋ก ์ด ์๋ ์ด์

- TDD์ ์ญํ ํ๊ณ: TDD๊ฐ ์ค๊ณ ๋ฐฉ๋ฒ๋ก ์ด๋ผ๋ฉด TDD๋ฅผ ํตํด ์ข์ ์ค๊ณ๋ฅผ ์ป์ ์ ์์ด์ผ ํ๋ค.
- TDD๊ฐ ์ ๊ณตํ์ง ์๋ ๊ฒ: TDD๋ ๋ค์๊ณผ ๊ฐ์ ์ค๊ณ ์์น์ ๋ํ ์ด๋ ํ ์ ํธ๋ ์ฃผ์ง ์๋๋ค.
- ๋์ ์์ง๋(Cohesion)
- ๋จ์ผ ์ฑ
์ ์์น(SRP)
- ๊ฐ๋ฐฉ-ํ์ ์์น(OCP)
- ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(ISP)
- ์ธํฐํ์ด์ค์ ์ผ๊ด์ฑ ๋
ธ์ถ
- ๋ฆฌํฉํ ๋ง ๋จ๊ณ์์ ์ข์ ๊ตฌ์กฐ๋ฅผ ์๋ดํ๊ฑฐ๋ ๊ฐ์ ํ์ง ์๋๋ค.
- TDD์ ์ค๊ณ ์ํฅ: TDD๋ ์ค๊ณ์ ์ ํ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ์ ์๋๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ์ํํ๋ค.
- ๊ฐ๊ฒฉ๊ณผ ์์กด์ฑ ํ์ฑ์ ์ต์ ํ๋ ์ญํ ์ ํ๋ค.
- OCP ์๋ฐฐ๋ฅผ ๊ฒฝ๊ณ ํ๊ณ ๋ถ๋ช
ํํ ์ค๊ณ ์ง์ ์ ๋ฐ๊ฒฌํ๋ ๋ฐ ๋์์ ์ค๋ค.
- ์ค๊ณ ์์กด์ ์ํ์ฑ: ์ ์ ์ผ๋ก TDD์๋ง ์์กดํ์ฌ ์ค๊ณ๋ฅผ ์งํํ๋ฉด, ํ
์คํธํ๊ธฐ์๋ง ์ข์ ์ ์ข์ ์ค๊ณ๊ฐ ๋ง๋ค์ด์ง ์ ์๋ค.
2. TDD ์คํจ์ ์ผ๋ฐ์ ์ธ ์ด์ ์ ํด๊ฒฐ์ฑ
: ์ธํฐํ์ด์ค ํ
์คํธ์ ์ค์์ฑ

- TDD ์ ์ฉ ์คํจ์ ์์ธ: TDD๋ฅผ ์ ์ฉํ๋ฉด์ ์คํจํ๋ ์ฌ๋๋ค์ด ๋ง๋ค.
- TDD๋ฅผ ์คํจํ๋ ์ฌ๋๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๊ฐ ์ด๋ฃจ๊ณ ์ ํ๋ ๊ฐ์น๋ ๊ธฐ๋ฅ์ ํ
์คํธํ๊ธฐ๋ณด๋ค๋, ๊ทธ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๊ตฌํํ๊ณ ์๋์ง๋ฅผ ํ
์คํธํ๋ค.
- ๊ตฌํ์ฒด ํ
์คํธ์ ๋ฌธ์ ์ :
- ๊ตฌํ ๋ฐฉ์์ ํ
์คํธํ๋ฉด ํ
์คํธ ์ผ์ด์ค๋ค์ด ๊ตฌ์กฐ์ ๊ฒฐํฉ๋(Coupling)๊ฐ ๋์์ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ค.
- ๊ฒฐ๊ตญ ๊ตฌํ์ฒด๋ฅผ ๋ฆฌํฉํ ๋ง(๋ด๋ถ ๊ตฌํ ๋ณ๊ฒฝ)ํ๋ฉด, ๊ฒฐํฉ๋์ด ์๋ ํ
์คํธ ์ผ์ด์ค๋ค์ด ๋ชจ๋ ๊นจ์ง๊ฒ ๋๋ค.
- ์ด๋ ํ
์คํธ๋ค์ด ๊ตฌํ์ฒด ๋ด๋ถ์
Implementation์ ์กด์ฌํ๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๋ค์ ํ
์คํธํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
- ํด๊ฒฐ์ฑ
: ์ธํฐํ์ด์ค ํ
์คํธ:
- ๊ตฌํ์ฒด๊ฐ ์๋ ์ค๊ณ, ์ฆ ์ธํฐํ์ด์ค(Interface)๋ฅผ ํ
์คํธํด์ผ ํ๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ํ
์คํธํ๊ฒ ๋๋ฉด, ๋ด๋ถ์ ๊ตฌํ๋์ด ์๋ ๊ตฌํ์ฒด๋ฅผ ๋ฆฌํฉํ ๋งํ๋๋ผ๋ ํ
์คํธ ์ผ์ด์ค๋ ์ธํฐํ์ด์ค๋ฅผ ํ
์คํธํ๊ธฐ ๋๋ฌธ์ ๊นจ์ง์ง ์๋๋ค.
| ํ
์คํธ ๋์ | ํน์ง | ๋ฌธ์ ๋ฐ์ ์ |
|---|
| ๊ตฌํ์ฒด (Implementation) | ์ฝ๋๊ฐ ์๋ํ๋ ๋ฐฉ์ ์์ฒด | ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ฆฌํฉํ ๋งํ๋ฉด ํ
์คํธ๊ฐ ์ฐ๋ฅด๋ฅด ๊นจ์ง |
| ์ธํฐํ์ด์ค (Interface) | ์ฝ๋๊ฐ ์ธ๋ถ์ ๋
ธ์ถํ๋ ๊ธฐ๋ฅ | ๋ด๋ถ๋ฅผ ๋ฆฌํฉํ ๋งํด๋ ํ
์คํธ๋ ์์ ์ ์ |

3. ๋จ์ ํ
์คํธ(Unit Test)์ ๊ฐ๋
๊ณผ ๋ชฉ์
3.1. ๋จ์ ํ
์คํธ์ ์์น์ ์ ์

- ์ ์ฒด ํ๋ก๊ทธ๋จ ํ
์คํธ์ ์ข
๋ฅ: ํ
์คํธ๋ ํฌ๊ฒ ์ ๋ ํ
์คํธ(๋จ์ ํ
์คํธ), ๋ถ๋ถ ๊ธฐ๋ฅ ํ
์คํธ, ํตํฉ ํ
์คํธ๊ฐ ์กด์ฌํ๋ค.
- ๋จ์ ํ
์คํธ์ ๋ฒ์: ๋จ์ ํ
์คํธ๋ ์ ์ฒด ํ
์คํธ ์ค ์ ์ผ ์์ ๋จ์์ด๋ฉฐ, ์ฝ๋ ๋จ์์ ํ์๋ฅผ ํ
์คํธํ๋ค.
- ๋จ์ ํ
์คํธ์ ์ผ๋ฐ์ ์ธ ์ ์ฐจ: ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋(Method) ๋ ๋ฒจ ํ
์คํธ๋ฅผ ์ํํ๋ฉฐ, ๊ฒ์ฆ์ด ํ์ํ ์ฝ๋์ ๋ํด ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ ์ ์ฐจ์ด๋ค.
3.2. ๋จ์ ํ
์คํธ์ ๋ชฉ์

- ๋ฌธ์ ์ง์ ๋ถ๋ฆฌ:
- ๊ฐ ๋จ์๊ฐ ์ ํํ๊ฒ ๋์ํ๋์ง ๊ฒ์ฌํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ ๋ถ๋ถ์ด ์๋ชป๋์๋์ง๋ฅผ ๋นจ๋ฆฌ ํ์ธํ ์ ์๊ฒ ํด์ค๋ค.
- ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ด ๋์์ง๋ฉฐ, ์ด ์์ ์ฑ์ ์ ์ฌ์ ์ธ ๋น์ฉ ์ ๊ฐ์ผ๋ก ์ด์ด์ง๋ค.
- ๋ณ๊ฒฝ ์ ์ด:
- ์ฝ๋์ ๋ณํ๋ฅผ ์ฝ๊ฒ ํ์
ํ ์ ์๊ณ , ์์ ๋ ์ฝ๋๊ฐ ์ ํํ๊ฒ ๋์ํ๋์ง ์ฝ๊ฒ ์ ์ ์๊ฒ ๋๋ค.
- ๋ฐ๋ผ์ ๋ณ๊ฒฝ์ ์์ฃผ ํ ์ ์๋ ํ๊ฒฝ์ด ์กฐ์ฑ๋๋ค.
- ํ
์คํธ ๊ฐ์ ํ์ฑ (์ค๊ณ ํผ๋๋ฐฑ):
- ํ๋์ ๋จ์ ํ
์คํธ๊ฐ ๋๋ฌด ํฌ๊ฑฐ๋ ๋ณต์กํด์ง๋ ๊ฒ์ ์ฝ๋์ ์๋ชป๋ ๊ฒ์ด ์๋ค๋ ์ ํธ๋ก ๊ฐ์ฃผํ ์ ์๋ค.
- ํ
์คํธ๊ฐ ๋๋ฌด ๋ง์ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์๋ค๋ฉด, ํด๋น ์ฝ๋๊ฐ ๋ฆฌํฉํ ๋ง์ด ํ์ํ๋ค๋ ๊ฒ์ ๋ฐ๋ก ์ ์ ์๋ค.
- ์ฝ๋์ ๋ฌธ์ํ:
- ๋จ์ ํ
์คํธ๋ ์ผ๋ช
์ํ ์ฝ๋๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ์ํธ์์ฉ ๋ฐ ์์กด ๊ด๊ณ๋ฅผ ํ๋์ ํ์
ํ ์ ์๊ฒ ํด์ค๋ค.
- ๋จ์ ํ
์คํธ๋ ๋ฐฐํฌ๋๋ ์ฝ๋์ ์ผ์นํ๋ฏ๋ก ํญ์ ์ต์ ์ํ๋ก ์ ์ง๋๋ค๋ ์ฅ์ ์ด ์๋ค.

4. ์ข์ ๋จ์ ํ
์คํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํ FIRST ์์น
4.1. FIRST ์์น์ ๊ตฌ์ฑ ์์

- F: Fast (๋น ๋ฅด๊ฒ):
- ํ
์คํธ๋ ๋นจ๋ผ์ผ ํ๋ค.
- ํ
์คํธ๊ฐ ๋๋ฆฌ๋ฉด ์์ฃผ ๋๋ฆด ์๋๋ฅผ ๋ด์ง ๋ชปํ๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ๋ฌธ์ ๋ฅผ ๋นจ๋ฆฌ ์ฐพ์๋ด ๊ณ ์น์ง ๋ชปํ์ฌ ์ฝ๋ ํ์ง์ด ๋ง๊ฐ์ง๊ฒ ๋๋ค.
- I: Independent (๋
๋ฆฝ์ ์ผ๋ก):
- ๊ฐ ํ
์คํธ๋ ์๋ก ์์กดํ๋ฉด ์ ๋๋ค.
- ํ
์คํธ๊ฐ ์๋ก ์์กดํ๊ฒ ๋๋ฉด ํ๋๊ฐ ์คํจํ ๋ ๋๋ฏธ๋
ธ์ฒ๋ผ ๋๋จธ์ง๋ ์๋ฐ๋ผ ์คํจํ๊ฒ ๋์ด ์์ธ ์ง๋จ์ด ์ด๋ ค์์ง๊ณ , ๋ด๋ถ์ ๊ฒฐํจ์ด ์จ๊ฒจ์ง๊ฒ ๋๋ค.
- R: Repeatable (๋ฐ๋ณต ๊ฐ๋ฅํ๊ฒ):
- ํ
์คํธ๋ ์ด๋ค ํ๊ฒฝ์์๋ ๋ฐ๋ณต ๊ฐ๋ฅํด์ผ ํ๋ค.
- ์ค์ ํ๊ฒฝ, QA ํ๊ฒฝ, ์ฌ์ง์ด ๋คํธ์ํฌ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ง ์์ ์คํ๋ผ์ธ ํ๊ฒฝ์์๋ ์คํํ ์ ์์ด์ผ ํ๋ค.
- ํ
์คํธ๊ฐ ํ๊ฒฝ์ ์์กดํ๊ฒ ๋๋ฉด ํ
์คํธ ์คํจ์ ๋ณ๋ช
์ด ์๊ธฐ๊ณ , ํ๊ฒฝ์ด ์ค๋น๋์ง ์์ ํ
์คํธ๋ฅผ ์คํํ์ง ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
- S: Self-Validating (์๊ฐ ๊ฒ์ฆํ๋):
- ํ
์คํธ๋ ๋ถ๋ฆฐ ๊ฐ(Boolean)์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผ ํ๋ฉฐ, ์ฑ๊ณต ์๋๋ฉด ์คํจ๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฐํํด์ผ ํ๋ค.
- ํ
์คํธ๊ฐ ์ค์ค๋ก ์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ํ๋จํ์ง ์๋๋ค๋ฉด, ํ๋จ์ด ์ฃผ๊ด์ ์ผ๋ก ๋ณํ๊ฒ ๋๊ณ ์ง๋ฃจํ ์๋ ๊ฒ์ฆ ์์
์ด ํ์ํ๊ฒ ๋๋ค.
- T: Timely (์ ์์):
- ํ
์คํธ๋ ํญ์ ์ ์์ ์์ฑํด์ผ ํ๋ค.
- ๋จ์ ํ
์คํธ๋ ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ง์ ์ ์์ฑํด์ผ ํ๋ค.
- ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ ๋ค์ ํ
์คํธ ์ฝ๋๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด, ์ค์ ์ฝ๋๊ฐ ํ
์คํธํ๊ธฐ ์ด๋ ต๋ค๋ ์ฌ์ค์ ๋ค๋ฆ๊ฒ ๋ฐ๊ฒฌํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ๊ตฌํํ ์ฝ๋๋ฅผ ๋ค์ ์ง์ผ ํ ์๋ ์๋ค.
| ์์น | ๋ด์ฉ | ์ฝ๊ฒ ์ค๋ช
ํ๋ฉด? |
|---|
| Fast (๋น ๋ฅด๊ฒ) | ํ
์คํธ ์คํ ์๋๊ฐ ๋นจ๋ผ์ผ ํฉ๋๋ค. | ํ
์คํธ๊ฐ ๋๋ฆฌ๋ฉด ์์ฃผ ์ ๋๋ ค๋ณด๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ์ฝ๋ ํ์ง์ด ๋๋น ์ง๋๋ค . |
| Independent (๋
๋ฆฝ์ ์ผ๋ก) | ๊ฐ ํ
์คํธ๋ ์๋ก์๊ฒ ์์กดํ๋ฉด ์ ๋ฉ๋๋ค. | ํ๋๊ฐ ์คํจํ์ ๋ ๋๋ฏธ๋
ธ์ฒ๋ผ ์ค์ค์ด ์คํจํ๋ฉด, ์ง์ง ์์ธ์ ์ฐพ๊ธฐ ์ด๋ ต์ต๋๋ค . |
| Repeatable (๋ฐ๋ณต ๊ฐ๋ฅํ๊ฒ) | ์ด๋ค ํ๊ฒฝ์์๋ (ํ์ฌ, ์ง, ์ฌ์ง์ด ์ธํฐ๋ท ์๋ ํ๊ฒฝ์์๋) ๋ฐ๋ณต ์คํ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค . | ํ๊ฒฝ ๋๋ฌธ์ ํ
์คํธ๊ฐ ์คํจํ ์ ์๋ค๋ฉด, ๊ฐ๋ฐ์๊ฐ ํ
์คํธ๋ฅผ ์คํํ์ง ์์ ๋ณ๋ช
๊ฑฐ๋ฆฌ๋ฅผ ์ค๋๋ค . |
| Self-Validating (์๊ฐ ๊ฒ์ฆ) | ํ
์คํธ ๊ฒฐ๊ณผ๋ ๋ฐ๋์ ์ฑ๊ณต(True) ๋๋ ์คํจ(False)๋ก ๋ช
ํํ ๋์์ผ ํฉ๋๋ค . | ์ฌ๋์ด ์ฃผ๊ด์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ๋จํ๊ฒ ๋๋ฉด, ์ง๋ฃจํ๊ณ ๋นํจ์จ์ ์ธ ์๋ ํ์ธ ์์
์ด ํ์ํฉ๋๋ค . |
| Timely (์ ์์) | ํ
์คํธ๋ ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ง์ ์ ์์ฑํด์ผ ํฉ๋๋ค . | ์ฝ๋๋ฅผ ๋ค ์ง๊ณ ๋์ค์ ํ
์คํธ๋ฅผ ๋ง๋ค๋ฉด, ์ฝ๋๊ฐ ํ
์คํธํ๊ธฐ ์ด๋ ต๊ฒ ์ง์ฌ์ก๋ค๋ ์ฌ์ค์ ๋๋ฌด ๋ฆ๊ฒ ๊นจ๋ซ๊ฒ ๋์ด ๋ค์ ์ง์ผ ํฉ๋๋ค . |