ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - Session
    Spring/Spring MVC 2021. 12. 29. 12:36
    반응형

     

    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에 주입한다.

     

     

    반응형

    '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

    댓글

Designed by Tistory.