@SessionAttributes는 스프링 MVC에서 특정 모델 속성을 HTTP 세션에 저장하고 관리하기 위해 사용되는 어노테이션입니다.
기본적인 사용 방법은 다음과 같습니다:
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.stereotype.Controller;
@Controller
@SessionAttributes("user")
public class UserController {
@GetMapping("/user/form")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "userForm";
}
@PostMapping("/user/save")
public String saveUser(@ModelAttribute("user") User user) {
// user 객체는 세션에서 가져와 업데이트됨
userService.saveUser(user);
return "userSaved";
}
}
@ModelAttribute와 함께 사용 시, 세션에서 속성을 자동으로 바인딩합니다.SessionStatus 객체를 통해 세션 속성을 명시적으로 정리할 수 있습니다.@Controller
@SessionAttributes({"user", "shoppingCart"})
public class ShoppingController {
// 컨트롤러 메소드들...
}
@Controller
@SessionAttributes(types = {User.class, ShoppingCart.class})
public class ShoppingController {
// 컨트롤러 메소드들...
}
@PostMapping("/checkout")
public String checkout(@ModelAttribute("shoppingCart") ShoppingCart cart,
SessionStatus status) {
orderService.createOrder(cart);
status.setComplete(); // 세션에서 속성 제거
return "orderConfirmation";
}
@ModelAttribute("user")
public User getUser() {
return new User(); // 세션에 없으면 새 객체 생성
}
@PostMapping("/user/update")
public String updateUser(@ModelAttribute("user") User user) {
// user 객체는 세션에서 가져와 업데이트됨
userService.updateUser(user);
return "userUpdated";
}
SessionStatus.setComplete()를 호출하여 정리하세요.@SessionAttributes: 특정 컨트롤러에 한정된 세션 관리에 적합합니다.HttpSession: 애플리케이션 전반의 세션 관리에 사용됩니다.@SessionAttributes가 적용된 컨트롤러를 테스트할 때:
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void testSessionAttributes() throws Exception {
mockMvc.perform(get("/user/form"))
.andExpect(status().isOk())
.andExpect(model().attributeExists("user"))
.andExpect(request().sessionAttribute("user", instanceOf(User.class)));
mockMvc.perform(post("/user/save")
.param("name", "John Doe"))
.andExpect(status().isOk())
.andExpect(request().sessionAttribute("user", hasProperty("name", is("John Doe"))));
}
}
@SessionAttributes는 스프링 MVC에서 세션 기반의 데이터 관리를 간편하게 할 수 있게 해주는 유용한 도구입니다. 특히 여러 단계에 걸친 폼 처리나 위저드 형태의 인터페이스 구현에 적합합니다. 그러나 세션 데이터 관리에는 메모리 사용, 동시성, 보안 등의 고려사항이 있으므로 신중하게 사용해야 합니다. 적절히 사용하면 사용자 경험을 향상시키고 서버-클라이언트 간 데이터 전송을 최적화할 수 있지만, 과도한 사용은 애플리케이션의 확장성과 유지보수성을 저하시킬 수 있습니다.
@ModelAttribute
@Controller
@RequestMapping
@InitBinder
@ControllerAdvice