본문으로 바로가기

[Spring MVC] @SessionAttributes

category Spring/SpringMVC 2019. 8. 15. 01:30

@SessionAttributes

: 모델 정보를 HTTP 세션에 저장해주는 애노테이션

: HttpSession을 직접 사용할 수도 있지만 @SessionAttributes에 해당하는 모델 정보를 자동으로 세션에 넣어줌

: @ModelAttribute는 세션에 있는 데이터도 바인딩한다.

: 여러 화면(또는 요청)에서 사용해야 하는 객체를 공유할 때 사용한다.

 

 

<@SessionAttributes를 사용하기 전>

package com.example.demo;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SampleController {

	@GetMapping("/events/form")
	public String eventForm(Model model,HttpSession session) {
		Event event = new Event();
		event.setName("spring");
		event.setLimit(20);
		model.addAttribute(event);
		session.setAttribute("event", event);
		return "/events/form";		
	}
	
	@PostMapping("/events")
	public String createEvent(@Validated(Event.ValidateName.class) @ModelAttribute Event event1 , BindingResult bindingResult ) {
		if(bindingResult.hasErrors()) {
			return "/events/form";
		}
						
		return "redirect:/events/list";
	}

	@GetMapping("/events/list")
	public String getEvents(Model model,HttpSession session) {
		
		Event event = new Event();
		event.setName("spring");
		event.setLimit(10);
		
		Event sessionEvent = (Event)session.getAttribute("event");
		System.out.println("session Name is : " + sessionEvent.getName());
		
		List<Event> eventList = new ArrayList<Event>();
		eventList.add(event);
		model.addAttribute(eventList);
		
		return "/events/list";
	}
	
	
}

 

 

 

<@SessionAttributes를 사용>

package com.example.demo;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

@Controller
@SessionAttributes("event")
public class SampleController {

	@GetMapping("/events/form")
	public String eventForm(Model model) {
		Event event = new Event();
		event.setName("spring");
		event.setLimit(20);
		model.addAttribute(event);
		
		return "/events/form";		
	}
	
	@PostMapping("/events")
	public String createEvent(@Validated(Event.ValidateName.class) @ModelAttribute Event event1 , BindingResult bindingResult ) {
		if(bindingResult.hasErrors()) {
			return "/events/form";
		}
						
		return "redirect:/events/list";
	}

	@GetMapping("/events/list")
	public String getEvents(Model model,HttpSession session,SessionStatus sessionStatus) {
		
		Event event = new Event();
		event.setName("spring");
		event.setLimit(10);
		
		Event sessionEvent = (Event)session.getAttribute("event");
		System.out.println("session Name is : " + sessionEvent.getName());

		sessionStatus.setComplete();
		
		List<Event> eventList = new ArrayList<Event>();
		eventList.add(event);
		model.addAttribute(eventList);
		
		return "/events/list";
	}
	
	
}

 

결과는 동일하게 정상적으로 돌아갑니다. 

위의 코드를 보면 Session을 직접 넣어주는 코드는 없습니다.

model에 특정 객체를 넣으면 @SessionAttributes는 그 모델에 넣은 객체의 이름과 같은것을 Session에 넣어줍니다.

@SessionAttributes는 여러개의 객체를 세션에 넣을수 있고

SessionStatus를 통해 session을 초기화 해줄수있다.

'Spring > SpringMVC' 카테고리의 다른 글

[Spring MVC] RedirectAttributes  (0) 2019.08.19
[Spring MVC] @SessionAttribute  (0) 2019.08.19
[Spring MVC] @Valid vs @Validated  (1) 2019.08.13
[Spring MVC] @ModelAttribute  (0) 2019.08.13
[Spring MVC] 요청 매개변수 ( @RequestParam)  (0) 2019.08.13