Spring @SessionAttributes, @SessionStatus: Model과 연동을 통한 상태 유지

HTTP 요청에 의해 동작하는 Servlet은 기본적으로 상태를 유지하지 않아 매 요청이 독립적으로 처리됩니다. 

`@SessionAttributes` 어노테이션은 컨트롤러 클래스나 메서드에 적용하여 세션에 데이터를 유지하고자 할 때 사용합니다. 이 어노테이션은 특정 Model 속성을 세션에 저장하고 세션에서 해당 속성을 유지하는 역할을 합니다.

 

Session에 데이터를 넣어 유지하는 상황은 다음과 같습니다. 로그인 정보 유지, 장바구니, 여러 페이지에 걸쳐 단계적으로 정보 입력하는 경우 등

 

@SessionAttributes

속성명 지정

@Controller
@SessionAttributes("user")
public class UserController {

    @GetMapping("/user")
    public String getUser(@ModelAttribute("user") User user) {
        // 세션에서 user 속성을 가져와서 사용
        return "user";
    }

    @PostMapping("/user")
    public String updateUser(@ModelAttribute("user") User user) {
        // 사용자 정보를 업데이트 및 세션에 저장
        return "redirect:/user";
    }
}

 

  • `@SessionAttributes`에 지정한 이름과 동일한 Model 속성을 세션에 유지하도록 지정합니다.
  • getUser 메서드에서 `@ModelAttribute("user")`를 통해 세션에서 `user` 속성을 가져올 수 있습니다.
  • updateUser 메서드에서 `@ModelAttribute("user")`를 통해 세션의 `user` 속성을 업데이트하고 저장할 수 있습니다.

`@SessionAttributes`에 속성명을 지정하는 방식 뿐 아니라 클래스명을 지정하는 방식도 있습니다.

 

 

클래스명 지정

@Controller
@SessionAttributes(types = User.class)
public class UserController{
	// ...
}

Model에 추가한 객체 중에 types 속성에서 지정한 클래스의 객체가 있다면 그 객체를 HTTP 세션에 추가합니다.

 


@SessionStatus

@Controller
@SessionAttributes("user")
public class UserController {

    @GetMapping("/logout")
    public String logout(@ModelAttribute("user") User user, SessionStatus sessionStatus) {
    
        // 사용자 로그아웃 처리 및 세션에 저장된 user 속성을 제거합니다.
        
        sessionStatus.setComplete();
        return "redirect:/login";
    }
}

`SessionStatus` 객체를 사용하여 세션 상태를 완료 상태로 표시하고, 즉 `setComplete()`를 호출하여 user 속성을 세션에서 제거합니다. 

 

엄밀히 말하면 `setComplete()` 호출하면 객체가 바로 삭제되는 것은 아니고 세션 처리가 완료됐음을 표시합니다.

실제로 삭제되는 것은 핸들러 메소드의 처리가 완료된 후 프레임워크 내부적으로 HTTP 세션 객체를 삭제하는 것이므로 setComplete을 호출한 직후에 이동한 뷰(View)에서는 HTTP 세션에서 삭제한 객체를 Model에서 참조할 수 있습니다.