Spring

@SessionAttributes @SessionAttribute / 스프링 세션 어노테이션 사용법 @ModelAttribute와 함께사용!

shika 2022. 1. 25. 22:46

오늘은 @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

에 대해서 알아보았다.