화면전환 관련 내용
- redirect : request를 새로 생성한 후 페이지를 이동한다.
- forward : request를 유지한 채로 페이지를 이동한다.
Web Application에서 데이터를 저장하고 공유하는데 사용되는 3가지 메모리의 범위
- ApplicationScope
- 애플리케이션 전체에서 데이터를 저장하고 공유
- 웹 애플리케이션이 시작되고 종료될 때까지 유지
- 애플리케이션의 설정 정보나 공통으로 사용되는 데이터는 ApplicationScope에 저장할 수 있다.
- 모든 사용자와 모든 요청에서 공유되므로 주의해서 사용해야 하고, 변경 가능한 데이터의 경우 동기화 문제를 고려해야 한다.
- SessionScope
- 사용자별로 데이터를 저장하고 공유
- 사용자별로 생성되고, 해당 사용자의 세션이 유지되는 동안 계속 유지된다.
- 세션이란 사용자가 웹 애플리케이션과 상호작용하는 동안 유지되는 상태를 말한다.
- SessionScope에 저장된 데이터는 동일한 사용자의 여러 요청에서 공유될 수 있다.
- 예를 들어, 사용자가 로그인한 후에 사용자 정보를 저장하고 여러 페이지에서 이를 사용해야 하는 경우, 해당 데이터는 SessionScope에 저장할 수 있다.
- 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";
}
@RequestMapping("/flowRedirect")
public String flowRedirect(Model model) {
System.out.println("flowRedirect 들어옴");
model.addAttribute("red1", "redirect로 전달하는 값");
return "redirect:/flowmain";
}
@RequestMapping("/flowForward")
public String flowForward(Model model) {
System.out.println("flowForward 들어옴");
model.addAttribute("fwd1", "forward로 전달하는 값");
return "forward:/flowmain";
}
sessionScope
@RequestMapping("/flowsession")
public String flowSession(HttpServletRequest request) {
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을 받아서 저장함");
ProductDto pd1 = new ProductDto();
pd1.setCategory("pd1 category");
pd1.setProduct("pd1 product");
model.addAttribute("pd1", pd1);
ProductDto pd2 = new ProductDto();
pd2.setCategory("pd2 category");
pd2.setProduct("pd2 product");
session.setAttribute("pd2", pd2);
return "flowsession";
}
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>
<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>