--- category: Unified tags: [auto-consolidated, technical-documentation] title: Test-Driven Development last_updated: 2026-05-02 --- # Test-Driven Development ## ๐Ÿ“Œ Brief Summary Test-Driven Development(TDD)๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง์„ ๊ฒ€์ฆํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํŒจํ„ด์ž…๋‹ˆ๋‹ค[1]. ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ์‹ค์ „ ์„ค๊ณ„ ํŒจํ„ด์—์„œ TDD๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์™ธ๋ถ€ ์ธํ”„๋ผ๋‚˜ UI๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์‹œ์ผœ ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•จ์œผ๋กœ์จ, ์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค[1, 2]. ์ฃผ๋กœ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋‚˜ ์œก๊ฐํ˜• ์•„ํ‚คํ…์ฒ˜์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ชจ๋“ˆํ™”๋˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค[3, 4]. ## ๐Ÿ“– Core Content * **TDD์˜ ํ•ต์‹ฌ ์›์น™ ๋ฐ ๋ชฉ์ ** TDD๋Š” ์‹ค์ œ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธ๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ, ์ฝ”๋“œ์˜ ์‹ ๋ขฐ์„ฑ(reliability)๊ณผ ํ–ฅํ›„ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์œ ์ง€๋ณด์ˆ˜์„ฑ(maintainability)์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค[1]. * **๋ชจ๋ฐ”์ผ ํ”„๋ ˆ์ž„์›Œํฌ ํ™˜๊ฒฝ์—์„œ์˜ TDD (Flutter)** Flutter ์ƒํƒœ๊ณ„์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์‹ค์ „ ์„ค๊ณ„ ํŒจํ„ด์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI ์œ„์ ฏ์„ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜(Clean Architecture)์™€ TDD ํŒจํ„ด์„ ์ ๊ทน์ ์œผ๋กœ ์ˆ˜์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค[2]. ์‹ค๋ฌด์—์„œ๋Š” ์•ฑ์„ ํ”„๋ ˆ์  ํ…Œ์ด์…˜, ๋„๋ฉ”์ธ, ๋ฐ์ดํ„ฐ ๋“ฑ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  BLoC(Business Logic Component) ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด๊ณผ TDD๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ตœ์‹  ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค[1, 3]. * **๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ ํ™˜๊ฒฝ์—์„œ์˜ TDD (Spring Boot ๋ฐ ์œก๊ฐํ˜• ์•„ํ‚คํ…์ฒ˜)** Spring Boot์™€ ๊ฐ™์ด ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์œก๊ฐํ˜• ์•„ํ‚คํ…์ฒ˜(Hexagonal Architecture)์—์„œ๋„ TDD๋Š” ํ•„์ˆ˜์ ์ธ ์‹ค์ „ ํŒจํ„ด์œผ๋กœ ์ž๋ฆฌ ์žก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฒ€์ฆํ•  ๋•Œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB) ํ™˜๊ฒฝ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , H2์™€ ๊ฐ™์€ ์ธ๋ฉ”๋ชจ๋ฆฌ(In-Memory) DB๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Mockito์™€ ๊ฐ™์€ ๋ชจํ‚น(Mocking) ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„๋ฉ”์ธ ๋กœ์ง๋งŒ์„ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ TDD๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค[4]. ## โš–๏ธ Trade-offs & Caveats ์ œ๊ณต๋œ ์†Œ์Šค์— TDD ์ž์ฒด์˜ ๋ณธ์งˆ์ ์ธ ๋‹จ์ ์ด๋‚˜ ์ œ์•ฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ •๋ณด๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, TDD๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๋™๋ฐ˜๋˜๋Š” **๋ชจํ‚น(Mocking) ๊ธฐ์ˆ  ์‚ฌ์šฉ์— ๊ด€ํ•œ ์น˜๋ช…์ ์ธ ๋ถ€์ž‘์šฉ(Trade-off)**์ด ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Mockito ๋“ฑ์˜ ๋ชจํ‚น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๋„๋ฉ”์ธ์˜ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์ž˜๋ชป๋œ ๋™์ž‘์„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋‚ด์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜๊ฒŒ ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค[5, 6]. ์ด ๊ฒฝ์šฐ ๊ธฐ๋Šฅ ๋กœ์ง์— ๊ฒฐํ•จ์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ชจํ‚น๋œ ๋ฐ์ดํ„ฐ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•˜๊ฒŒ ๋˜๋ฉฐ, ํ–ฅํ›„ ๋„๋ฉ”์ธ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜์ง€ ์•Š์•„ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์— ์ž ์žฌ์ ์ธ ๊ธฐ๋Šฅ์  ๋ฒ„๊ทธ(Functional bugs)๋ฅผ ๋ฐฉ์น˜ํ•˜๊ฒŒ ๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค[6, 7]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/์„ค๊ณ„ ํŒจํ„ด)] - [[Clean Architecture]] - ์—ฐ๊ฒฐ ์ด์œ : TDD์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ชจ๋ฐ”์ผ(Flutter) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณ„์ธต(ํ”„๋ ˆ์  ํ…Œ์ด์…˜, ๋„๋ฉ”์ธ, ๋ฐ์ดํ„ฐ)์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋กœ์ง์„ ๋ณดํ˜ธํ•˜๋Š” ๊ทผ๊ฐ„์ด ๋ฉ๋‹ˆ๋‹ค[1-3]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: TDD๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ ๋ชจ๋ฐ”์ผ UI์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์กฐ์  ์›๋ฆฌ. - [[Hexagonal Architecture]] - ์—ฐ๊ฒฐ ์ด์œ : ๋ฐฑ์—”๋“œ ํ™˜๊ฒฝ์—์„œ TDD๋ฅผ ์ ์šฉํ•  ๋•Œ, ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ๋ฐฐ์ œํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ํฌํŠธ(Ports)์™€ ์–ด๋Œ‘ํ„ฐ(Adapters)๋กœ ์‹œ์Šคํ…œ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค[4, 8, 9]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ ๋„๋ฉ”์ธ ๋กœ์ง ํ…Œ์ŠคํŠธ์˜ ์ค‘์š”์„ฑ๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•. #### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] - [[Mockito]] - ์—ฐ๊ฒฐ ์ด์œ : Spring Boot ๋“ฑ์˜ ๋ฐฑ์—”๋“œ TDD ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ DB ๋Œ€์‹  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ชจํ‚น ๋„๊ตฌ์ž…๋‹ˆ๋‹ค[4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: TDD์—์„œ ์ธํ”„๋ผ ๊ณ„์ธต์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ชจํ‚น ์˜ค์šฉ์œผ๋กœ ์ธํ•œ ์ž ์žฌ์  ๋ฒ„๊ทธ ๋ฐœ์ƒ(Mocking Caveat)์˜ ์›๋ฆฌ[5, 7]. - [[In-Memory Database]] - ์—ฐ๊ฒฐ ์ด์œ : ๋ฐฑ์—”๋“œ ๋กœ์ง ํ…Œ์ŠคํŠธ ์‹œ ์‹ค์ œ DB๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ TDD ํ™˜๊ฒฝ ๊ตฌ์ถ•์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๋„๊ตฌ(์˜ˆ: H2)์ž…๋‹ˆ๋‹ค[4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจํ‚น(Mocking) ๋„๊ตฌ์˜ ๋Œ€์•ˆ์œผ๋กœ์„œ ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ๋น ๋ฅด๊ณ  ๊ฒฉ๋ฆฌ๋œ ์ƒํƒœ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•. ### Deeper Research Questions - TDD ๊ณผ์ •์—์„œ ๋ชจํ‚น(Mocking)์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ๋Šฅ์  ๊ฒฐํ•จ ์€ํ ๋ฌธ์ œ(Mocking Caveat)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์•ˆ์  ํ…Œ์ŠคํŠธ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - Flutter์˜ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์™€ Spring Boot์˜ ์œก๊ฐํ˜• ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ TDD๋ฅผ ์ ์šฉํ•  ๋•Œ, ๋„๋ฉ”์ธ ๊ณ„์ธต ๊ฒฉ๋ฆฌ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? - ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด(์˜ˆ: Flutter์˜ BLoC)์ด TDD ๊ธฐ๋ฐ˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฒ€์ฆ์„ ์–ด๋–ป๊ฒŒ ๋” ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๊ฐ€? - GitHub Copilot๊ณผ ๊ฐ™์€ AI ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ '๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž๋™ ์ƒ์„ฑ' ๊ธฐ๋Šฅ์ด ์ „ํ†ต์ ์ธ TDD ์›Œํฌํ”Œ๋กœ์šฐ(Test-First)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? - ํ…Œ์ŠคํŠธ ์‹œ ์‹ค์ œ DB ์—ฐ๋™, In-Memory DB ์‚ฌ์šฉ, Mockito ์‚ฌ์šฉ ๋“ฑ ๊ฐ ์ธํ”„๋ผ ์ถ”์ƒํ™” ๋ฐฉ์‹์ด ๊ฐ–๋Š” ์„ฑ๋Šฅ ๋ฐ ๊ฒ€์ฆ ์‹ ๋ขฐ๋„ ์ธก๋ฉด์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? ### Practical Application Contexts - **Implementation:** ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „, ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค[1]. - **System Design:** ํ”„๋ก ํŠธ์—”๋“œ/๋ชจ๋ฐ”์ผ์—์„œ๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜, ๋ฐฑ์—”๋“œ์—์„œ๋Š” ์œก๊ฐํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•จ์œผ๋กœ์จ, UI์™€ ์ธํ”„๋ผ๋กœ๋ถ€ํ„ฐ ๋„๋ฉ”์ธ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด TDD๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค[1, 2, 4]. - **Operation / Maintenance:** ์ฒ ์ €ํ•œ TDD๋ฅผ ํ†ตํ•ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ธฐ์กด ๋กœ์ง์ด ๋ง๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ, ์žฅ๊ธฐ์ ์ธ ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค[1]. - **Learning Path:** ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ ํ•™์Šต ์‹œ ๋‹จ์ˆœํžˆ UI ๊ฐœ๋ฐœ ๊ธฐ์ˆ ๋งŒ ์ตํžˆ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋„๋ฉ”์ธ/๋ฐ์ดํ„ฐ ๊ณ„์ธต ๋ถ„๋ฆฌ ์›๋ฆฌ์™€ TDD๋ฅผ ํ•จ๊ป˜ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•˜์—ฌ ํ™•์žฅ์„ฑ ๋†’์€ ์‹ค์ „ ์—ญ๋Ÿ‰์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค[1, 3]. - **My Project Relevance:** ํŒ€ ํ”„๋กœ์ ํŠธ๋‚˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ ๋„์ž… ์‹œ, ๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆํ™”์™€ ๋”๋ถˆ์–ด Mockito, In-memory DB๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ๊ฒฌ๊ณ ํ•œ ํ…Œ์ŠคํŠธ๋ง์„ ์„ ์ œ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ๋•Œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค[4]. ### Adjacent Topics - [[Functional Testing]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์œ„์ฃผ์˜ TDD์—์„œ ๋” ๋‚˜์•„๊ฐ€, Cucumber์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์‹œ์Šคํ…œ์˜ ์ „์ฒด ๋™์ž‘๊ณผ ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” BDD(Behavior-Driven Development) ์˜์—ญ์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค[10]. - [[AI-driven Test Automation]] - ํ™•์žฅ ๋ฐฉํ–ฅ: TDD์˜ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด, AI ์ฝ”๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ(์˜ˆ: GitHub Copilot์˜ /test ๋ช…๋ น์–ด)๋ฅผ ํ™œ์šฉํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ ๋ฐ AI ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ†ตํ•ฉ ๋ถ„์•ผ๋ฅผ ํƒ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค[11, 12]. --- *Last updated: 2026-05-02* --- - [[Clean_Code]]: TDD์˜ ๋ฆฌํŒฉํ† ๋ง ๋‹จ๊ณ„์—์„œ ์ง€ํ–ฅํ•ด์•ผ ํ•  ์ฝ”๋“œ์˜ ํ‘œ์ค€. - [[Ports_and_Adapters]]: ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜์—ฌ TDD๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ. - [[Mockito]]: TDD์—์„œ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์„ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ชจํ‚น ํ”„๋ ˆ์ž„์›Œํฌ. ## 1. ๊ฐœ์š” ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD, Test-Driven Development)์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค ๋ฆฌํŒฉํ† ๋ง์„ ๊ฑฐ์น˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. "์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ(Red) -> ํ…Œ์ŠคํŠธ ํ†ต๊ณผ(Green) -> ์ฝ”๋“œ ๊ฐœ์„ (Refactor)"์˜ ์งง์€ ์ฃผ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ์„ค๊ณ„์˜ ํ’ˆ์งˆ์„ ๋†’์ด๊ณ  ๊ฒฐํ•จ ์—†๋Š” ๊ฒฌ๊ณ ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ## 2. ํ•ต์‹ฌ ์‚ฌ์ดํด (Red-Green-Refactor) 1. **Red (์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ)**: ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•œ ์‹คํŒจํ•˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ. ์•„์ง ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋‹จ๊ณ„. 2. **Green (ํ…Œ์ŠคํŠธ ํ†ต๊ณผ)**: ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์ž‘์„ฑ. ์ฝ”๋“œ์˜ ํ’ˆ์งˆ๋ณด๋‹ค๋Š” ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋ผ๋Š” ๋ชฉ์ ์— ์ง‘์ค‘. 3. **Refactor (์ฝ”๋“œ ๊ฐœ์„ )**: ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋ฉฐ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ . TDD๋ฅผ ํ†ตํ•ด ํ™•๋ณด๋œ ํ…Œ์ŠคํŠธ๋ง ๋•๋ถ„์— ์•ˆ์ „ํ•œ ๋ฆฌํŒฉํ† ๋ง์ด ๊ฐ€๋Šฅํ•จ. ## 3. ์—”์ง€๋‹ˆ์–ด๋ง ๊ฐ€์น˜ - **๋†’์€ ์ฝ”๋“œ ์‹ ๋ขฐ์„ฑ**: ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ ์ž‘์„ฑ๋˜๋ฏ€๋กœ, ๋ฒ„๊ทธ ๋ฐœ์ƒ ํ™•๋ฅ ์ด ํ˜„์ €ํžˆ ๋‚ฎ์•„์ง€๋ฉฐ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ฝ”๋“œ๋กœ ์ •ํ™•ํžˆ ๊ตฌํ˜„๋˜์—ˆ์Œ์„ ๋ณด์žฅ. - **์„ค๊ณ„ ํ’ˆ์งˆ ํ–ฅ์ƒ**: ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค ๋…ธ๋ ฅํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ์‘์ง‘๋„๊ฐ€ ๋†’์•„์ง€๋Š” ๊ฑด์ „ํ•œ ์„ค๊ณ„ ์œ ๋„. - **์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ์šฉ์ด์„ฑ**: ์™„๋ฒฝํ•œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋ง๊ฐ€๋œจ๋ฆด ๊ฑฑ์ • ์—†์ด ์ฝ”๋“œ๋ฅผ ๋Œ€๋‹ดํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ฆฌ์  ์•ˆ์ „๋ง ์ œ๊ณต. - **์‚ด์•„์žˆ๋Š” ๋ฌธ์„œ**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์‹œ์Šคํ…œ์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ธฐ๋Œ€ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๋Š” ๊ฐ€์žฅ ์ •ํ™•ํ•˜๊ณ  ์ตœ์‹ ํ™”๋œ ๊ธฐ์ˆ  ๋ฌธ์„œ ์—ญํ• ์„ ์ˆ˜ํ–‰. ## 4. ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ - **๊ฐœ๋ฐœ ์†๋„์˜ ์ €ํ•˜**: ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ๋‹จ๊ธฐ์ ์ธ ๊ฐœ๋ฐœ ์†๋„๋Š” ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ. (์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ๋””๋ฒ„๊น… ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ ˆ๊ฐ์œผ๋กœ ์ƒ์‡„๋จ) - **๋ชจํ‚น(Mocking)์˜ ํ•จ์ •**: ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณผ๋„ํ•˜๊ฒŒ ๋ชจํ‚น์„ ์‚ฌ์šฉํ•˜๋ฉด, ์‹ค์ œ ์—ฐ๋™ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋†“์น˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๊ตฌํ˜„ ์ƒ์„ธ์— ๋„ˆ๋ฌด ์˜์กดํ•˜๊ฒŒ ๋  ์œ„ํ—˜์ด ์žˆ์Œ. - **ํ…Œ์ŠคํŠธ ์ž์ฒด์˜ ์œ ์ง€๋ณด์ˆ˜**: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ž˜๋ชป ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ๋Š” ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ์˜ ๋ฐœ๋ชฉ์„ ์žก๋Š” '๊นจ์ง€๊ธฐ ์‰ฌ์šด ํ…Œ์ŠคํŠธ(Fragile Test)'๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ. ## ๐Ÿงช ๊ฒ€์ฆ ์ƒํƒœ (Validation) - **์ •๋ณด ์ƒํƒœ**: ๊ฒ€์ฆ ์™„๋ฃŒ (Verified) - **์ถœ์ฒ˜ ์‹ ๋ขฐ๋„**: A - **๊ฒ€ํ†  ์ด์œ **: ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฒฐํ•จ์„ ์‚ฌ์ „์— ์˜ˆ๋ฐฉํ•˜๊ณ  ์ง€์† ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ฐœ๋ฐœ ์‹ค์ฒœ๋ฒ• ๋ฐ ์„ค๊ณ„ ๋„๊ตฌ ์ •๋ฆฝ.