ย ์ต๊ทผ, ํ
์คํธ์ ์ค์์ฑ์ ์ฌ์คํ ๋๋ผ๊ณ ์๋ค.
์๋ ์ฒ์์๋ ํ
์คํธ ํ์ผ์ ๋ฐ๋ก ์์ฑํ์ฌ ํ
์คํธ๋ฅผ ์งํํ์ง ์์๋ค. ์ด์ ๋ ๊ฐ๋จํ๋ค. ์ ์ฌ์ฉํ ์ค ๋ชฐ๋๊ธฐ ๋๋ฌธ์.
ย ์ต๊ทผ ํ์ต์ ์งํํ๋ฉด์ ํ ์คํธ ํ์ผ์ ์์ฑํ๋ ๋ฒ์ ์ฒด๋ํ๊ณ ์๋ค. ์ฒ์์๋ ๊ฐ๋จํ๊ฒ @Autowired๋ก ์ค์ ์๋น์ค๋ ๋ ํฌ์งํฐ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ค๊ณ ๊ธฐ๋ฅ์ด ์ ์๋ํ๋์ง๋ฅผ ํ ์คํธํ์๊ณ , ์ดํ์๋ MockMvc๋ฅผ ํตํ ์ปจํธ๋กค๋ฌ ํ ์คํธ ๋ํ ์งํํ์๋ค.
ย ํ ์คํธ ์ฌ์ฉ๋ฒ์ด ์กฐ๊ธ์ฉ ์ต์ํด์ง๋ฉด์, TDD๋ก ๊ธฐ์กด์ ํ๋ก์ ํธ๋ฅผ ์ฌ๊ตฌํํ๋ ์ค์ต์ ์งํํ๋ฉฐ ํ ์คํธ์ ์ข ๋ ์น์ํด์ง๊ณ ์๋ ์์ฆ์ด๋ค.
ย ๊ฐ์ธ์ ์ผ๋ก ์ฒ์์ ๋๊ฒ ์์ํ๊ฒ ๋๊ผ๋ ๊ฒ์ด ๋ฐ๋ก ์ปจํธ๋กค๋ฌ ํ
์คํธ์ด๋ฉฐ, ์ด๋ฅผ MockMvc๋ฅผ ์ด์ฉํ์ฌ ์งํํ๊ณ ์๋ค.
์ด MockMvc๊ฐ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ์๋ํ๊ณ , ์ด๋ป๊ฒ ์๋ตํ๋์ง ์ ๋ฆฌํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์๋ค.
Servlet Container , ์ฆ ์ค์ ์๋ฒ๋ฅผ ๋์ฐ์ง ์๊ณ ๋ ์ปจํธ๋กค๋ฌ ๋ ์ด์ด๋ฅผ ํ
์คํธํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌSpring MVC ์ ์์ฒญ-์๋ต ํ๋ฆ์ ์๋ฎฌ๋ ์ด์
ํ๋ฉฐ, ์ปจํธ๋กค๋ฌ๊ฐ ์์๋๋ก ๋์ํ๋์ง ํ์ธํ๋ ๊ณผ์ 1. ์์ฒญ-๋งคํ ๊ฒ์ฆ
URI ์์ฒญ์ด ์ฌ ๋, ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ Handler Method ๋ก ๋งคํ๋๋์ง ํ์ธ/api/v1/member/login URI ๋ฅผ ์์ฒญ๋ฐ์์ ๋, ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ก ์ ์ฐ๊ฒฐ๋๋๊ฐ2. ํธ๋ค๋ฌ ๋ฉ์๋ ๋ก์ง ํ ์คํธ
3. ์์ธ ์ฒ๋ฆฌ ๊ฒ์ฆ
MockMvc ๋ ์ค์ ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ๊ตฌ๋ํ์ง ์์ง๋ง, DispatcherServlet ์ ํต์ฌ ๋ก์ง์ Mock ํ๊ฒฝ์์ ๋์์ํดServletContainer : Tomcat, Jetty ๋ฑ, ์ค์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ธ๋ฆฟ์ ์คํํ๋ ํ๊ฒฝMockMvc ๋ ์ด๋ฌํ ์ค์ HTTP ์์ฒญ ๋์ , MockHttpServletRequest ์ MockHttpServletResponse ๋ฅผ ์ฌ์ฉํ์ฌ DispatcherServlet ๋ด๋ถ ๋ก์ง ํธ์ถDispatcherServlet ์ ์๋ธ๋ฆฟ ์ปจํ
์ด๋ ์์ด๋ Spring MVC ์ ์์ฒญ-์๋ต ์ฒ๋ฆฌ ๊ณผ์ ์ ์๋ฎฌ๋ ์ด์
๊ฐ๋ฅ1. Mock ์์ฒญ ์์ฑ
MockMvc ๋ ์ค์ HTTP ์์ฒญ์ด ์๋, MockHttpServletRequest ๋ฅผ ์์ฑ2. DispatcherServlet ํธ์ถ
DispatcherServlet ์ธ์คํด์ค๋ฅผ Mock ํ๊ฒฝ์์ ์ด๊ธฐํservice() ๋ฉ์๋ ํธ์ถDispatcherServlet ๋ด๋ถ ๋ก์ง ์คํ3. ํธ๋ค๋ฌ ๋งคํ ๋ฐ ์คํ
DispatcherServlet ์ ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์์ฒญ URL์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๊ณ , ํด๋น ์ปจํธ๋กค๋ฌ ๋ฉ์๋(ํธ๋ค๋ฌ ๋ฉ์๋, ์ก์
๋ฉ์๋)๋ฅผ ์คํ4. Mock ์๋ต ๋ฐํ
MockHttpServletResponse ์ ๋ด๊ฒจ ์๋ต ๊ฐ์ฒด๋ก ์ฌ์ฉ1. MockMvc ์์ฑ
@SpringBootTest
@AutoConfigureMockMvc
public class MockControllerTest() {
@Autowired
private MockMvc mvc;
@Test
void t1() {
ResultActions resultActions = mvc.perform(...);
}
}
AutoConfigureMockMvc ๋ฅผ ํตํด MockMvc ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ AllArgsConstructor , RequiredArgsConstructor ๋ฑ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, @Autowired ๋ฅผ ํตํด DI ๋ก MockMvc ์ฃผ์
perform() ๋ฉ์๋๋ฅผ ํตํด URL ์์ฒญ, ๊ฒฐ๊ณผ๋ฅผ ResultActions ๊ฐ์ฒด๋ก ๋ฐ์์ด2. HTTP ์์ฒญ ๋ฉ์๋
resultActions = mvc.perform(
get("/api/v1/posts")
);
resultActions = mvc.perform(
delete("/api/v1/posts/1")
);
get(String url) : Get ์์ฒญpost(String url) : Post ์์ฒญput(String url) : Put ์์ฒญdelete(String url) : Delete ์์ฒญpatch(String url) : Patch ์์ฒญ3. andExpect()
mvc.perform(
delete("/api/v1/posts/1")
)
.andExpect(status().isOk());
status() : ์๋ต ์ํ ์ฝ๋ ๊ฒ์ฆheader() : ์๋ต ํค๋ ๊ฒ์ฆhandler() : ์๋ต ํธ๋ค๋ฌ ๊ฒ์ฆjsonPath() : JSON ์๋ต์ ํน์ ํ๋ ๊ฒ์ฆ4. andDo()
mvc.perform(
get("/api/v1/posts")
)
.andDo(print());
5. header()
String apiKey = UUID.randomUUID().toString();
mvc.perform(
post("/api/v1/posts")
.header("Authorization", "Bearer " + apiKey)
);
6. content(), contentType()
mvc.perform(
post("/api/v1/posts")
.content("""
{
"title": "์ ๋ชฉ",
"content": "๋ด์ฉ"
}
""")
.contentType(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8))
);
content() : ์์ฒญ์ ๋ณธ๋ฌธ ์ถ๊ฐcontentType() : ๋ณธ๋ฌธ ํ์ผ ํ์ ๋ฐ ์ธ์ฝ๋ฉ ๋ฐฉ์ ์ง์ ์ฐธ๊ณ ) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/