반응형
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에서 참조할 수 있습니다.
반응형
'Spring Framework' 카테고리의 다른 글
Spring 비동기 처리 @Async, CompletableFuture, TaskDecorator (0) | 2022.09.09 |
---|---|
Spring 파일 업로드 (0) | 2022.09.07 |
Spring REST API 개념과 흐름도 (0) | 2022.09.06 |
Spring Model 객체: 컨트롤러에서 뷰로 데이터 전달 (0) | 2022.09.06 |
Spring @RequestMapping과 이에 대한 속성 (0) | 2022.09.05 |