이번시간에는 Session 관련 설정에 대해 알아보도록하겠습니다. 어노테이션 이름만 보더라도 어떤 역할을 할지 이제는 조금씩 예상이 가기 시작합니다. 하나하나 살펴보며 정리를 해보도록하겠습니다.
1. @SessionAttribute
1.1 @SessionAttribute 란?
sessionAttribute는 HttpSession에 저장되어있는 값을 Handler
의 매개변수에 맵핑해주는 어노테이션 입니다.
1.2 @SessionAttribute 예제
사용자가 처음 요청을 보낼때의 시간을 기록하고 첫 요청시간을 콘솔에 출력해주도록 하겠습니다.
HandlerInterceptor
xxxxxxxxxx
public class VisitTimeInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(session.getAttribute("visitTime") == null)
session.setAttribute("visitTime", LocalDateTime.now());
return true;
}
}
session에 사용자가 첫 요청할때의 시간을 저장하기 위해서, HandlerInterceptor
를 이용하도록 하겠습니다. HandlerInterceptor는 핸들러에게 값을 전달하기 전에 먼저 요청을 가로채어 필요한 처리를 한 뒤 Handler에게 요청을 전달해주는 역할을 합니다. 이때, preHandler()에서 return하는 값이 true여야 다음 HandlerInterceptor 또는 Handler에게 request를 전달합니다.
public class WebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new VisitTimeInterceptor()).addPathPatterns("/events/list");
}
}
당연히 HandlerInterceptor를 생성했으니 이것을 설정파일을 통해 등록을 해주어야합니다. WebMvcConfigurer를 구현하고, addInterceptors()
메소드를 오버라이딩하여 편리하게 HandlerInterceptor를 등록할 수 있습니다. 이 HandlerInterceptor는 /events/list
의 요청만을 가로채도록 설정했습니다.
Handler
"/events/list") (
public String getList( LocalDateTime visitTime){
System.out.println(visitTime);
return "/events/list";
}
이제 앞서 HandlerInterceptor가 가로챌 경로에 대응하는 Handler를 생성합니다. 주목할 점은 @SessionAttribute
를 사용하여 session에 등록된 visitTime
을 매개변수로 맵핑한 것입니다. 가져온 visitTime을 콘솔에 출력하도록 하겠습니다.
결과
session에 등록된 시간을 가져와 출력하므로 새로고침을 통해 계속 요청해봐도 같은 시간이 출력되는것을 볼 수 있습니다.
2. @SessionAttributes(s)
2.1 @SessionAttributes(s) 란?
@SessionAttributes(s)
란 사실 HandlerMethod의 argument는 아닙니다. @SessionAttributes(s)는 Model에 등록되어있는 attribute들 중 @SessionAttributes(s)
에 설정한 값과 같은 값이 담겨있다면, session에 그 값을 똑같이 담아주게 됩니다. 예제를 보겠습니다.
2.2 @SessionAttributes(s) 예제
"visitTime") (
public class SampleController {
"/events/time") (
public String saveTime(Model model){
model.addAttribute("visitTime", LocalDateTime.now());
return "redirect:/events/list";
}
"/events/list") (
public String getList( LocalDateTime visitTime){
System.out.println(visitTime);
return "/events/list";
}
}
이번 예제는 간단하게도 이것이 다입니다. 하나하나 살펴보겠습니다.
@SessionAttributes(s)
Class에 부여된 annotation들 중 @SessionAttributes(s)
를 주목해야합니다. visitTime
을 지정을 했습니다. 이를 통해 Model에 등록된 attribute의 값들 중 visitTime이란 것이 존재한다면 Session에 등록을 자동으로 하게 됩니다.
Handler
/events/time
이번에는 두개의 핸들러를 생성했습니다. /events/time
을 맵핑하는 핸들러는 LocalDateTime을 이용해 현재 시간을 구하여 model에 값을 등록합니다. 그 후 /evetns/list
로 리다이렉트 합니다.
/events/list
/events/list
를 맵핑하는 핸들러는 이전 예제와 같은 역할을 합니다. session에 visitTime에 대응하는 attribute가 존재한다면 console에 출력을 하게 됩니다.
결과
/events/time
로 요청하여 session에 현재시간이 등록되도록 합니다.
자동으로 /events/list
로 리다이렉트 되며 요청 시간이 출력됩니다. 즉 Session에 값이 자동으로 등록된것을 볼 수 있습니다.
3. SessionStatus
SessionStatus 객체는 Handler 메소드의 매개변수로 사용되는 객체입니다. 이 객체를 통해서 Session을 손쉽게 제어할 수 있습니다. 예를 들면 session에 저장된 값을 더 이상 사용하지 않을 때 sessionStatus의 setComplete()
메소드를 이용하면 session값을 비울 수 있습니다.
"/events/list") (
public String getList(SessionStatus sessionStatus, LocalDateTime visitTime){
sessionStatus.setComplete();
System.out.println(visitTime);
return "/events/list";
}
이전 예제에서 /evetns/list
를 맵핑하는 핸들러만을 수정합니다. 매개변수로 SessionStatus를 추가하고, sessionStatus의 setComplete() 메소드를 호출하도록 합니다.
맨 처음에는 시간이 출력됩니다. 하지만 새로고침을 클릭하면 visitTime session이 삭제되면서 그러한 attribute가 없다는 에러가 출력됩니다.
'FrameWork > Spring MVC' 카테고리의 다른 글
SpringMVC - 핸들러 메소드 - 7 (파일업로드 매개변수 : MultipartFile) (0) | 2019.05.29 |
---|---|
SpringMVC - 핸들러 메소드 - 6 (리다이렉트시 데이터 다루기 : RedirectAttributes, FlashAttributes) (0) | 2019.05.29 |
SpringMVC - 중복 서브밋 처리(새로고침시 POST 재요청 방지 : PRG 패턴) (0) | 2019.05.23 |
SpringMVC - 핸들러 메소드 - 3 (사용자 요청 데이터 Error 상황처리) (0) | 2019.05.23 |
SpringMVC - 핸들러 메소드 - 2 (@ModelAttribute, @BindingResult, @Valid(매개변수 매핑, 에러, 유효성 검사 다루기)) (0) | 2019.05.23 |