Spring/MVC

학습 // Spring // MVC // Session

문스코딩 2018. 8. 21. 13:47
업데이트 :: 2018.08.21



HTTP 세션

  • javax.servlet.http.HttpSession

세션에서 데이터를 관리하는 법

  • @SessionAttributes(세션속성) 이용
    • 스프링 MVC의 org.springframework.ui.Model에 추가한 객체
  • 세션 스코프 이용
    • HTTP 세션에 관리하고 싶은 객체를 DI 컨테이너에 세션 스코프 빈으로 등록
  • HttpSession API 이용
    • HttpSession API( setAttribute, getAttribute, removeAttribute )를 직접 사용

세션 속성 (@SessionAttributes)

  • @org.springframework.web.bind.annotation.SessionAttributes
    • 하나의 컨트롤러에서 여러 요청간에 데이터를 공유하는 경우 효과적

세션에 관리할 객체를 지정하는 방법

  • 클래스명 지정 : 관리대상이 되는 클래스명을 types 속성에 지정
  • 속성명 지정 : 관리대상이 되는 객체명을 names 속성에 지정

@Controller
@RequestMapping("/accounts")
@SessionAttributes(types=AccountCreateForm.class)
public class AccountCreateController {

}
  • HTTP 세션에 저장할 객체의 클래스를 @SessionAttributes의 타입속성에 지정
    • @ModelAttribute 애너테이션이 붙은 메서드나 Model의 addAttribute()를 통해 Model에 추가한 객체중에 저장

@Controller
@RequestMapping("/accounts")
@SessionAttributes(name="password")
public class AccountCreateController {

}
  • name 속성을 이용해서 세션에 저장할 객체의 속성명을 지정
    • 같은 클래스로 만들어지는 객체 중 관리할것과 관리하지 않을 것이 섞인 경우 사용

세션에 객체를 저장하고 저장된 객체를 이용하는 방법

  • @SessionAttributes를 이용해서 객체를 HTTP 세션안에 관리하고 싶다면 Model에 저장
  • Model에 저장한 객체 중에서 HTTP 세션에 관리하겠다고 지정한 객체만 HTTP 세션에 저장
  • HTTP 세션에 관리되는 객체 중에서 HTTP 세션에 관리하겠다고 지정한 객체가 Model에 저장

@Controller
@RequestMapping("/accounts")
@SessionAttributes(types=AccountCreateForm.class)
public class AccountCreateController {

  @ModelAttribute("accountCreateForm")
  public AccountCreateForm setUpAcccountCreateForm() {
    return new setUpAcccountCreateForm();
  }
}
  • @ModelAttribute 메서드에서 반환한 객체가 Model에 저장
  • @SessionAttributes에 저장한 types에 해당하므로 HTTP 세션에 저장

@RequestMapping(path="create", method=RequestMethod.POST)
public String create(
  @Validated AccountCreateForm form,
  BindingResult result,
  @ModelAttribute("password") String password,
  RedirectAttributes, redirectAttributes) {
      // do something
      return "redirect:/account/create?complete";
}
  • Model에서 객체를 받기 위한 인수를 선언
  • 인수에 클래스명의 첫글자를 소문자로 바꾼 이름과 같은 객체가 설정
  • Model에서 가져올 객체의 이름을 @ModelAttribute의 value속성에 지정가능
  • 만약 해당객체가 Model(HTTP세션)에 존재하지 않으면 RequiredException 발생

세션에 저장된 객체의 삭제

@RequestMapping(path="create", params="complete" method=RequestMethod.GET)
public String createComplete(SessionStatus sessionStatus) {
      sessionStatus.setComplete();
      return "account/createComplete";
}
  • SessionStatus이 setComplete()로 세션처리가 완료됬을을 표시
    • @SessionAttributes에 관리되던 객체가 모두 삭제
    • SesstionStatus의 setComplete() 직후에 바로 객체가 삭제되는 것은 아님
      • 실제는 메서드의 처리가 완료된후에 프레임워크가 내부적으로 HTTP 세션에 객체를 삭제
    • Handler메소드후에 HTTP세션에서 객체가 삭제되지만, 뷰와의 연게영역(Model)에는 같은 객체가 남음
      • setComplete() 후에 이동한 뷰에서는 HTTP세션에서 삭제한 객체를 Model에서 참조가 가능

뷰에서 접근하는 방법

이메일주소 : <c:out value="${accountCreateForm.email}" />

세션 스코프 빈

  • 여러 컨트롤러에 걸쳐 화면을 이동해야 할 때, 컨트롤러 간에 데이터를 공유하는 매개체

세션 스코프 빈 정의

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Cart implements Serializable {

}
  • 애너테이션이용방식

@Bean
@Scope(value="session" proxyMode=ScopedProxyMode.TARGET_CLASS)
public Cart cart() {
  return new Cart();
}
  • 자바이용방식

세션 스코프 빈 이용

@Controller
@RequestMapping("/items")
public class ItemController {
  @Autowired
  Cart cart;
  // do something
}

@Controller
@RequestMapping("/cart")
public class CartController {
  @Autowired
  Cart cart;
  // do something
}

@Controller
@RequestMapping("/orders")
public class OrderController {
  @Autowired
  Cart cart;
  // do something
}
  • 세션 스코프 빈을 컨트롤러에 인젝션

뷰에서 접근하는 방법

<spring:eval var="cart" expression="@cart" />
<c:forEach var="cartItem" items="${cart.cartItems}">
  <!-- do something -->
</c:forEach>

Created by MoonsCoding

e-mail :: jm921106@gmail.com


반응형

'Spring > MVC' 카테고리의 다른 글

학습 // Spring // MVC // Async  (0) 2018.08.21
학습 // Spring // MVC // FileUpload  (0) 2018.08.21
구현 // Spring // MVC // MVC tutorial  (0) 2018.08.21
학습 // Spring // MVC // 구조  (0) 2018.08.21
학습 // Spring // MVC  (0) 2018.08.21