-
Notifications
You must be signed in to change notification settings - Fork 4
TDD(Test Driven Development)
- TDD๋ Test-Driven-Development์ ์ฝ์๋ก ๋ง ๊ทธ๋๋ก ํ ์คํธ๊ฐ ์ด๋๋ ๊ฐ๋ฐ์ด๋ผ๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ด๋ค.
- ์์ฃผ ์งง์ ๊ฐ๋ฐ ์ฌ์ดํด์ ๋ฐ๋ณตํ๋ฉฐ, ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฑํํ๊ณ ์๋ ๋ฐฉ๋ฒ๋ก ์ค์ ํ๋์ด๋ค.
- ์๊ตฌ์ฌํญ์ ๊ฒ์ฆํ๋ ํ ์คํธ ์ผ์ด์ค ์์ฑ ~> ํ ์คํธ๋ฅผ ํต๊ณผํ๊ธฐ ์ํ ์ต์ํ์ ์ฝ๋ ๊ตฌํ ~> ์์ฑํ ์ฝ๋๋ฅผ ํ์ค(์๊ตฌ์ฌํญ ๋ช ์ธ)์ ๋ง๋๋ก ๋ฆฌํฉํ ๋ง
- ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๊ณ ํ ์คํธ๋ฅผ ํต๊ณผํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ๊ตฌํํ ๋, ์ค๊ณ ์์ ์ค์ ์ ๋น ๋ฅด๊ฒ ํ์ ํ์ฌ ์์ ํ๋ฉฐ ์งํํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
API ์๋ฒ์์ ์ ๋ ํ ์คํธ๋ฅผ ๊ฒ์ฆํ๋ฉฐ TDD ๋ฐฉ๋ฒ๋ก ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ์ ์งํํ๋ค.
- service์ api ๋ชจ๋ ํ
์คํธ๋ฅผ ์งํํ๋ฉฐ TDD๋ฅผ ํ๋ ๊ฒ์ด ์ ์์ด์ง๋ง, ํ ๊ณ ๋DO๋ฅผ ๊ฐ๋ฐํ ๋๋ API ํ
์คํธ๋ง ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
- ์ด์ 1) MVCS์์ ์๋น์ค ๋จ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ ๊ฐ๋ ์ด ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์, MVC๋ก ์ค๊ณํ ํ์ ํ์ํ๋ฉด MVCS๋ก ๋ฆฌํฉํ ๋ง ํ๋ ๊ฒ์ผ๋ก ๊ฒฐ์
- ์ด์ 2) ๊ธฐ๋ฅ ๊ตฌํ์ ์ฐ์ ์์์ ๋๊ณ , validation๊ณผ ์๋ฌ ์ฒ๋ฆฌ๋ ์ด๋ ์ ๋ API ์๋ต์ด ๊ฐ์ถฐ์ง ์ดํ ์งํํ์๋ ์๊ฒฌ
์ค์ ๋ก TDD๋ฅผ ๋์ ํ ์ฌ๋ก
-
API ๊ตฌํ
- ๋ค์์ ํ ๊ณ ๋DO ์๋น์ค์์ ํน์ ์ ์ ์ ๋ชจ๋ ํ ์ผ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ API๋ฅผ ๊ตฌํํ ๋ ์งํํ๋ ์ฝ๋์ ์ผ๋ถ๋ถ์ด๋ค.
- ๋จผ์ , API ๋ช ์ธ์ ๋ฐ๋ผ์ ๋ฐํ๋ผ์ผํ๋ response ๊ฐ์ ๋ฏธ๋ฆฌ ์ ํด๋๊ณ , ์ด์ ๋ง์ถ์ด ๊ฐ๋ฐ์ ์งํํ๋ค.
- ์ดํ, API URL์ ๋ฐ๋ผ router์ ๋ฑ๋กํ๊ณ , controller์์ ์์ฒญ์ ๋ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฐ๊ฒฐํ๊ณ ์๋ต ๊ฐ์ ๋ฐํ ~> service ๋จ์ ๋น์ฆ๋์ค๋ก์ง ์์ฑ ์์๋ก ์งํํ๋ค.
- ์ฒ์ MVC ํจํด์ผ๋ก ์งํํ ๋๋, controller์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ์๋๋ฐ, ์ด๋ ์๋ชป๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฉํ ๋๊ป์ controller์ ์ฑ ์์ด ์๋๋ฐ ์ฑ ์์ ์ฃผ์๋ค๊ณ ๋ง์ํ์ จ๋ค.
- controller์ ์ฑ ์์ ์์คํ ์ ์ฌ์ฉํ๊ธฐ ์ํ ์ธํ๋ผ์ ๊ด๋ จ๋ ์ญํ ๋ง์ ํ๋ค (validation ๋ฑ)
- ๋น์ฆ๋์ค ๋ก์ง์ด๋, ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๊ณ ์ฌ์ฉํ ๊ฑด์ง์ ๊ด๋ จ๋ ๋ด์ฉ๋ค์ ๋ด๋นํ๋ค.
-
validation & ์๋ฌ ์ฒ๋ฆฌ
- ๋ค์์ ํ ๊ณ ๋DO ์๋น์ค์์ ์์ ์ ์น์ ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ API๋ฅผ ๊ตฌํํ ๋ ์งํํ๋ ์ฝ๋์ ์ผ๋ถ๋ถ์ด๋ค.
- API ์๋ต์ ๋ํ ์์ธ ์ผ์ด์ค๋ค์ ์์ฑํ ๋ค์, router -> controller -> dto -> service ์์๋ก ์งํํ๋ค.
์ฅ์
-
MVC to MVCS
- controller์์ ๋น์ฆ๋์ค ๋ก์ง์ service ๋จ์ผ๋ก ์ฎ๊ธฐ๋ฉด์, ๋ฏฟ๋ ๊ตฌ์์ด ์์ด์ ์์ ์๊ฒ ๊ตฌ์กฐ๋ฅผ ์์ ํ ์ ์์๋ค.
- ๋ํ, ์ฐ๊ฒฐ์ด ์ ๋์๋์ง ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๋ฉฐ ํ์ธํ ์ ์์๊ณ , ๋ฌธ์ ๊ฐ ์๊ธด ๋ถ๋ถ๋ง ์์ ํ๋ฉด ๋ผ์ ํธํ๋ค.
-
validation & ์๋ฌ ์ฒ๋ฆฌ
- class-validator๋ฅผ ์ฒ์ ์จ์ class-validator ๋ฐ์ฝ๋ ์ดํฐ์ ๋ง์ด ๋ฏธ์ํ๋ค.
๊ณต์ ๋ฌธ์์ ์น์ ํ ์ฌ์ฉ๋ฒ์ด ๋ง์ง ์๊ณ TypeScript๊ฐ ์๋ JavaScript๋ก ์ฌ์ฉํ๋ ์์๋ ์์ด์ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ง์ ํ์ธํ๋ค.
๋ฏธ๋ฆฌ ์์ฑํด๋ ํ ์คํธ ์ผ์ด์ค ํต๊ณผ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ฉฐ ์ฌ๋ฐ๋ฅด๊ฒ validation์ ํ๊ณ ์๋์ง ์ ์ฉํ๊ฒ ์ฌ์ฉํ๋ค.
์๋ฌ ์ฒ๋ฆฌ ๋ํ, ์ ๋๋ก ์๋ฌ๋ฅผ ์ก๊ณ ์๋์ง ์ ์ํด๋๋๋ก custom ์๋ฌ๊ฐ ๋ฐํ๋๋์ง ์ ์ฉํ๊ฒ ํ์ธํ ์ ์์๋ค.
- class-validator๋ฅผ ์ฒ์ ์จ์ class-validator ๋ฐ์ฝ๋ ์ดํฐ์ ๋ง์ด ๋ฏธ์ํ๋ค.
-
๋น ๋ฅธ ๊ฐ๋ฐ
- ํ๋จ์ ์ธ๊ธํ ๋จ์ ๊ณผ ๋๋น๋๊ฒ ์ง๋ง, ์ด๋ป๊ฒ TDD๋ฅผ ํด์ผํ๋๊ฐ์ ๋ํ ๊ฐ์ด ์จ ๋ค ๋ถํฐ๋ ๊ฐ๋ฐ ์๋๊ฐ ์ ๋ง ๋นจ๋ผ์ง๋ค.
- ์๋ฌ ์ฒ๋ฆฌ๋ validation, ์ฌ์ํ ์คํ, ๋ก์ง ๋ฑ ๊ตฌ์กฐ๊ฐ ์กํ๋ฉด์ ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ์ฝ๋๋ฅผ ์ ๋ฉด์ ์ผ๋ก ์์ ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ํ์ ํ ์ค์ด๋ ๋ค.
- ๋ฌด์๋ณด๋ค๋ test code๊ฐ ํต๊ณผ๋๋ ๊ฒ์ ํ์ธํ๋ฉด์ ๊ฐ๋ฐํ ๋ง์ด ๋๋ค๋ ๋๋์ ๋ฐ์ ์ ์์๋ค.
-
๊ธฐํ
- ์์ ์ฌํญ๋ค ์ธ์๋ ์ฌ์ํ ์คํ๋, ๋ก์ง์ด ์๋ชป๋ ๊ฒฝ์ฐ์ ์ด๋ค ๋ถ๋ถ์ ํ์ธํด์ผํ๋์ง ํ ์คํธ ์ผ์ด์ค์ ์ ์ํด ๋ ์ด๋ฆ์ ํตํด ์ญ์ถ์ ํ๋ฉฐ ํธํ๊ฒ ์์ ํ ์ ์์๋ค.
๋จ์
-
Test code๋ฅผ ์์ฑํด๋ณด์ง ์์๋ค๊ฑฐ๋, API ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ํด์ผํ๋์ง, db๋ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผํ๋์ง ์ ๋ชจ๋ฅด๋ ์ํ์์ ์๋กญ๊ฒ ๋ฐฐ์ด๋ค๋ ๋ฌ๋์ปค๋ธ๋ฅผ ๋ฌด์ํ ์ ์๋ค.
- ์ ๋ฒ ํ๋ก์ ํธ์์ ์ฒ์ TDD๋ฅผ ์งํํ๊ณ , API test๋ฅผ ์ฒ์ ํด๋ณด๋ฉด์ ์ด๋ป๊ฒ TDD๋ฅผ ํด์ผํ๋์ง ๊ฐํผ๋ฅผ ์ ๋ชป์ก์์๋ ๊ธฐ์ต์ด ๋๋ค.
- ํ๋ํ๋ ์๋กญ๊ฒ ๋ฐฐ์์ผ ํ๋ค๋ ๋ถ๋ด๊ฐ์ด ์ ์ง๋ ์์ ๊ฒ ๊ฐ์์ ๋จ์ ์ผ๋ก ๋๊ผ์๋ค.
-
๊ธฐํ์ ํฐ ๋ฐฉํฅ์ด ๋ฐ๋๋ ๊ฒฝ์ฐ test code ๋ฆฌํฉํ ๋ง์ด ํ์ํ๋ค.
- ํ ๊ณ ๋DO์ ์๋น์ค๋ 3์ฃผ, 4์ฃผ ์ฐจ์ ํฐ ๋ฆฌํฉํ ๋ง์ ์งํํ์๋ค. ์ด ๋, ์ฒ์์ ๊ธฐํํ๊ณ ์ ์ํ๋ ์ฌํญ๋ค์ด ํฌ๊ฒ ๋ณํ๋ฉด์ ํ๋ค์๋ ๊ธฐ์ต์ด ๋๋ค.
๋ณตํฉ์ ์ผ๋ก ์์ ํด์ผํ๋ ์ํฉ์์ ํ ์คํธ ์ฝ๋์ ์ ๋ฉด์ ์ธ ์์ ์ ์์ํ ์๊ฐ์ด ์ ์ง ์์๊ณ ,
- ํ ๊ณ ๋DO์ ์๋น์ค๋ 3์ฃผ, 4์ฃผ ์ฐจ์ ํฐ ๋ฆฌํฉํ ๋ง์ ์งํํ์๋ค. ์ด ๋, ์ฒ์์ ๊ธฐํํ๊ณ ์ ์ํ๋ ์ฌํญ๋ค์ด ํฌ๊ฒ ๋ณํ๋ฉด์ ํ๋ค์๋ ๊ธฐ์ต์ด ๋๋ค.
-
๋ชจ๋ ํ์์ TDD๋ฅผ ์ ์ฉํ์ง ์๊ฑฐ๋ ์ด๋ ์ผ์ด์ค ๋ฒ์๊น์ง test๋ฅผ ์งํํ ๊ฒ์ธ์ง ๋ ผ์๊ฐ ๋์ง ์์ ํ๋ก์ ํธ์์๋ ์ฌ์ฉํ๊ธฐ ํ๋ค๋ค.
- ํ ๊ณ ๋DO์์๋ ๋ฐฑ์๋ ๊ตฌํ ์, TDD๋ฅผ ์งํํ๋๋ฐ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ณด๋ ๋๊ตฐ๊ฐ๊ฐ TDD๋ฅผ ํ์ง ์๋๋ค๋ฉด ํด๋น ๊ธฐ๋ฅ์ ๋ํ ๋ถ์๊ฐ์ด ์กด์ฌํ ์ ์๋ค๊ณ ๋๊ผ๋ค.
- ์ค์ ํ์ ์์ ๋ง์ ํ๋ค์ด TDD๋ฅผ ์ฝ๊ฒ ๋์ ํ ์ ์๋ ์ด์ ๊ฐ ์์ ๋ ์ด์ ๋ผ๊ณ ํ๋ค.
- ํ ๊ณ ๋DO์์๋ ์ด๋ ์ผ์ด์ค ๋ฒ์๊น์ง testํ ์ง ์ ํ์ง ์์๋๋ฐ, ๋ฐฑ์๋ ๋ฆฌํฉํ ๋ง์ ์งํํ๋ฉด์ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ํ์ธํ๊ธฐ ํ๋ค์๋ค.
์ด ๊ฒฝํ์ ํ ๋๋ก, ์์ผ๋ก TDD๋ฅผ ์ฑํํ๊ฒ ๋๋ค๋ฉด ๊ฒ์ฆํ ์ผ์ด์ค ๋ฒ์๋ฅผ ๋ฏธ๋ฆฌ ๋ง์ถ๊ณ ์งํํด์ผํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
- ํ ๊ณ ๋DO์์๋ ๋ฐฑ์๋ ๊ตฌํ ์, TDD๋ฅผ ์งํํ๋๋ฐ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ณด๋ ๋๊ตฐ๊ฐ๊ฐ TDD๋ฅผ ํ์ง ์๋๋ค๋ฉด ํด๋น ๊ธฐ๋ฅ์ ๋ํ ๋ถ์๊ฐ์ด ์กด์ฌํ ์ ์๋ค๊ณ ๋๊ผ๋ค.
TDD๋ฅผ ํ๋ค๊ณ ๋งํ๋ฉด์ ์กฐ๊ธ ๋ถ๋๋ฝ์ง๋ง, ์ฌ์ค ํ๋ก์ ํธ๊ฐ ๋ง๋ฌด๋ฆฌ๋๋ ๋จ๊ณ์์ test coverage๋ฅผ ์ ํ๊ฒ ๋์๋ค.
test coverage๋ ํ์ฌ ์์ฑ๋ test code๊ฐ ๊ตฌํ๋์ด ์๋ ์๋น์ค์์ ์ด๋ ์์ค์ผ๋ก ๊ฒ์ฆํด์ฃผ๊ณ ์๋์ง ์ฒ๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
ํ ๊ณ ๋DO์์๋ Jest๋ก ๋ชจ๋ ํ
์คํธ๋ฅผ ์งํํ๋๋ฐ, coverage option์ ์ ๊ณตํ๋ค.
๋ณดํต์ istanbul์ ์ด์ฉํ๋ค๊ณ ํ๋๋ฐ, Jest์ ์ด istanbul์ด ๋ด์ฅ๋์ด ์๋ค๊ณ ํ๋ค.
์ฌ์ฉ๋ฒ
- test ์คํ ์ต์ ์ --coverage๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด coverage ์์น๋ฅผ console์ ๋ณด์ฌ์ฃผ๋ฉฐ, npm ์คํ๊ณผ ๊ฐ์ ๋ ๋ฒจ์ ๋๋ ํ ๋ฆฌ์ coverage๋ผ๋ ๋ํ ํ ๋ฆฌ๋ฅผ ์์ฑํด์ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ค.
- ์คํ ํ์ console์ ์์ ๊ฐ์ ํ์์ผ๋ก ์ด๋ค ํ์ผ์ ์ด๋ค ๋ถ๋ถ์ ํ ์คํธ ํ๊ณ ์๊ณ ๋๋ฝ๋์๋์ง %๋ก ํ์ํด์ค๋ค.
ํ ๊ณ ๋DO์ ๊ฒฐ๊ณผ
์กฐ๊ธ ๋ถ๋๋ฝ์ง๋ง ์ฒ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ ๊ฒ ์น๊ณ ๋ ๊ฝค๋ ๋์ ์์น๊ฐ ๋์จ ๊ฒ ๊ฐ๋ค.
๋ถ๊ณผ 2๋ฌ ์ ์ฏค์ ์ ์ฒ๋ผ TDD์ ๋ํด ๋๋ ต๊ฑฐ๋ ์ด๋ป๊ฒ ํด์ผํ๋๊ฑฐ์ง??? ๋ผ๊ณ ์๊ฐํ๋ ๋ถ๋ค์๊ฒ ๋์์ด ๋๋ฉด ์ข๊ฒ ๋ค๋ ๋ง์์ ์ด ๊ธ์ ๋จ๊น๋๋ค.
Reference