2020. 9. 13. 14:26ㆍJava/Spring
Session
- 브라우저가 최초로 서버에 요청을 하게 되면 브라우저당 하나씩 메모리 공간을 서버에서 할당하게 된다.
- 이 메모리 영역은 브라우저당 하나씩 지정되며 요청이 새롭게 발생하더라도 같은 메모리 공간을 사용하게 된다.
- 이러한 공간을 session 이라고 부른다.
- 이 영역은 브라우저를 종료할 때 까지 서버에서 사용할 수 있다.
SessionScope
- 브라우저가 최초의 요청을 발생 시키고 브라우저를 닫을 때 까지를 SessionScope라고 부른다.
- SessionScope 에서는 session 영역에 저장되어 있는 데이터나 객체를 자유롭게 사용할 수 있다.
Spring의 session은 HttpServletRequest 객체에 담겨져 있다. 아래와 같이 세션을 사용하기 위해서는 request 객체에서 불러와야 한다.
@Controller
public class TestController {
@GetMapping("/test1")
public String test1(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("data1","문자열1");
return "test1";
}
@GetMapping("/result1")
public String result1(HttpServletRequest request) {
HttpSession session = request.getSession();
String data1 = (String)session.getAttribute("data1");
System.out.println("data1"+data1);
return "result1";
}
}
위 코드에서 test1로 접근시 data1 공간에 문자열1을 세션에 담는다.
그리고 result1에 접근시 세션에서 해당 값을 받아서 사용한다.
아래와 같이 sessionScope에서 값을 꺼내 세션에 담긴 값을 view에서 사용 가능하다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
data1: ${sessionScope.data1}
</body>
</html>
controller의 result1 메소드에서 세션을 받아오지 않더라도 view에서 사용 가능하다!
세션을 request 객체에서 받아오지 않고 매개변수로 직접 세션을 받아서 사용 가능하다.
@Controller
public class TestController {
@GetMapping("/test1")
public String test1(HttpSession session) {
session.setAttribute("data1","문자열1");
return "test1";
}
@GetMapping("/result1")
public String result1(HttpSession session) {
String data1 = (String)session.getAttribute("data1");
System.out.println("data1"+data1);
return "result1";
}
}
위처럼 수정하여 세션객체를 매개변수로 직접 받아오는 것이 가능하다.
세션에 객체를 주입하는 방법은 아래와 같이 작성하면 된다.
@GetMapping("/test2")
public String test2(HttpSession session) {
DataBean1 bean1 = new DataBean1();
bean1.setData1("문자열1");
bean1.setData2("문자열2");
session.setAttribute("bean1",bean1);
return "test1";
}
@GetMapping("/result2")
public String result2(HttpSession session) {
DataBean1 databean1 = (DataBean1)session.getAttribute("bean1");
System.out.println("data1 =>"+databean1.getData1());
System.out.println("data1 =>"+databean1.getData2());
return "result2";
}
test2 메소드에서 새로운 bean1 객체를 만들고 이 객체에 값을 넣는다. 그 후 세션에 담아서 넘겨주게 된다.
@sessionAttribute를 사용하면 세션에 저장된 빈 객체를 바로 받아서 사용 가능하다.
@GetMapping("/result2")
public String result2(@SessionAttribute("bean1") DataBean1 bean1) {
System.out.println("data1 =>"+bean1.getData1());
System.out.println("data1 =>"+bean1.getData2());
return "result2";
}
result2 메소드를 위와 같이 바꾸면 bean1이름을 가진 세션에 저장된 객체를 가져와서 사용한다.
@SessionAttributes
- @ModelAttribute를 통해 주입 받는 Bean은 자동으로 Request 영역에 저장되고 Request 영역으로 부터 주입을 받게 된다.
- 이 때, @ModelAttribute를 통해 주입받는 Bean을 @SessionAttributes로 지정해 놓이면 request 영역이 아닌 session 영역에 저장되고 session 영역으로 부터 주입 받을 수 있다.
- 주의할 점은 @ModelAttribute를 활용하여 객체를 생성해 반환하는 메서드를 반드시 작성해 줘야 한다.
@Controller
@SessionAttributes("sessionBean1")
public class TestController {
@ModelAttribute("sessionBean1")
public DataBean1 sessionBean1() {
return new DataBean1();
}
@GetMapping("/test3")
public String test3(@ModelAttribute("sessionBean1") DataBean1 bean1) {
bean1.setData1("문자열1");
bean1.setData2("문자열2");
return "test3";
}
@GetMapping("/result3")
public String result3(@ModelAttribute("sessionBean1") DataBean1 bean1) {
System.out.println(bean1.getData1());
System.out.println(bean1.getData2());
return "result3";
}
}
@SessionAttributes로 sessionBean1을 사용하는 것을 명시해준다.
그 후 sessionBean1 @ModelAttribute의 반환을 DataBean1으로 해준다.
이렇게 설정하면 세션 영역에 sessionBean1의 이름으로 DataBean1객체가 자동으로 등록이 된다.
해당 객체는 메소드의 매개변수로 불러와 사용 가능하다.
'Java > Spring' 카테고리의 다른 글
Spring MVC - Cookie (0) | 2020.09.14 |
---|---|
Spring MVC - ApplicationScope (0) | 2020.09.14 |
Spring MVC - RequestScope 빈 주입 (0) | 2020.09.11 |
Spring MVC - RequestScope (0) | 2020.09.11 |
Spring MVC - Redirect, Forward (0) | 2020.09.10 |