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);
}
- ν μ€νΈ μ½λ
ν μ€νΈ μ½λκ° ν΅κ³Όνλ©° μΈμ μ΄ λ§λ€μ΄ μ§μ§μλ κ²μ νμΈν μ μμμ΅λλ€.
![](https://blog.kakaocdn.net/dn/b54jPn/btsJrHoOc1v/AdTKYtp5zPxbqkK967U441/img.png)
βκ²°λ‘
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)