public class SessionManager {
private static final String SESSION_COOKIE_NAME = "mySessionID";
private Map<String,Object> sessionStore = new HashMap<>();
/**
* 1] 세션 생성
*/
public void createSession(Object value, HttpServletResponse response){
//세션 id 생성, 값을 세션에 저장
String sessionId = UUID.randomUUID().toString();
sessionStore.put(sessionId,value);
//쿠키 생성
Cookie cookie = new Cookie(SESSION_COOKIE_NAME, sessionId);
response.addCookie(cookie);
}
/**
* 2] 세션 조회
*/
public Object getSession(HttpServletRequest request){
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if(sessionCookie == null)
return null;
return sessionStore.get(sessionCookie.getValue());
}
private Cookie findCookie(HttpServletRequest request,String cookieName) {
if (request.getCookies() == null)
return null;
return Arrays.stream(request.getCookies())
.filter(cookie -> cookie.getName().equals(cookieName))
.findAny()
.orElse(null);
}
/**
* 3] 세션 만료
*/
public void expire(HttpServletRequest request){
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if(sessionCookie != null)
sessionStore.remove(sessionCookie.getValue()); // 세션 만료
}
}
위와 같은 세션 매니저를 만들었다. 아래는 세션 메니져의 테스트 코드이다.
class SessionManagerTest {
SessionManager sessionManager = new SessionManager();
@Test
void sessionTest() {
// 세션 생성(서버 -> 클라이언트)
MockHttpServletResponse response = new MockHttpServletResponse(); // Mock
Member member = new Member();
sessionManager.createSession(member,response); // member(회원)에 대한 {sessionId}가 생성된 후, response의 SET-COOKIES 헤더에 담겨서 클라이언트에 보내졌음.
// 요청에 응답 쿠키 저장(서버 <- 클라이언트)
MockHttpServletRequest request = new MockHttpServletRequest(); // Mock
request.setCookies(response.getCookies()); // 웹 브라우저의 쿠키 저장소에 있는 쿠키값(EX.sessionid="sdaf13123")을 클라이언트로부터 받음
// 1]세션 조회
Object result = sessionManager.getSession(request);
assertThat(result).isEqualTo(member);
// 2] 세션 만료
sessionManager.expire(request);
Object expired = sessionManager.getSession(request);
assertThat(expired).isNull();
}
MockHttpServletResponse response = new MockHttpServletResponse();
MockHttpServletRequest request = new MockHttpServletRequest();
-> HttpServletRequest,HttpServletResponse는 모두 [인터페이스]이다 .
고로 위 클래스들을 이용하여 테스트 코드를 짜기 위해서는 실제로 서버를 실행시켜서 해당 구현체를 주입 받아야 하기 때
때문에 서버를 실제 실행시키고 로그인 기능을 실제 사용해야 한다는 매우 불편한 점이 존재한다.
Mock 코드는 이러한 불편한 점을 해소하고자 나온 개념이다.
MockHttpServletResponse, MockHttpServletRequest은 실제로 서버를 실행하지 않아도
HttpServletRequest,HttpServletResponse의 구현체의 기능들을 그대로 사용할 수 있게 해주는 가짜(Mock) 객체들이다.
이 Mock 객체들 덕분에 우리는 서버를 실제 실행시키지 않아도 가상으로 요청/응답을 보낼 수가 있다.
'Springあるある' 카테고리의 다른 글
서블릿 필터의 사용 예시(Feat. Filter) (0) | 2025.01.16 |
---|---|
HttpServletRequest VS @SessionAttribute (0) | 2025.01.16 |
도메인의 진짜 의미! (0) | 2025.01.15 |
[@RequestParam,@ModelAttribute] VS @ResponeBody(Feat.HttpMessageConverter) (0) | 2025.01.15 |
BindingResult의 동작 (0) | 2025.01.14 |