Junit5 ๋ฐ Mock ์ ๋ํด ์ค๋ช ๋๋ฆฌ์ง ์๋ ์ ์ํด ๋ถํ๋๋ฆฝ๋๋ค.
ํ ์คํธ ์ฝ๋๋ณด๋ค๋ ์ปจํธ๋กค๋ฌ์์ HttpSession ์ ์ฌ์ฉํ ๋์ ์ฃผ์์ ์ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๊ฐ์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
์ปจํธ๋กค๋ฌ์์ ํ๋ผ๋ฏธํฐ๋ก HttpSession ์ ์ฃผ์ ๋ฐ์์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ด ์์ต๋๋ค.
์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋์ง HttpSession ๊ณผ HttpServletRequest.getSession() ์ ์ฐจ์ด๋ฅผ ํ ์คํธ ์ฝ๋๋ก ์์๋ณด๊ฒ ์ต๋๋ค.
โญ HttpSession ๋ฅผ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ์ฆ์ ์ฃผ์ ๋ฐ๊ธฐ
- ์ฝ๋ ์ค๋ช
- ํ์์ด ์ธ์ฆ ์ฝ๋๋ฅผ ์๋ชป ์ ๋ ฅํด์ ์ด๋ฉ์ผ ๊ฒ์ฆ์ ์คํจํ๋ฉด if ๋ฌธ์ด ๊ฑฐ์ง์ด ๋ฉ๋๋ค.
- Session ์ ๊ฐ์ ์ค์ ํ์ง ์๊ณ , ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
@GetMapping("/email/authenticate")
public ApiResponse<Void> authenticateEmail(@RequestBody @Valid EmailAuthenticationRequest request,
HttpSession session) {
if (mailService.isValidMail(request.toServiceRequest())) {
session.setAttribute(MAIL_VERIFIED_MEMBER, true);
return ApiResponse.ok();
}
return ApiResponse.status(HttpStatus.BAD_REQUEST);
}
- ํ ์คํธ ์ฝ๋
์ด ๋ฉ์๋๊ฐ if๋ฌธ์ด ๊ฑฐ์ง์ด ๋ ๋, ์ธ์ ์ด ์์ฑ์ด ๋์ง ์๋์ง ํ ์คํธ ์ฝ๋๋ฅผ ์ง๋ณด๊ฒ ์ต๋๋ค.
@DisplayName("์ด๋ฉ์ผ ์ธ์ฆ์ด ์คํจํ๋ฉด HttpSession์ ์์ฑ๋์ง ์๋๋ค.")
@Test
void ํ
์คํธ() throws Exception {
// given
String email = "123@naver.com";
String authenticationCode = "312njacz";
EmailAuthenticationRequest request = new EmailAuthenticationRequest(email, authenticationCode);
//==Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ์ด๋ฉ์ผ ๊ฒ์ฆ์ ์คํจํ์ ๋๋ฅผ ๊ฐ์ ==
given(mailService.isValidMail(request.toServiceRequest()))
.willReturn(false);
// when then
MvcResult mvcResult = mockMvc.perform(
get("/member/email/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andDo(print()) //==MockHttpServletRequest/Response ๋ด์ฉ์ ์ฝ์์ ์ถ๋ ฅ==
.andReturn();
//==getSession(false)๋ฅผ ํด์ผ ์ธ์
์ด ์์ ๋, MockHttpSession ์ด ๋ง๋ค์ด ์ง์ง ์์==
HttpSession session = mvcResult.getRequest().getSession(false);
Object sessionValue = mvcResult.getRequest().getSession(false).getAttribute(MAIL_VERIFIED_MEMBER);
assertThat(session).isNull();
assertThat(sessionValue).isNull();
}
์๋ ์๋๋๋ก๋ผ๋ฉด ํ์์ ์ด๋ฉ์ผ ๊ฒ์ฆ์ ์คํจํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ ์ธ์ ์ ์์ฑํ๋ฉด ์๋ฉ๋๋ค.
๊ทธ๋ ๊ธฐ์ assertThat(session).isNull() ๊ณผ assertThat(sessionValue).isNull() ์ ๊ฒฐ๊ณผ๋ ์ฑ๊ณตํด์ผ ํฉ๋๋ค.
ํ์ง๋ง, ํ ์คํธ ๊ฒฐ๊ณผ๋ ์๋ ์ฌ์ง์ฒ๋ผ ์คํจํ์ต๋๋ค.
- session ๊ณผ sessionValue ์ ๊ฐ์ด ์์ฑ๋์์ต๋๋ค.
- POSTMAN ์ผ๋ก ํ์ธ์ ํด๋ ์ธ์ ์ด ์์ฑ๋จ์ ํ์ธํ ์ ์์์ต๋๋ค.
- ์ธํ ๋ฆฌ์ ์ด์ http ์ผ๋ก ํ์ธ์ ํด๋ ์ธ์ ์ด ์์ฑ๋จ์ ํ์ธํ ์ ์์์ต๋๋ค.
โญ์ HttpSession ์ด ์์ฑ๋์ด ์ฟ ํค๋ฅผ ๋ฐํํ ๊น์?
HttpSession ์ ๊ณต์๋ฌธ์์ค ์ผ๋ถ์ ๋๋ค.
ํด๋น ๋ฌธ์์์๋ HttpSession ์ ServletContext ์ ์ค์ฝํ์ ์ํด ๊ด๋ฆฌ๋์ง, ์คํ๋งContext ์์ญ์ด ์๋๋๋ค.
๋จ์ง ์คํ๋ง์ HttpSession ์ ํฐ์บฃ์ ServletContext ๋ก๋ถํฐ ๊ฐ์ ธ์ฌ ๋ฟ์ ๋๋ค.
Session information is scoped only to the current web application (ServletContext), so information stored in one context will not be directly visible in another.
๊ทธ๋์ HttpSession ์ ์ปจํธ๋กค๋ฌ์ ํ๋ผ๋ฏธํฐ์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์คํ๋ง์ HttpSession ์ ํฐ์บฃ์ผ๋ก๋ถํฐ ๊ฐ์ ธ์ ์ฃผ์ ํ๊ฒ ๋ฉ๋๋ค.
โญ HttpServletRequest.getSession() ๋ฅผ ์ฌ์ฉํ๊ธฐ
HttpSession ์ side-effect ์ ์์๋ดค์ผ๋ HttpServletRequest.getSession() ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฉ์ผ ๊ฒ์ฆ์ด ์คํจํ์ ๋(if๋ฌธ์ด ๊ฑฐ์ง์ผ ๋) ์ธ์ ์ด ๋ง๋ค์ด ์ง์ง ์๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
- ์ฝ๋ ์ค๋ช
- ๋ง์ฐฌ๊ฐ์ง๋ก ํ์์ด ์ธ์ฆ ์ฝ๋๋ฅผ ์๋ชป ์ ๋ ฅํด์ ์ด๋ฉ์ผ ๊ฒ์ฆ์ ์คํจํ๋ฉด if ๋ฌธ์ด ๊ฑฐ์ง์ด ๋ฉ๋๋ค.
- Session ์ ๊ฐ์ ์ค์ ํ์ง ์๊ณ , ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์ผ ํฉ๋๋ค.
@GetMapping("/member/email/authenticate")
public ApiResponse<Void> authenticateEmail(@RequestBody @Valid EmailAuthenticationRequest request,
๋ฐ๋ ๋ถ๋ถ ====> HttpServletRequest servletRequest) { <====
if (mailService.isValidMail(request.toServiceRequest())) {
HttpSession session = servletRequest.getSession();
session.setAttribute(MAIL_VERIFIED_MEMBER, true);
return ApiResponse.ok();
}
return ApiResponse.status(HttpStatus.BAD_REQUEST);
}
- ํ ์คํธ ์ฝ๋
ํ ์คํธ ์ฝ๋๊ฐ ํต๊ณผํ๋ฉฐ ์ธ์ ์ด ๋ง๋ค์ด ์ง์ง์๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
โญ๊ฒฐ๋ก
1. ์ปจํธ๋กค๋ฌ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ HttpSession ์ ๋ฐ์ธ๋ฉํ๋ค๋ฉด ์คํ๋ง์ ServletContext ์์ ์ธ์ ์ ๊ฐ์ ธ์ค๋ฉฐ, ServletContext ์ ์ฅ์์๋ ์คํ๋ง์์ ์ธ์ ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๊ณ , "JSESSIONID" ๋ผ๋ ์ด๋ฆ์ ์ฟ ํค๋ฅผ ์์ฑํฉ๋๋ค.
2. ๊ทธ๋ฌ๋, ์กฐ๊ฑด์ ๋ฐ๋ผ HttpSession ์ ์์ฑํด์ผ ํ๋ค๋ฉด HttpSession ๋์ HttpServletRequest ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
3. HttpServletRequest ์ ์ฌ์ฉํ ๋, ์คํ๋ง์ด ServletContext ์์ HttpSession ์ ๊ฐ์ ธ์ค๋ ์์ ์ .getSession() ์ ํธ์ถํ ๋์ ๋๋ค.
4. ์ถ๊ฐ๋ก ์ธ์ ์ ์ฌ์ฉํ ๋๋ .getSession() vs .getSession(false) ์ ์ฐจ์ด๋ ์์์ผ ํฉ๋๋ค.
.getSession() ์ ์ธ์ ์ด ์์ผ๋ฉด ์ธ์ ์ ๋ฐํํ๊ณ ์ธ์ ์ด ์์ผ๋ฉด ์๋ก์ด ์ธ์ ์ ์์ฑํฉ๋๋ค.
.getSession(false) ์ ์ธ์ ์ด ์์ผ๋ฉด ์ธ์ ์ ๋ฐํํ๊ณ ์ธ์ ์ด ์์ผ๋ฉด null ์ ๋ฐํํฉ๋๋ค.
* Difference Between request.getSession() and request.getSession(true)