TDD
Last updated
Was this helpful?
Last updated
Was this helpful?
์ฐธ๊ณ ๋์์
https://howtodoinjava.com/spring-boot2/testing/spring-boot-mockmvc-example/
Test Driven Development ์ ์ค์ธ๋ง์ผ๋ก, ๊ฐ์ฅ ์ค์ํ ๊ฒ์
ํ ์คํธ๋ฅผ ๋จผ์ ๋ง๋ค๊ณ , ์ด ํ ์คํธ๋ฅผ ํต๊ณผํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ
์ด๋ฐ ๊ฐ๋ ์ด๋ค
์ด๋ฌํ ๋ฐฉ์์ ์ฌ์ฉํด์ ์ ๋์ํ๊ณ , ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ฃผ ๋ชฉ์ ์ด๋ค
์ธ์ ์ฌ์ฉํด์ผํ๋?
์ฒ์ํด๋ณด๋ ํ๋ก๊ทธ๋จ ์ฃผ์
๊ณ ๊ฐ์ ์๊ตฌ์กฐ๊ฑด์ด ๋ฐ๋ ์ ์๋ ํ๋ก์ ํธ
๊ฐ๋ฐํ๋ ์ค์ ์ฝ๋๋ฅผ ๋ง์ด ๋ฐ๊ฟ์ผ ๋๋ค๊ณ ์๊ฐํ๋ ๊ฒฝ์ฐ
๋ด๊ฐ ๊ฐ๋ฐํ๊ณ ๋์ ์ด ์ฝ๋๋ฅผ ๋๊ตฐ๊ฐ ์ ์ง๋ณด์ํ ์ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ
=> ๋ถํ์ค์ฑ์ด ๋์ ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค!
์งํ๋ฐฉ์(์ ์ฐจ)
Ask : ํ ์คํธ ์์ฑ์ ํตํด ์์คํ ์ ์ง๋ฌธ - ํ ์คํธ ์ํ ์คํจ
Respond : ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ ์ง๋ฌธ์ ๋๋ต - ํ ์คํธ ์ฑ๊ณต
Refine : ์์ด๋์ด๋ฅผ ํตํฉํ๊ณ , ๋ถํ์ํ ๊ฒ์ ์ ๊ฑฐํ๊ณ , ๋ชจํธํ ๊ฒ์ ๋ช ํํ ํด์ ๋๋ต์ ์ ์ - ๋ฆฌํฉํ ๋ง
์์ค์ ๊ฐ๋ ์ฑ์ด ์ ์ ํ๊ฐ?
์ค๋ณต๋ ์ฝ๋๋ ์๋๊ฐ?
์ด๋ฆ์ด ์๋ชป ๋ถ์ฌ๋ ๋ฉ์๋๋ ๋ณ์๋ช ์ ์๋๊ฐ?
๊ตฌ์กฐ์ ๊ฐ์ ์ด ํ์ํ ๋ถ๋ถ์ ์๋๊ฐ?
Repeat : ๋ค์์ผ๋ก ๋์ด๊ฐ์ ๊ณ์ ์งํ
ํ๋์ ๋ชจ๋์ ๊ธฐ์ค์ผ๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์งํ๋๋ ๊ฐ์ฅ ์์ ๋จ์์ ํ ์คํธ
๋ชจ๋ : ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ํ๋ ํ๋์ ๊ธฐ๋ฅ ๋๋ ๋ฉ์๋
โ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ํ๋์ ๊ธฐ๋ฅ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธ
๋จ์ ํ ์คํธ๋ ์ํ๋ ๋ถ๋ถ๋ง ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ๋ฌธ์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
Behavior-driven development์ ์ฝ์๋ก ํ์ ์ฃผ๋ ๊ฐ๋ฐ์ด๋ผ๊ณ ํด์ํ ์ ์๋ค. โ ์ฌ๊ธฐ์ ํ์๋ ๋น์ง๋์ค ์๊ตฌ ์ฌํญ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค
ํจ์ ๋จ์์ ํ ์คํธ๋ฅผ ๊ถ์ฅํ์ง ์๊ณ , ์๋๋ฆฌ์ค ๊ธฐ๋ฐ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค
Feature : ํ ์คํธ์ ๋์์ ๊ธฐ๋ฅ / ์ฑ ์์ ๋ช ์
Scenario : ํ ์คํธ ๋ชฉ์ ์ ๋ํ ์ํฉ์ ์ค๋ช
Given : ์๋๋ฆฌ์ค ์งํ์ ํ์ํ ๊ฐ์ ์ค์
When : ์๋๋ฆฌ์ค๋ฅผ ์งํํ๋๋ฐ ํ์ํ ์กฐ๊ฑด์ ๋ช ์
Then : ์๋๋ฆฌ์ค๋ฅผ ์๋ฃํ์ ๋ ๋ณด์ฅํด์ผ ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ช ์
ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ์์๊ณผ ๊ฐ์์ง๋ฅผ ํ๋ณํด์ฃผ๋ ๋จ์ ๋ฌธ(assertions)
์ฌ๋ฌ ํ ์คํธ์์ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํ ์คํธ ํฝ์ค์ฒ(test fixture)
ํ ์คํธ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ ์ ์๋๋ก ๋์์ฃผ๊ณ , ๋งค๋ฒ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฐ์ด ๋๋ ์ํ๋ ํ๊ฒฝ
ํ ์คํธ ์์ ์ ์ํํ ์ ์๊ฒ ํด์ฃผ๋ ํ ์คํธ ๋ฌ๋(test runner)
Junit3์์๋ setUp๊ณผ tearDown์ด๋ผ๋ ๋ ๊ฐ์ ํ ์คํธ ํฝ์ค์ฒ ๋ฉ์๋๋ฅผ ์ง์ํ๋ค
setUp์ ํ ์คํธ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ๊ณตํต์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋
tearDown์ ํ ์คํธ ๋ฉ์๋๊ฐ ์ํ๋๊ณ ๋์ ๋ค์์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋
test suite : ์ฌ๋ฌ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํ๊บผ๋ฒ์ ์ํํ๊ณ ์ ํ ๋
Junit4๋ถํฐ๋
@Test : ๋ฉ์๋์ ์ด๋ฆ๊ณผ๋ ๊ด๊ณ์์ด ์ด ์ ๋ ธํ ์ด์ ๋ง ๋ถ์ด๋ฉด ํ ์คํธ ๋ฉ์๋๋ก ์ธ์ํ๊ฒ ๋๋ค.
@Ignore๋ฅผ ์ฌ์ฉํด์ ์ํ๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ๋ฌด์ํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
Junit3์์ ์ฌ์ฉํ๋ setUp๊ณผ tearDown์ @Before๋ @After๋ก ๋์ ํด์ ์ฌ์ฉ
@BeforeClass, @AfterClass๋ฅผ ์ฌ์ฉํด์ ํ๋์ ํ ์คํธ ํด๋์ค ๋ด์์ ํ๋ฒ๋ง ์คํํ๋ ๋ฉ์๋ ์์ฑ ๊ฐ๋ฅ
fail() ํจ์ : Junit์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ก, ํธ์ถ๋๋ ์๊ฐ ํด๋น ํ ์คํธ ์ผ์ด์ค๋ ๋ฌด์กฐ๊ฑด ์คํจ = throw new Exception
์ค๋ฅ vs ์คํจ : ์ค๋ฅ๋ ์์ฑ์๊ฐ ์๋ํ์ง ์์ ์์์น ๋ชปํ ์คํจ๋ฅผ ์๋ฏธํ๊ณ , ์ด๋ ์ผ์ด์ค ์์ฒด์ ๋ฌธ์ ๊ฐ ์์์ ์๋ฏธ
assertEquals ํจ์ : ์์๊ฐ๊ณผ ์ค์ ๊ฐ์ ๋น๊ตํ๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด ์คํจ
assertEquals(์์๊ฐ, ์ค์ ๊ฐ) ํ์์ผ๋ก ์ฌ์ฉ
assertArrayEquals(์์๊ฐ, ์ค์ ๊ฐ) ํ์์ ์ฌ์ฉํด์ ๋ฐฐ์ด์ ๋น๊ตํ๋ ๊ฒ๋ ๊ฐ๋ฅ
@Before : ๊ฐ ํ ์คํธ ์ผ์ด์ค๊ฐ ์คํ๋๊ธฐ ์ ์ ์ด๊ฑธ๋ก ํ์ํด๋ ๋ฉ์๋๊ฐ ๋จผ์ ์คํ๋๋ค
@RunWith : ์ฌ๊ธฐ์ ์ธ์๋ก ๋ฃ์ด์ค ํด๋์ค๋ฅผ ์ด์ฉํด์ ํด๋์ค ๋ด์ ํ ์คํธ ๋ฉ์๋๋ฅผ ์ํํ๋๋ก ์ง์ ํด์ค๋ค
Spring์์๋ SpringJUnit4ClassRunner๋ฅผ ์ธ์๋ก ์์ฃผ ๋ฃ์ด์ ์ฌ์ฉํด์ฃผ๋๋ฐ, ์ง์ ํด๋๋ฉด Repeat, ProfileValueSourceConfiguration๋ฑ ์คํ๋ง์์ ์์ฒด์ ์ผ๋ก ๋ง๋ค์ด๋ ํ ์คํธ ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
@SuiteClasses๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ ์ด๊ฑด ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ํด๋์ค๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ํํ๋ค. ์ธ์๋ฅผ ๋ฃ์ด์ค ์์๋๋ก ์์ฐจ์ ์ผ๋ก ์คํ
Hamcrest
Matcher ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํ ์คํธ ํํ์์ ์์ฑํ ๋ ์ข ๋ ๋ฌธ๋งฅ์ ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.
Matcher๋ ๊ฐ๋ค์ ๋ํด์ ์ผ์น๋ ๊ท์น์ค์ ๋ฑ์ ํ๋ณํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง ๋ฉ์๋๋ ๊ฐ์ฒด์ด๋ค.
์์๋ก ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ assertEquals ๋ง๊ณ assertThat์ ์ฌ์ฉํ๋ผ๊ณ ๊ถ์ฅํ๋๋ฐ ์ด๊ฑด ๋ฌธ๋งฅ์ ์ผ๋ก๋ ๋ ์์๋ณด๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค
assertThat(ํ ์คํธ๋์, matcher๊ตฌ๋ฌธ) / assertThat("๋ฉ์ธ์ง", ํ ์คํธ ๋์, matcher ๊ตฌ๋ฌธ)
@Ignore๋ฅผ ์ฌ์ฉํด์ ์ํ๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ๋ฌด์ํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋์ ๊ฒ๋ชจ์์ด ์ค์ ๋ชจ๋๊ณผ ๋น์ทํ๊ฒ ๋ณด์ด๋๋ก ๋ง๋ ๊ฐ์ง ๊ฐ์ฒด
๊ธฐ๋ณธ์ ์ธ ๋ถ๋ฅ ๊ฐ๋
ํ ์คํธ ๋๋ธ์ด๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋๋ฐ, ์ด๊ฑด ์ค๋ฆฌ์ง๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ๋ฅผ ์งํํ๊ธฐ ์ด๋ ค์ธ ๊ฒฝ์ฐ, ์ด๋ฅผ ๋์ ํด์ ํ ์คํธ๋ฅผ ์งํํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธ
๋๋ฏธ ๊ฐ์ฒด : ๋ฉ์ฒญํ ๋ชจ์กฐํ, ๋จ์ํ ๊ป๋ฐ๊ธฐ๋ฅผ ์๋ฏธํ๊ณ ์ค๋ก์ง ์ธ์คํด์คํ๋ ์ ์๋ ์์ค์ผ๋ก๋ง ๊ตฌํํ ๊ฐ์ฒด โ ์ธ์คํด์คํํ ๊ฐ์ฒด๊ฐ ํ์ํ ๋ฟ, ํด๋น ๊ฐ์ฒด์ ๊ธฐ๋ฅ๊น์ง๋ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉ - ํ์ ๊ธฐ๋ณธ๊ฐ((), null, false ๋ฑ)์ผ๋ก ๋ฐํ๊ฐ์ ๋ง๋ค์ด์ฃผ๋ ์ ์ผ๋ก๋ง / ๋ง์ฝ ํธ์ถ ์์๋ ์์ธ๋ฅผ ๋ฐ์์ํค๊ฒ ๋ง๋ค์ด๋ฌ์ผํจ
ํ ์คํธ ์คํ : ๋๋ฏธ ๊ฐ์ฒด๊ฐ ๋ง์น ์ค์ ๋ก ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ค์ด๋ ๊ฐ์ฒด / ๊ฐ์ฒด์ ํน์ ์ํ๋ฅผ ๊ฐ์ ํด์ ๋ง๋ค์ด๋ ๋จ์ ๊ตฌํ์ฒด / ํน์ ํ ๊ฐ์ ๋ฆฌํดํด์ฃผ๊ฑฐ๋ ํน์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๋ฑ์ ์์
ํ์ดํฌ ๊ฐ์ฒด : ์คํ ๊ณผ ๋น์ทํ์ง๋ง ์คํ ์ ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ํํ๋๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ ๋นํด์ ํ์ดํฌ ๊ฐ์ฒด๋ ์ฌ๋ฌ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ํํ ์ ์๋ ๊ฒฝ์ฐ๋ ์ข ๋ ๋ณต์กํ ๊ตฌํ์ด ๋ค์ด๊ฐ์๋ ๊ฐ์ฒด๋ฅผ ์ง์นญ โ ํ ์คํธ์ ์ฌ์ฉํ ์์ดํ ๊ณผ ์นดํ ๊ณ ๋ฆฌ์ ๋ํด์๋ง ์ค์ ๋ก DB์ ์ ์ํด์ ๋น๊ตํ ๋์ ๋์ผํ ๋ชจ์ต์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ ๋ค. ์ฌ๊ธฐ์๋ Map์ด๋ List๋ฅผ ์ด์ฉํด์ DB๊ฐ์ ์ธ๋ถ ์์กด ํ๊ฒฝ์ ๋์ฒดํ๋ค
ํ ์คํธ ์คํ์ด : ํ ์คํธ ๋ด์์ ๊ฐ์ฒด์ ํธ์ถ, ๊ทธ ๊ฐ์ฒด์ ๋ฉ์๋ ๋ฑ ํธ์ถ ์ฌ๋ถ๋ฅผ ๋ชฐ๋ ๊ฐ์ํด์ ๊ธฐ๋กํ๋ค๊ฐ ๋์ค์ ์์ฒญ์ด ์ค๋ฉด ๊ธฐ๋ก ์ ๋ณด๋ค์ ๊ฐ์ง๊ณ ์๋ค๊ฐ ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํ๋ ํ ์คํธ ๋๋ธ โ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๊ณ , ํ ์คํธ ์คํ์ด๊ฐ ํ์ํด๋ Mock์์ ์ง์์ ํ๊ธฐ ๋๋ฌธ์ ์ง์ํด์ฃผ๋๊ฑฐ ์ฌ์ฉ
Mock ๊ฐ์ฒด : ์ผ๋ฐ์ ์ธ ํ ์คํธ ๋๋ธ์ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋๋ฐ Mock ๊ฐ์ฒด๋ ํ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค.
Mock ํ๋ ์์ํฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ ๋์ ์ผ๋ก Mock ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํ๋ ์์ํฌ๋ฅผ ์๋ฏธํ๋ค. ์คํํ๋ ๋ฉ์๋ ์์ฑ ๊ฐ๋ฅ
์ฅ์
Mock ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํด์ ๋ช ์์ ์ธ ํด๋์ค๋ก ๋ง๋ค์ง ์์๋ ๋๋ค.
Mock ๊ฐ์ฒด์ ๋ํด์ ํ์๊น์ง๋ ํ ์คํธ ์ผ์ด์ค์ ํฌํจ์ํฌ ์ ์๋ค.
์์
EasyMock
jMock
Mockito
assertArrayEquals(์์๊ฐ, ์ค์ ๊ฐ) ํ์์ ์ฌ์ฉํด์ ๋ฐฐ์ด์ ๋น๊ตํ๋ ๊ฒ๋ ๊ฐ๋ฅ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ์คํ๋ง MVC์ ๋์์ ์ฌํํ ์ ์๊ฒ ํด์ฃผ๋ ํด๋์ค
์ ์ฉ๊ณผ์
@WebMvcTest(ํ ์คํธํ๋ ค๋ ์ปจํธ๋กค๋ฌ์ด๋ฆ.class)
MVC๋ฅผ ์ํ ํ ์คํธ ์ ๋ ธํ ์ด์ ์ด
์น์์์์ request, response์ ๋ํด์ ํ ์คํธํ๋ ๊ฒ์ด ๊ฐ๋ฅ
Controller, ControllerAdvice, JsonComponent, Converter, GenericConverter, ๋ฑ ์ ํ๋ ๋ด์ฉ๋ง ์ค์บ
@RunWith : ์ฌ๊ธฐ์ ์ธ์๋ก ๋ฃ์ด์ค ํด๋์ค๋ฅผ ์ด์ฉํด์ ํด๋์ค ๋ด์ ํ ์คํธ ๋ฉ์๋๋ฅผ ์ํํ๋๋ก ์ง์ ํด์ค๋ค
Spring์์๋ SpringJUnit4ClassRunner๋ฅผ ์ธ์๋ก ์์ฃผ ๋ฃ์ด์ ์ฌ์ฉํด์ฃผ๋๋ฐ, ์ง์ ํด๋๋ฉด Repeat, ProfileValueSourceConfiguration๋ฑ ์คํ๋ง์์ ์์ฒด์ ์ผ๋ก ๋ง๋ค์ด๋ ํ ์คํธ ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
@SuiteClasses๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ ์ด๊ฑด ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ํด๋์ค๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ํํ๋ค. ์ธ์๋ฅผ ๋ฃ์ด์ค ์์๋๋ก ์์ฐจ์ ์ผ๋ก ์คํ
Hamcrest
Matcher ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํ ์คํธ ํํ์์ ์์ฑํ ๋ ์ข ๋ ๋ฌธ๋งฅ์ ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.
Matcher๋ ๊ฐ๋ค์ ๋ํด์ ์ผ์น๋ ๊ท์น์ค์ ๋ฑ์ ํ๋ณํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง ๋ฉ์๋๋ ๊ฐ์ฒด์ด๋ค.
์์๋ก ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ assertEquals ๋ง๊ณ assertThat์ ์ฌ์ฉํ๋ผ๊ณ ๊ถ์ฅํ๋๋ฐ ์ด๊ฑด ๋ฌธ๋งฅ์ ์ผ๋ก๋ ๋ ์์๋ณด๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค
assertThat์ ์ฌ์ฉ๋ฐฉ๋ฒ
assertThat(ํ ์คํธ๋์, matcher๊ตฌ๋ฌธ) / assertThat("๋ฉ์ธ์ง", ํ ์คํธ ๋์, matcher ๊ตฌ๋ฌธ)
๋ชจ๋์ ๊ฒ๋ชจ์์ด ์ค์ ๋ชจ๋๊ณผ ๋น์ทํ๊ฒ ๋ณด์ด๋๋ก ๋ง๋ ๊ฐ์ง ๊ฐ์ฒด
๊ธฐ๋ณธ์ ์ธ ๋ถ๋ฅ ๊ฐ๋
ํ ์คํธ ๋๋ธ์ด๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋๋ฐ, ์ด๊ฑด ์ค๋ฆฌ์ง๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ๋ฅผ ์งํํ๊ธฐ ์ด๋ ค์ธ ๊ฒฝ์ฐ, ์ด๋ฅผ ๋์ ํด์ ํ ์คํธ๋ฅผ ์งํํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธ
๋๋ฏธ ๊ฐ์ฒด : ๋ฉ์ฒญํ ๋ชจ์กฐํ, ๋จ์ํ ๊ป๋ฐ๊ธฐ๋ฅผ ์๋ฏธํ๊ณ ์ค๋ก์ง ์ธ์คํด์คํ๋ ์ ์๋ ์์ค์ผ๋ก๋ง ๊ตฌํํ ๊ฐ์ฒด โ ์ธ์คํด์คํํ ๊ฐ์ฒด๊ฐ ํ์ํ ๋ฟ, ํด๋น ๊ฐ์ฒด์ ๊ธฐ๋ฅ๊น์ง๋ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉ - ํ์ ๊ธฐ๋ณธ๊ฐ((), null, false ๋ฑ)์ผ๋ก ๋ฐํ๊ฐ์ ๋ง๋ค์ด์ฃผ๋ ์ ์ผ๋ก๋ง / ๋ง์ฝ ํธ์ถ ์์๋ ์์ธ๋ฅผ ๋ฐ์์ํค๊ฒ ๋ง๋ค์ด๋ฌ์ผํจ
ํ ์คํธ ์คํ : ๋๋ฏธ ๊ฐ์ฒด๊ฐ ๋ง์น ์ค์ ๋ก ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ค์ด๋ ๊ฐ์ฒด / ๊ฐ์ฒด์ ํน์ ์ํ๋ฅผ ๊ฐ์ ํด์ ๋ง๋ค์ด๋ ๋จ์ ๊ตฌํ์ฒด / ํน์ ํ ๊ฐ์ ๋ฆฌํดํด์ฃผ๊ฑฐ๋ ํน์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๋ฑ์ ์์
ํ์ดํฌ ๊ฐ์ฒด : ์คํ ๊ณผ ๋น์ทํ์ง๋ง ์คํ ์ ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ํํ๋๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ ๋นํด์ ํ์ดํฌ ๊ฐ์ฒด๋ ์ฌ๋ฌ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ํํ ์ ์๋ ๊ฒฝ์ฐ๋ ์ข ๋ ๋ณต์กํ ๊ตฌํ์ด ๋ค์ด๊ฐ์๋ ๊ฐ์ฒด๋ฅผ ์ง์นญ โ ํ ์คํธ์ ์ฌ์ฉํ ์์ดํ ๊ณผ ์นดํ ๊ณ ๋ฆฌ์ ๋ํด์๋ง ์ค์ ๋ก DB์ ์ ์ํด์ ๋น๊ตํ ๋์ ๋์ผํ ๋ชจ์ต์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ ๋ค. ์ฌ๊ธฐ์๋ Map์ด๋ List๋ฅผ ์ด์ฉํด์ DB๊ฐ์ ์ธ๋ถ ์์กด ํ๊ฒฝ์ ๋์ฒดํ๋ค
ํ ์คํธ ์คํ์ด : ํ ์คํธ ๋ด์์ ๊ฐ์ฒด์ ํธ์ถ, ๊ทธ ๊ฐ์ฒด์ ๋ฉ์๋ ๋ฑ ํธ์ถ ์ฌ๋ถ๋ฅผ ๋ชฐ๋ ๊ฐ์ํด์ ๊ธฐ๋กํ๋ค๊ฐ ๋์ค์ ์์ฒญ์ด ์ค๋ฉด ๊ธฐ๋ก ์ ๋ณด๋ค์ ๊ฐ์ง๊ณ ์๋ค๊ฐ ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํ๋ ํ ์คํธ ๋๋ธ โ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๊ณ , ํ ์คํธ ์คํ์ด๊ฐ ํ์ํด๋ Mock์์ ์ง์์ ํ๊ธฐ ๋๋ฌธ์ ์ง์ํด์ฃผ๋๊ฑฐ ์ฌ์ฉ
Mock ๊ฐ์ฒด : ์ผ๋ฐ์ ์ธ ํ ์คํธ ๋๋ธ์ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋๋ฐ Mock ๊ฐ์ฒด๋ ํ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค.
Mock ํ๋ ์์ํฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ ๋์ ์ผ๋ก Mock ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํ๋ ์์ํฌ๋ฅผ ์๋ฏธํ๋ค.
์ด๊ฒ์ WebApplicationContext๋ฅผ ๋ก๋ํ์ฌ ๋ด์ฅ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ Mock ์๋ธ๋ฆฟ์ ์ ๊ณต
์ฅ์
Mock ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํด์ ๋ช ์์ ์ธ ํด๋์ค๋ก ๋ง๋ค์ง ์์๋ ๋๋ค.
Mock ๊ฐ์ฒด์ ๋ํด์ ํ์๊น์ง๋ ํ ์คํธ ์ผ์ด์ค์ ํฌํจ์ํฌ ์ ์๋ค.
์์
EasyMock
jMock
Mockito
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ์คํ๋ง MVC์ ๋์์ ์ฌํํ ์ ์๊ฒ ํด์ฃผ๋ ํด๋์ค
์ ์ฉ๊ณผ์
@WebMvcTest(ํ ์คํธํ๋ ค๋ ์ปจํธ๋กค๋ฌ์ด๋ฆ.class)
MVC๋ฅผ ์ํ ํ ์คํธ ์ ๋ ธํ ์ด์ ์ด
์น์์์์ request, response์ ๋ํด์ ํ ์คํธํ๋ ๊ฒ์ด ๊ฐ๋ฅ
Controller, ControllerAdvice, JsonComponent, Converter, GenericConverter, ๋ฑ ์ ํ๋ ๋ด์ฉ๋ง ์ค์บ
@AutoConfigureMockMvc ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋ค๋ฅธ ์ค์ ์์ด MockMvc๋ฅผ ์ฌ์ฉํ ํ ์คํธ๋ฅผ ์งํํ ์ ์๋ค.
@SpringBootTest
์ด ์ ๋ ธํ ์ด์ ์ ํตํฉ ํ ์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ ์คํ๋ง๋ถํธ ํ ์คํธ ์ ๋ ธํ ์ด์ ์ด๋ค.
์คํ๋ง ๋ถํธ๋ ์ด ์ ๋ ธํ ์ด์ ์ ํตํด์ ํ ์คํธ์ ํ์ํ ๊ฑฐ์ ๋ชจ๋ ์์กด์ฑ์ ์ ๊ณต
@AutoConfigureMockMvc
MockMvc์ฌ์ฉ
Service๋ Repository๋ฅผ ๊ฐ๊ธ์ ์ด๋ฉด ๋น์ผ๋ก ์ฃผ์ ๋ฐ์์ ์ฌ์ฉํ์ง ๋ง์! - ํน์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ฐ์ง๋ง!
@ControllerAdvice
@Valid
๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ getAllStaff ํ ์คํธ
๋๋ฏธ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ฃ์ด๋๊ณ ๊ฐ์ ธ์ฌ๊น ๊ณ ๋ฏผํ๋๋ฐ โ ๊ทธ๋ฅ ๋ง๋๋ ์ฝ๋๋ฅผ ๋ณต๋ถํด์ ์ฌ์ฉ
getAllStaff๋ฅผ ํธ์ถ์, ๋ง์ฝ์ db์์ ๊ฐ์ด ์๋ฌด๊ฒ๋ ์์ ๋์ ํ ์คํธ
204-no content๋ก ๋ณด๋ด์ค
ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ getStaff ํ ์คํธ
์๋ ๊ฐ์ ๊ฐ์ ธ์๋ฌ๋ผ๋ ๊ฒฝ์ฐ์ ํ ์คํธ
๋ง์ฝ ์๋ ๊ฐ์ ์์ฒญํ์ ๊ฒฝ์ฐ์๋ ์๋๋ RuntimeException์ ์ผ์ผํค๋๋ก ๋์ด์์๋๋ฐ
์๋ ๊ฐ์ ์์ฒญํ ์, ์ปจํธ๋กค๋ฌ์ ๊ฐ์ ธ์จ๊ฐ์ด ์์ํ ๋ ์ฌ๊ธฐ์ ์๋ ๊ฐ์ผ ๋ 400-bad request์ผ๋ก ๋จ๊ตฌ๋ผ๊ณ ๋ด๋ถ์ฝ๋์์
id๊ฐ์ ์ ์ธํ๊ณ ์ธ์๋ค์ ์ฑ์๋ฃ์ด์ฃผ๋ฉด ๊ทธ ์ธ์๋ค์ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ saveStaff ํ ์คํธ
์ด๋ฏธ ์กด์ฌํ๋ id๋ก post ์ ์กํ๋ ๊ฒฝ์ฐ์ ํ ์คํธ
๋ง์ฝ ์ด๋ฏธ ์กด์ฌํ๊ณ ์๋ id๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์๋ก์ด ์ธ์๋ค์ ๋ฃ์ด์ฃผ๋ฉด ํ์ฌ๋ ์์ ํด์ ๋ฃ์ด์ฃผ๋๋ฐ, ๋ถ๊ฐ๋ฅํ๋๋ก! - UPDATE์ ๊ธฐ๋ฅ์ด ๊ฒน์น๋ค
service์์ ๋ง์ฝ ๋ฐ์ ๊ฐ์ id์ ํด๋นํ๋ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ์๋ค๋ฉด 400-bad request๋ฆฌํด
์ด๋ฏธ ์กด์ฌํ๊ณ ์๋ ๊ฐ์ฒด์ ๋ํด์ ์์ ํ๋ ํ ์คํธ - ๋ชจ๋ ์ธ์๊ฐ์ ๋ฃ์ด์ค์ผํจ
์ธ์๋ค ์ค์ ํ๋๋ผ๋ ์์ ๊ฒฝ์ฐ(id, name, position)์ ํ ์คํธ โ @Valid๋ @ControllerAdvice๋ฅผ ํตํด์ ๋๊ฐ์ ์ฒ๋ฆฌํ๋ ค๊ณ ํ์ง๋ง, PUT์ ํ์ ํด์๋ง ์ฒ๋ฆฌํ๊ณ ์ถ์ด์ ๋ด์ ํ์ํ ๋ ์ฌ์ฉ
์ปจํธ๋กค๋ฌ์์ ๋ฐ์ ๋, ๋ง์ฝ์ ์ธ์์ค์ ๋น ์ง๊ฒ ์๋ค๋ฉด ๋ฐ๋ก 400-bad request์ผ๋ก ๋ฆฌํด
์ธ์๋ค์ ๋ค ๋ค์ด์๋๋ฐ, ๋ง์ฝ ์กด์ฌํ์ง ์๋ id๊ฐ์ ๋ํ ํ ์คํธ
์๋น์ค์์ 404-not found๋ก ๋ฆฌํด
์์ ํ๋ ํ ์คํธ - ์กด์ฌํ๋ id๊ฐ์ ๋ํด์ ์์ ํ๊ณ ์ถ์ ์ธ์๋ฅผ ๋ฃ์ด์ค์ผํจ
์กด์ฌํ์ง ์๋ id์ ๋ํด์ ์์ ํ๋ ๊ฒฝ์ฐ์ ํ ์คํธ
์๋น์ค์์ 404-not found๋ก ๋ฆฌํด
๊ธฐ์กด ๊ฐ์ฒด์ ์กด์ฌํ์ง ์๋ ์ธ์๋ฅผ ๋ฐ์์ ๊ฒฝ์ฐ์ ํ ์คํธ
๋ฐ์์จ ๊ฐ๋ค์ด null์ผ ๊ฒฝ์ฐ์ 400-bad request๋ก ๋ฆฌํด
์ํ๋ id์ ๋ํด์ ์ญ์ ํ๋ ๊ฒฝ์ฐ์ ํ ์คํธ
์กด์ฌํ์ง ์์ id์ ๋ํด์ ์ญ์ ํ๋ ๊ฒฝ์ฐ์ ํ ์คํธ
์์ง๋ง ์ฑ๊ณต 204-no content