-
Spring MVC - SessionSpring/Spring MVC 2021. 12. 29. 12:36728x90반응형
Session
- 브라우저가 최초로 서버에 요청을 하게 되면 브라우저당 하나씩 메모리 공간을 할당해준다.
- 브라우저당 하나씩 지정되므로 요청이 새롭게 발생하더라도 같은 메모리 공간을 사용한다.
- 브라우저 종료할 때 까지 Session은 유지되며 서버에서 사용할 수 있다.
SessionScope
- 브라우저가 최초의 요청을 발생 시키고 브라우저 닫을 때 까지를 SessionScope라 한다.
- SessionScope 에서는 Session 영역에 저장되어 있는 데이터나 객체를 자유롭게 사용 가능
방법 1 - HttpServletRequest 객체로 Session에 데이터 주입
브라우저가 요청을 하면 Session 객체가 생성되어 HttpServletRequest에 저장되므로 HttpServletRequest에서 Session 객체를 가져와서 사용 할 수 있다. 브라우저가 종료되지않으면 같은 브라우저에서 요청이 새로 발생하여도 Session 객체는 유지되며 Session객체에 저장되어있는 데이터들을 사용 할 수있다.
Spring에서는 Session 객체를 HttpSevletRequest를 통해 Session 객체를 가져오는게 아닌 직접 HttpSession으로 Session 객체를 주입 받을 수 있다.
HttpServletRequest와 HttpSession을 통한 Session 이용
Session을 이용하기위해 HttpServletRequest와 HttpSession을 통한 2가지 방법을 알아보자.
@Controller public class testController { @GetMapping("/test1") public String result1(HttpServletRequest request) { HttpSession session = request.getSession(); return "test1"; } @GetMapping("/result1") public String result1(HttpSession session) { String data1 = (String)session.getAttribute("data1"); System.out.println(data1); return "result1"; } }
public String result1(HttpServletRequest request) {
HttpSession session = request.getSession();
- HttpServletRequest를 이용한 Session 객체 사용
public String result1(HttpSession session) {
String data1 = (String)session.getAttribute("data1");
- Spring에서는 HttpSession을 통해 Session 객체를 주입받을 수 있다.
- 새로운 요청이 발생해도 Session 영역에 저장된 데이터는 유지된다.여기서 Session에 대해 다시한번 생각해보자. Session은 '브라우저가 종료될때까지 유지'가 되므로 redirect 방식으로 하던 forward 방식으로 하던 Session객체의 데이터들은 사라지지 않고 유지되어 사용 할 수 있다.
@SessionAttribute를 통한 parameter에 직접 Session 데이터 주입
이제 객체를 Session 저장하고 주입했던 객체를 가져와보자.
Session에 저장된 객체는 @SessionAttribute 를 통해 매개변수로 직접 가져 올 수 있다.
@Controller public class testController { @GetMapping("/test4") public String test4(HttpSession session) { DataBean1 bean1 = new DataBean1(); bean1.setData1("문자열4"); bean1.setData2("문자열5"); session.setAttribute("bean1", bean1); return "test4"; } @GetMapping("/result4") public String result4(@SessionAttribute("bean1") DataBean1 bean1) { System.out.println(bean1.getData1()); System.out.println(bean1.getData2()); return "result4"; } }
public String result4(@SessionAttribute("bean1") DataBean1 bean1) {
- Session 영역에 저장되어있는 데이터를 Parameter에 주입
- 이 방식을 사용하면 코드가 간결해진다.
- Session 영역에 "bea1" 이라는 Session 데이터가 없으면 오류가 발생(@ModelAttiribute와는 다르다.)
- HttpSession에서 Session 영역에 저장되어있는 데이터를 추출하는 방법은 다음과 같다.
public String result4(HttpSession session) {
DataBean1 bean1 = (DataBean1)session.getAttribute("bean1");
방법 2 - @SessionAttributes를 통해 Session 객체 사용
- @ModelAttribute를 통해 주입 받는 Bean은 자동으로 Request 영역에 저장되고
Request 영역으로부터 주입을 받게 된다. - 이 때, @ModelAttribute를 통해 주입받는 Bean을 @SessionAttributes로 지정해주면 request
영역이 아닌 session 영역에 저장되고 session 영역으로 주입 받을 수 있다. - 주의할 점은 @ModelAttribute를 활용하여 객체를 생성해 반환하는 메서드를 반드시 작성해야 한다.
@ModelAttribute는 원래는 Bean을 주입받아 Request 영역에 저장이 되지만 @SessionAttributes를 지정해주면 Request 영역이 아닌 Session 영역에 저장된다. 여기서 중요한점은 getter메소드를 만들어줘야한다.
@Controller @SessionAttributes("sessionBean1") public class testController { @ModelAttribute("sessionBean1") public DataBean1 sessionBean1() { return new DataBean1(); } @GetMapping("/test5") public String test5(@ModelAttribute("sessionBean1") DataBean1 sessionBean1) { sessionBean1.setData1("session 저장1"); sessionBean1.setData2("session 저장2"); return "test5"; } @GetMapping("/result5") // public String result5(@ModelAttribute("sessionBean1") DataBean1 sessionBean1) { public String result5(@SessionAttribute("sessionBean1") DataBean1 sessionBean1) { System.out.println(sessionBean1.getData1()); System.out.println(sessionBean1.getData2()); return "result5"; } }
@SessionAttributes("sessionBean1")
- request 영역이 아닌 Session 영역에 저장할 객체 설정
- 객체 여러개 설정은 배열로 써주면된다. ex) @SessionAttributes({"sessionBean1", "sessionBean2"})
@ModelAttribute("sessionBean1")
public DataBean1 sessionBean1() {
return new DataBean1();
}
- Session 영역에 저장할 객체를 주입한다.
- 사용하기 위해 getter 를 꼭 써줘야 한다.
public String test5(@ModelAttribute("sessionBean1") DataBean1 sessionBean1) {
- Request 영역이 아닌 Session 영역에 sessionBean1이라는 이름으로 저장된다.
public String result5(@SessionAttribute("sessionBean1") DataBean1 sessionBean1) {
- @SessonAttribute를 이용해 Session 영역에 저장된 "sessionBean1" 객체를 parameter에 주입한다.728x90반응형'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - ApplicationScope (0) 2021.12.29 Spring MVC - SessionScope 빈 주입 (0) 2021.12.29 spring MVC - requestScope 빈 주입 (0) 2021.12.27 Spring MVC - requestScope (0) 2021.12.27 Spring MVC - Redirect와 Forward (0) 2021.12.27