SPRING

[SPRING] SessionScope

예나부기 2021. 7. 27.

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

댓글