해당 포스팅은 인프런스프링 MVC2편 강의를 듣고 적은 강의 노트를 정리하며 기록하기 위한 글입니다.
강의를 시청하며, 프로젝트에 적용할 수 있는 부분들이나 궁금한 기능들을 정리하며 포스팅할 예정입니다.
제 개인적인 의견이 더해져 올바르지 않은 정보가 들어가 있다면, 피드백이나 댓글로 남겨주시면 감사하겠습니다.
자세한 강의 내용은 인프런 스프링 MVC에서 만나보실 수 있습니다.
목표
세션을 직접 개발하여, 테스트를 진행해 보자.
세션 관리는 크게 다음 3가지 기능을 제공하면 된다.
간단하게 세션 생성, 조회, 만료 기능을 가지는 세션관리 로직은 다음과 같다.
/**
* 세션생성
** sessionId 생성
** 세션 저장소에 sessionId와 보관할 값 저장
** sessionId로 응답 쿠키를 생성해서 클라이언트에 전달
*/
public void createSession(Object value, HttpServletResponse response){
//sessionId 생성, 값 저장
String sessionId = UUID.randomUUID().toString();
sessionStore.put(sessionId,value);
// 쿠키 생성
Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId);
response.addCookie(mySessionCookie);
}
/**
* 세션 조회
*/
public Object getSession(HttpServletRequest request){
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie == null){
return null;
}
return sessionStore.get(sessionCookie.getValue());
}
/**
* 세션만료
*/
public void expire(HttpServletRequest request){
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie != null){
sessionStore.remove(sessionCookie.getValue());
}
}
테스트에서 MockHttpServletResponse와 MockHttpServletRequest가 사용된다.
HttpServletResponse는 인터페이스로 Http 응답을 처리하는데,
여기서 스프링에서 임의로 제공되는 mock 클래스를 사용하면
실제 HTTP 응답을 처리하는 것처럼 동작하면서 테스트에서 원하는 대로 응답을 조작할 수 있도록 도와줄 수 있다.
테스트에서 비슷한 역할을 해주는 가짜 모듈을 만드는 mock에 대해서 알아보자.
Mock vs Mockito
1) Mock 이란,
- 테스트를 위한 가짜 객체
- 실제 객체를 만들기에는 비용과 시간, 의존성이 크게 걸쳐져 있어 테스트 시 제대로 구현하기 어려울 경우 만드는 가짜 객체
2) Mockito 란,
- Mockito란 Mock Object를 간편하게 만들게 해주는 라이브러리
- Mock 객체를 만들기 위해서 사용되는 시간을 줄이기 위해, 자동으로 생성해 주는 라이브러리이다.
- Mock객체 직접 구현하지 않아도 되게 함
이렇게 사용자 인터페이스(UI)나 데이터베이스 테스트, session 테스트 등과 같이 자동화된 테스트를 수행하기 어려운 때 널리 사용된다.
Mock을 사용하여 단위테스트 해보기
@Test
void sessionTest() {
//세션생성
MockHttpServletResponse response = new MockHttpServletResponse();
Member member = new Member();
sessionManager.createSession(member, response);
//요청에 응답 쿠키 저장
MockHttpServletRequest request = new MockHttpServletRequest();
request.setCookies(response.getCookies()); // mySessionId = 123123-12312-qtq123q
//세션 조회
Object result = sessionManager.getSession(request);
assertThat(result).isEqualTo(member);
//세션 만료
sessionManager.expire(request);
Object expired = sessionManager.getSession(request);
assertThat(expired).isNull();
}
세션 생성
//세션생성
MockHttpServletResponse response = new MockHttpServletResponse();
Member member = new Member();
sessionManager.createSession(member, response);
mock을 사용하여 Http 응답을 모킹 하고 세션을 생성한다.
//요청에 응답 쿠키 저장
MockHttpServletRequest request = new MockHttpServletRequest();
request.setCookies(response.getCookies()); // mySessionId = 123123-12312-qtq123q
그 후 response 응답에 저장된 쿠키를 가져와 request에 설정하였다.
이는 세션을 유지하기 위해 세션 ID가 저장된 쿠키를 요청에 함께 보내는 것을 모킹 한 것이다.
세션 조회
sessionManager.getSession(request)를 호출하여 요청에서 세션을 조회하고,
assertThat을 사용하여 조회한 세션이 예상한 member 객체와 동일한지를 검증한다.
세션 만료
sessionManager.expire(request)를 호출하여 세션을 만료시키고,
다시 sessionManager.getSession(request)를 호출하여 세션이 만료되었는지를 검증한다.
이와 같이 mock을 사용하면 db나 부하가 많이 걸리는 작업들이 외부 리소스에 의존하지 않기에 간단하고 빠르게 단위 테스트를 수행가능하다.
Mock 사용 시 유의사항
Mock을 사용하는 경우 테스트 케이스 유지에 복잡성이 더해지기 때문에, 의존성이 적은 구조로 프로그래밍한다.
실제 객체로 작동을 해보았을 때 예상한 것처럼 정상 동작하지 않을 수 있다.
Mock은 실제 객체가 아닌 객체를 흉내 내는 객체이기 때문이다.
'Back-End > Spring' 카테고리의 다른 글
[JPA] 도메인 설계, 엔티티 매핑 (0) | 2023.04.19 |
---|---|
[JPA] JPA를 사용하는 이유와 JPA에 대하여 (0) | 2023.04.18 |
[MVC-2편] 오류 코드와 메시지 처리 (0) | 2023.04.16 |
[MVC-1편] 웹페이지, 타임리프(Thymeleaf) 구성 (0) | 2023.03.22 |
[MVC-1편] given-when-then 패턴이란 (0) | 2023.03.18 |