진짜 개발자
본문 바로가기

FrameWork/Spring MVC

SpringMVC - 핸들러 메소드 - 5 (session 관련 argument @SessionAttributes(s), @SessionAttribute, SessionStatus)

728x90
Session 관련 설정 (@SessionAttributes, @SessionAttribute, @SessionStatus)

이번시간에는 Session 관련 설정에 대해 알아보도록하겠습니다. 어노테이션 이름만 보더라도 어떤 역할을 할지 이제는 조금씩 예상이 가기 시작합니다. 하나하나 살펴보며 정리를 해보도록하겠습니다.

 

1. @SessionAttribute

1.1 @SessionAttribute 란?

sessionAttribute는 HttpSession에 저장되어있는 값을 Handler의 매개변수에 맵핑해주는 어노테이션 입니다.

 

1.2 @SessionAttribute 예제

사용자가 처음 요청을 보낼때의 시간을 기록하고 첫 요청시간을 콘솔에 출력해주도록 하겠습니다.

 

HandlerInterceptor


session에 사용자가 첫 요청할때의 시간을 저장하기 위해서, HandlerInterceptor를 이용하도록 하겠습니다. HandlerInterceptor는 핸들러에게 값을 전달하기 전에 먼저 요청을 가로채어 필요한 처리를 한 뒤 Handler에게 요청을 전달해주는 역할을 합니다. 이때, preHandler()에서 return하는 값이 true여야 다음 HandlerInterceptor 또는 Handler에게 request를 전달합니다.

 

당연히 HandlerInterceptor를 생성했으니 이것을 설정파일을 통해 등록을 해주어야합니다. WebMvcConfigurer를 구현하고, addInterceptors() 메소드를 오버라이딩하여 편리하게 HandlerInterceptor를 등록할 수 있습니다. 이 HandlerInterceptor는 /events/list의 요청만을 가로채도록 설정했습니다.

 

Handler


이제 앞서 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) 예제

이번 예제는 간단하게도 이것이 다입니다. 하나하나 살펴보겠습니다.

 

@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값을 비울 수 있습니다.

 

이전 예제에서 /evetns/list를 맵핑하는 핸들러만을 수정합니다. 매개변수로 SessionStatus를 추가하고, sessionStatus의 setComplete() 메소드를 호출하도록 합니다.

 

맨 처음에는 시간이 출력됩니다. 하지만 새로고침을 클릭하면 visitTime session이 삭제되면서 그러한 attribute가 없다는 에러가 출력됩니다.