Gidhub BE Developer

Spring MVC - @SessionAttribute 애노테이션

2019-09-14
goodGid

이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.

@SessionAttribute

  • @SessionAttribute은

    Controller 밖(Interceptor or Filte 등)에서 만들어 준

    Session 데이터에 접근할 때 사용한다.


Example Code

  • 해당 서버에 처음으로 방문한 시간을

    HttpSession에 저장하는 작업을 해보자.


  • Interceptor를 생성하고

    그 Interceptor에서 HttpSession에

    방문 시간을 저장시키는 코드를 추가한다.

Interceptor

public class VisitTimeInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) throws Exception {
        HttpSession httpSession = request.getSession();
        if (httpSession.getAttribute("visitTime") == null) {
            httpSession.setAttribute("visitTime", LocalDateTime.now());
        }
        return true; // true를 return해야 
                     // 다음 핸들러 혹은 인터셉터까지 요청 처리가 된다.
    }
}
  • Configuration에 Interceptor를 등록하고

Configuration

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new VisitTimeInterceptor());
    }
}
  • Controller에서 HttpSession에 있는 방문 시간을 출력한다.

Controller

@Controller
@RequestMapping
public class SampleController {

    @GetMapping("/events")
    @ResponseBody
    public String hello(Model model, @SessionAttribute LocalDateTime visitTime) {
        System.out.println(visitTime);
        return "hello";
    }
}

TC

@Test
public void helloTest() throws Exception {
    mockMvc.perform(get("/events"))
            .andDo(print())
            .andExpect(status().isOk());
}

Result

2019-09-14T11:19:00.320

차이점

HttpSession와 차이점

  • HttpSession으로도 방문 시간을 출력할 수 있다.


  • 하지만 httpSession.getAttribute()

    Object Type을 Return하므로

    Type Conversion이 필요하다.

public Object getAttribute(String name) {
        this.assertIsValid();
        Assert.notNull(name, "Attribute name must not be null");
        return this.attributes.get(name);
    }

Controller

@GetMapping("/events")
@ResponseBody
public String hello(Model model, HttpSession httpSession) {
    LocalDateTime visitTime = (LocalDateTime) httpSession.getAttribute("visitTime");
    System.out.println(visitTime);
    return "hello";
}
  • 그렇기 때문에

    Type Conversion을 자동 지원하는

    SessionAttribute를 사용하면 불필요한 Type Conversion 코드가 필요없다.


SessionAttributes와 차이점

  • @SessionAttributes는 해당 Controller에서만 유효하다.

    하지만 @SessionAttribute는 Controller 밖에서 생성된 데이터에도 접근이 가능하다.


Reference


Comments

Index