Day085

RISK_TAKER·2023년 6월 1일
0

화면전환 관련 내용

  • redirect : request를 새로 생성한 후 페이지를 이동한다.
  • forward : request를 유지한 채로 페이지를 이동한다.

Web Application에서 데이터를 저장하고 공유하는데 사용되는 3가지 메모리의 범위

  1. ApplicationScope
  • 애플리케이션 전체에서 데이터를 저장하고 공유
  • 웹 애플리케이션이 시작되고 종료될 때까지 유지
  • 애플리케이션의 설정 정보나 공통으로 사용되는 데이터는 ApplicationScope에 저장할 수 있다.
  • 모든 사용자와 모든 요청에서 공유되므로 주의해서 사용해야 하고, 변경 가능한 데이터의 경우 동기화 문제를 고려해야 한다.
  1. SessionScope
  • 사용자별로 데이터를 저장하고 공유
  • 사용자별로 생성되고, 해당 사용자의 세션이 유지되는 동안 계속 유지된다.
  • 세션이란 사용자가 웹 애플리케이션과 상호작용하는 동안 유지되는 상태를 말한다.
  • SessionScope에 저장된 데이터는 동일한 사용자의 여러 요청에서 공유될 수 있다.
  • 예를 들어, 사용자가 로그인한 후에 사용자 정보를 저장하고 여러 페이지에서 이를 사용해야 하는 경우, 해당 데이터는 SessionScope에 저장할 수 있다.
  1. RequestScope
  • 요청 단위로 데이터를 저장하고 공유한다.
  • 각 HTTP 요청마다 생성되고 해당 요청의 수명 동안 유지된다.
  • RequestScope에 저장된 데이터는 해당 요청에 대한 처리 과정에서만 사용할 수 있다.
  • 다른 사용자나 다른 요청과 공유되지 않는다.
  • 예를 들어, 사용자가 웹 페이지에 데이터를 입력하고 제출할 때, 해당 요청의 처리 중에만 사용되어야 하는 데이터는 RequestScope에 저장할 수 있다.

requestScope / (redirect, forward)

  • model에 값을 담아서 forward로 값을 전달한 경우 받는 쪽에서 request를 통해서 받아야 한다.
  • model.getAttribute()로 받으면 값을 받을 수 없다.
	@RequestMapping("/flowmain")
	public String flowMain(HttpServletRequest request) {
				
		System.out.println("flowmain 들어옴");
		String fw1 = (String)request.getAttribute("fwd1");
		System.out.println("forward에서 넘어온 fwd1 : " + fw1);
		
		String red1 = (String)request.getAttribute("red1");
		System.out.println("redirect에서 넘어온 red1 : " + red1);
		
		return "flowmain";
	}
	
	/*
	redirect : 사용자에게 다시 요청해라. 다른 페이지로 이동
	forward	 : 사용자에게 보여줄 화면을 다른 쪽으로 조정
	*/
	@RequestMapping("/flowRedirect")
	public String flowRedirect(Model model) {
		
		System.out.println("flowRedirect 들어옴");
		model.addAttribute("red1", "redirect로 전달하는 값");
		
		//request를 다시 만든다.
		return "redirect:/flowmain";
	}
	
	@RequestMapping("/flowForward")
	public String flowForward(Model model) {
		
		System.out.println("flowForward 들어옴");
		model.addAttribute("fwd1", "forward로 전달하는 값");
		
		//request를 다시 만들지 않는다. request유지 상태
		return "forward:/flowmain";
	}

sessionScope

	//sessionscope
	@RequestMapping("/flowsession")
	public String flowSession(HttpServletRequest request) {
		
		//request에서 session에 접근할 수 있다.
		HttpSession session = request.getSession();
		session.setAttribute("sessionKey", "sessionValue");
		
		request.setAttribute("sessionKey", "requestScope값");
		
		return "flowsession";
	}
    
    @RequestMapping("/flowsession3")
	public String flowSession3(HttpSession session, Model model) {

		session.setAttribute("sessionKey", "session을 받아서 저장함");
		
		//request에 저장
		//model에 넣으면 request범위에 들어간다.
		ProductDto pd1 = new ProductDto();
		pd1.setCategory("pd1 category");
		pd1.setProduct("pd1 product");
		
		model.addAttribute("pd1", pd1);
		
		//session에 저장
		ProductDto pd2 = new ProductDto();
		pd2.setCategory("pd2 category");
		pd2.setProduct("pd2 product");
		session.setAttribute("pd2", pd2);
		
		return "flowsession";
	}

applicationScope

	//applicationScope
	//서버가 종료되거나 재시작되면 값이 리셋된다.
	@RequestMapping("/setApp")
	public String setApp(HttpServletRequest request) {
		
		ServletContext sc = request.getServletContext();
		sc.setAttribute("appKey", "application 범위 값");
		
		return "appScope";
	}
	
	@RequestMapping("/getApp")
	public String getApp() {
		
		return "appScope";
	}

view 페이지에서 전달받은 값을 출력하는 방법

	<p>sessionKey : ${sessionScope.sessionKey}</p>
	<p>requestKey : ${requestScope.sessionKey}</p>

	<!-- sessionKey와 requestKey 동시에 같은 값으로 들어오는 경우 requestKey 값이 출력된다. -->
	<p>Key : ${sessionKey}</p>
	<hr/>

	<p>${requestScope.pd1.category} ${requestScope.pd1.product}</p>
	<p>${sessionScope.pd2.category} ${sessionScope.pd2.product}</p>
	<p>${pd1.category} ${pd1.product}</p>
	<p>${pd2.category} ${pd2.product}</p>
	<p>${appKey}</p>
	<hr/>
	<p>${applicationScope.appKey}</p>

0개의 댓글