@SessionAttributes @SessionAttribute / 스프링 세션 어노테이션 사용법 @ModelAttribute와 함께사용!
오늘은 @SessionAttributes @SessionAttribute에 대해서 알아보자
먼저 @SessionAttributes @SessionAttribute 는 마지막에 s가 붙냐안붙냐로
2개가 다르다 !
먼저 s가 뒤에 붙은 @SessionAttributes는
package kr.co.softcampus.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import kr.co.softcampus.beans.DataBean1;
@Controller
@SessionAttributes({"sessionBean1","sessionBean2"}) //sessionBean1은 Request영역이 아닌 session영역에 지정해줘!라는뜻 (test5 result5에서 사용할것)
public class TestController {
//~ 메소드 내용
이렇게 클래스 영역 바로 위에다 적는것이다.
@SessionAttributes 는 저렇게 배열로 2개 이상 사용가능하며 그냥 1개만 사용하려면
@SessionAttributes("~") 이렇게 사용하면 된다.
뜻부터 알아보자면
@SessionAttributes("abcd") 이렇게 있으면
"abcd"를 session 영역에 저장해줘! 라는 뜻이다.
이런 상황이 생긴 후 @SessionAttributes("abcd")가 해주는 역할은
코드 안에서 @SessionAttributes("abcd") 의 "abcd"와 일치하는
@ModelAttribute 메소드를 찾고 그 메소드의 리턴값을 "abcd"에 저장하게 된다
(무조건 @SessionAttributes 는 @ModelAttribute와 함께 사용한다!!!!!!)
@ModelAttribute("sessionBean1")
public DataBean1 sessionBean1() {
return new DataBean1();
}
이것을 찾아준다. (여기서 @ModelAttribute 옆에 있는 "sessionBean1"을 "abcd"라고 생각해라)
그리고 나중에 밑에서 Mapping시켜주는 메소드를 찾게되면
@GetMapping("/test5")
public String test5(@ModelAttribute("sessionBean1")DataBean1 sessionBean1,
@ModelAttribute("sessionBean2")DataBean1 sessionBean2) {
sessionBean1.setData1("문자열6");
sessionBean1.setData2("문자열7");
sessionBean2.setData1("문자열8");
sessionBean2.setData2("문자열9");
return "test5";
}
여기에 있는 @ModelAttribute("sessionBean1")DataBean1 sessionBean1 에다가
("sessionBean1"가 같음으로 저절로 찾아줌)
sessionBean1에 아까 생성된 return값을 넣어준다 (위에서는 new DataBean1(); )
이런식으로 사용하는것이고 session값이 이렇게 유지 될 수 있다.
출력은 이렇게
<h3>sessionBean1.data1 : ${sessionScope.sessionBean1.data1 }</h3>
<h3>sessionBean1.data2 : ${sessionScope.sessionBean1.data2 }</h3>
--------------------------------------------------------------------------------------------------------
세션은 redirect나 forward를 하나 계속 유지된다.(브라우져가 꺼지기 전까지)
세션의 기본활용법
@GetMapping("/test1")
// public String test1(HttpServletRequest request) {
public String test1(HttpSession session) {
// HttpSession session = request.getSession(); //이렇게 하는건 JSP에서함(Spring에서는 바로 파라미터에 세션받기 가능)
session.setAttribute("data1", "문자열1");
return "test1";
}
@GetMapping("/result1")
// public String result1(HttpServletRequest request) { 세션객체를 바로 주입받을수도
// 있음(Spring에서 가능한것)
public String result1(HttpSession session) {
// HttpSession session = request.getSession();
String data1 = (String) session.getAttribute("data1"); // session.getAttribute는 Object를 반환하므로 형변환이 꼭 필요하다.
System.out.println("data1 : " + data1);
return "result1";
}
이렇게 파라미터에 HttpSession을 넣어서 바로 사용할 수 있다.
(HttpServletRequest 사용후 getSession안하고 바로 HttpSession활용 굿)
session.getAttribute는 Object를 반환하므로 형변환을 꼭해주자.
출력할때는 이렇게 한다
<h3>data1 : ${sessionScope.data1 }</h3>
---------------------------------------------------------------------------------------------------------------------------
@SessionAttribute 사용법 (뒤에 s 없음!!!!!!!!!!!)
@SessionAttribute 는 위의
session.getAttribute를 더욱 간단하게 어노테이션을 통해 만들어주는것이다.
정보를 주는 쪽에서는 사용이 X하고 (주는 쪽에서는 HttpSession session 사용)
받는 쪽에서 @SessionAttribute를 사용해서 정보를 더욱 빠르게 받을 수 있다.
코드로 살펴보자
@GetMapping("/test4")
public String test4(HttpSession session) {
// public String test4(@SessionAttribute("bean1")DataBean1 bean1) { 이렇게는 사용불가!!!
// 사용불가한 이유는 @SessionAttribute는 session영역에 이미 있는것을 가져오는거지
// 새로운 객체를 저장하는 용도는 아니기 때문이다.(@ModelAttribute랑 헷갈리지말기!)
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"); //이렇게 안하고 @SessionAttribute로 바로 Bean을 주입받을수도 있다
System.out.println("bean1.data1 : "+bean1.getData1());
System.out.println("bean1.data2 : "+bean1.getData2());
return "result4";
}
// @SessionAttribute를 사용하면 Session영역에 저장된 Bean을 주입 받을수 있다.
// (메서드의 매개변수에 @SessionAttribute를 써야된다)
이렇게 내가 원하는 정보를 먼저
HttpSession을 이용하여 session에 저장한다.
session.setAttribute("bean1", bean1); 이렇게 하고
그럼 "bean1"이 저장되겠죠?
그걸 받는쪽에서 파라미터로
public String result4(@SessionAttribute("bean1")DataBean1 bean1) 이렇게 받으면
바로 받아서 사용할 수 있다.
기억하자 주는쪽은 HttpServlet 사용
받는쪽에서 어노테이션 @SessionAttribute 을 사용!!!!
출력방법
<h3>bean1.data1 : ${sessionScope.bean1.data1 }</h3>
<h3>bean1.data2 : ${sessionScope.bean1.data2 }</h3>
자 이렇게
@SessionAttributes
@SessionAttribute
@ModelAttribute
에 대해서 알아보았다.