Session
- 브라우저가 최초로 서버에 요청을 하게 되면 브러우저당 하나씩 메모리 공간을 서버에서 할당
- 이 메모리 영역은 브라우저당 하나씩 지정되며 요청이 새롭게 발생하더라도 같은 메모리 공간 사용
- 이러한 공간을 Session이라고 부른다.
- 이 영역은 브라우저를 종료할 때 까지 서버에서 사용할 수 있다.
SessionScope
- 브라우저가 최초의 요청을 발생시키고 브라우저를 닫을 때 까지
- SessionScope에서는 session영역에 저장되어 있는 데이터나 객체를 자유롭게 사용 가능
예제
1) index.jsp 생성
<%@ 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>
<a href='test1'>test1</a><br/>
<a href='result1'>result1</a><br/>
</body>
</html>
2) TestController 생성
@Controller
@SessionAttributes({"sessionBean1", "sessionBean2"})
public class TestController {
@GetMapping("/test1")
public String test1(){
return "test1";
}
@GetMapping("/result1")
public String result1(){
return "result1";
}
}
- Session영역은 request영역에서 추출하게 된다.
-따라서, 먼저 request를 주입받고 session을 추출한다.
@Controller
@SessionAttributes({"sessionBean1", "sessionBean2"})
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.printf("data1 : %s\n", data1);
return "result1";
}
}
3) test1.jsp 생성
<%@ 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>
<h1>test1</h1>
<h3>세션 영역에 저장완료</h3>
</body>
</html>
3) result1.jsp 생성
<%@ 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>
<h1>result1</h1>
<h3>data1 : ${sessionScope.data1 }</h3>
</body>
</html>
-jsp에서 session영역에서 접근하려면 sessionScope 사용
-실행 결과 : test1과 result1 각각의 매서드는 다른 요청이지만, 브라우저가 동일하기 때문에 session을 통해 값이 유지
***Spring에서는 request객체 주입받아 사용하지 않고 바로 session 객체를 바로 주입 가능
@GetMapping("/test1")
// public String result1(HttpServletRequest request) {
public String test1(HttpSession session){
//HttpSession session = request.getSession(); 생략 가능
session.setAttribute("data1", "문자열1");
return "test1";
}
세션에서 Bean 주입받아 사용하기
1) DataBean1 생성
public class DataBean1 {
private String data1;
private String data2;
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
}
2) 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(HttpSession session) {
DataBean1 bean1 = (DataBean1)session.getAttribute("bean1");
System.out.printf("bean1.data1 : %s\n", bean1.getData1());
System.out.printf("bean1.data2 : %s\n", bean1.getData2());
return "result4";
}
3) test4.jsp 생성
<%@ 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>
<h1>test4</h1>
<h3>세션 영역에 저장되었습니다</h3>
</body>
</html>
4) result4.jsp 생성
<%@ 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>
<h1>result4</h1>
<h3>bean1.data1 : ${sessionScope.bean1.data1 }</h3>
<h3>bean1.data2 : ${sessionScope.bean1.data2 }</h3>
</body>
</html>
***@SessionAttribute
Session 영역에 저장된 객체를 사용하고자 할 때 매서드의 매개변수로 @SessionAttribute를 사용하면
Session영역에 저장되어 있는 Bean을 주입받을 수 있다!
@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(HttpSession session) {
public String result4(@SessionAttribute("bean1") DataBean1 bean1) {
// DataBean1 bean1 = (DataBean1)session.getAttribute("bean1"); //생략 가능
System.out.printf("bean1.data1 : %s\n", bean1.getData1());
System.out.printf("bean1.data2 : %s\n", bean1.getData2());
return "result4";
}
-만약, test4 매서드에서 Bean에 값 저장할 때 @SessionAttribute를 사욯한다면 ? > 오류가 난다.
-헷갈리지 말아야 할 사항은, @SessionAttribute는 Session영역에 이미 저장되어 있는 Bean을 주입받는 것이지,
Bean을 새로 생성해서 주입받는 것이 아니라는 점이다.
-최초로 세션에 저장할 때는 세션을 주입받아 직접 저장해야 하고, 이미 저장되어 있는 객체를 사용할 때 @Sessionattribute를 사용한다.
@SessionAttributes
- ModelAttribute를 통해 주입 받는 Bean은 자동으로 Request 영역에 저장되고 Request 영역으로부터 주입 받음
- 이 때, @ModelAttribute를 통해 주입받는 Bean을 @SessionAttributes로 지정해 놓으면 request 영역이 아닌 session 영역에 저장되고, session영역으로부터 주입받을 수 있음
- 주의할 점은, @ModelAttribute를 활용하여 객체를 생성해 반환하는 매서드를 반드시 작성해야 한다.
예제
1)index.jsp 생성
<%@ 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>
<a href='test5'>test5</a><br/>
<a href='result5'>result5</a><br/>
</body>
</html>
2) TestController 생성
@Controller
@SessionAttributes("sessionBean1")
public class TestController {
@GetMapping("/test5")
public String test5(@ModelAttribute("sessionBean1") DataBean1 sessionBean1 {
@ModelAttribute("sessionBean1")
public DataBean1 sessionBean1() {
return new DataBean1();
}
//데이터만 담아주면 된다.
sessionBean1.setData1("문자열6");
sessionBean1.setData2("문자열7");
sessionBean2.setData1("문자열8");
sessionBean2.setData2("문자열9");
return "test5";
}
@GetMapping("/result5")
public String result5(@ModelAttribute("sessionBean1") DataBean1 sessionBean1,
@ModelAttribute("sessionBean2") DataBean1 sessionBean2) {
System.out.printf("sessionBean1.data1 : %s\n", sessionBean1.getData1());
System.out.printf("sessionBean1.data2 : %s\n", sessionBean1.getData2());
System.out.printf("sessionBean2.data1 : %s\n", sessionBean2.getData1());
System.out.printf("sessionBean2.data2 : %s\n", sessionBean2.getData2());
return "result5";
}
}
-request 영역이 아닌, session 영역에 저장되어 있는 객체라는 것을 명시하기 위하여 @SessionAttributes 사용
@SessionAttributes("sessionBean1")
-브라우저가 최초의 요청이 발생하게 되면 sessionBean1이라는 이름으로 등록된 매서드를 호출하여 그 매서드가 반환하는 객체를 Session에 자동으로 저장하고, 추후에 mapping 되어있는 매서드가 호출이 될 때 자동으로 주입된다.
-따라서 session객체에 저장 할 수 있도록 ModelAttribute를 정의해줘야 함
@ModelAttribute("sessionBean1")
public DataBean1 sessionBean1(){
return new DataBean1();
}
-여러 개의 객체를 SessionAttributes 할 때는 이렇게 쓴다.
@SessionAttributes({"sessionBean1", "sessionBean2"})
'SPRING' 카테고리의 다른 글
[SPRING] SessionScope Bean 주입 (0) | 2021.07.27 |
---|---|
[SPRING] 스프링 component-scan 개념 및 동작 과정 (0) | 2021.07.27 |
[SPRING] RequestScope Bean 주입 (0) | 2021.07.26 |
[SPRING] Request Scope (0) | 2021.07.25 |
[SPRING] Redirect와 Forward (0) | 2021.07.24 |
댓글