๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

Chp 2. ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž

by coderSohyun 2023. 8. 19.

์š”์ฆ˜ ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค ํšŒ์‚ฌ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๊ด€ํ•ด ์š”๊ตฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

์š”์ฆ˜ ์„ ๋งํ•˜๋Š” ์„œ๋น„์Šค ํšŒ์‚ฌ์— ์ทจ์—…๊ณผ ์ด์ง์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ ˆ๋Œ€ ๋น ์งˆ ์ˆ˜ ์—†๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.

 

์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค.

 

2.1 ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์†Œ๊ฐœ

TDD๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์ฃผ๋„ํ•˜๋Š” ๊ฐœ๋ฐœ์„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. 

- TDD : RED -> GREEN -> REFACTOR

RED : ํ•ญ์ƒ ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ 

GREEN : ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š” ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ 

REFACTOR : ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค

 

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” TDD์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ธ ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. TDD์™€ ๋‹ฌ๋ฆฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ผญ ๋จผ์ € ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ , ๋ฆฌํŒฉํ† ๋ง๋„ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ์žฅ์—์„œ๋Š” TDD๊ฐ€ ์•„๋‹Œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค. 

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์™œ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ์š”?

- ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๊ฐœ๋ฐœ๋‹จ๊ณ„ ์ดˆ๊ธฐ์— ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค

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

- ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ถˆํ™•์‹ค์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

- ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์‹ค์ œ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž์ฒด๊ฐ€ ๋ฌธ์„œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

- ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ 

- ์™œ ๊ณ„์† ํ†ฐ์บฃ์„ ๋‚ด๋ ธ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ์ผ์„ ๋ฐ˜๋ณตํ• ๊นŒ์š”? -> ์ด๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค ๋ณด๋‹ˆ ๋ˆˆ๊ณผ ์†์œผ๋กœ ์ง์ ‘ ์ˆ˜์ •๋œ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•  ์ˆ˜๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฏ€๋กœ ๊ตณ์ด ์†์œผ๋กœ ์ง์ ‘ ํ†ฐ์บฃ์„ ๊ณ„์† ์˜ฌ๋ ธ๋‹ค ๋‚ด๋ ธ๋‹ค ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 

 

- System.out.println() ์„ ํ†ตํ•ด ๋ˆˆ์œผ๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ -> ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋”๋Š” ์‚ฌ๋žŒ์˜ ๋ˆˆ์œผ๋กœ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ฒŒ ์ž๋™๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•จ. ์ˆ˜๋™๊ฒ€์ฆ์€ ํ•„์š”์—†๊ฒŒ ๋จ

 

- ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ๊ธฐ๋Šฅ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•ด ์คŒ

์˜ˆ๋ฅผ ๋“ค์–ด B๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. B๊ธฐ๋Šฅ์ด ์ž˜ ๋˜์–ด ์˜คํ”ˆํ–ˆ๋”๋‹ˆ ๊ธฐ์กด์— ์ž˜๋˜๋˜ A๊ธฐ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋„ˆ๋ฌด๋‚˜~

-> ์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ, ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ์ž˜ ์ž‘๋™๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ~

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค

๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋Š” xUnit์ด ์žˆ๋Š”๋ฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ(x)์— ๋”ฐ๋ผ Unit ํ…Œ์ŠคํŠธ๋ฅผ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ xUnit ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

JUnit - Java

DBUnit - DB

CppUnit - C++

NUnit - .net

 

์ด ์ค‘์—์„œ ์ž๋ฐ”์šฉ์ธ JUnit์„ ์•ž์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

2.2 Hello Controller ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ 

 

๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ Application ํด๋ž˜์Šค๋Š” ์•ž์œผ๋กœ ๋งŒ๋“ค ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ ํด๋ž˜์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

@SpringBootApplication์œผ๋กœ ์ธํ•ด ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ์ž๋™ ์„ค์ •, ์Šคํ”„๋ง Bean ์ฝ๊ธฐ์™€ ์ƒ์„ฑ์„ ๋ชจ๋‘ ์ž๋™์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ๋‚˜ @SpringBootApplication์ด ์žˆ๋Š” ์œ„์น˜๋ถ€ํ„ฐ ์„ค์ •์„ ์ฝ์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ด ํด๋ž˜์Šค๋Š” ํ•ญ์ƒ ํ”„๋กœ์ ํŠธ์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. 

~ ์„ค๋ช…

 

Application ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋๋‚ฌ์œผ๋‹ˆ, ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Controller๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ํ˜„์žฌ ํŒจํ‚ค์ง€ ํ•˜์œ„์— web์ด๋ž€ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค์€ ๋ชจ๋‘ ์ด ํŒจํ‚ค์ง€์— ๋‹ด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

์ƒ์„ฑ๋์œผ๋ฉด ๊ฐ„๋‹จํ•œ API๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์„ค๋ช…

1. @RestController

์ปจํŠธ๋กค๋Ÿฌ๋ฅผ JSON์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค

2. @GetMapping

HTTP Method์ธ Get์˜ ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” API๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

 

์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋„ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. WAS๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๊ฒ€์ฆํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.