스프링 MVC

Model로 해당 이름으로 값을 속성으로 추가하면 세션에도 동일한 이름으로 추가
세션에 해당 이름의 값이 있으면 Model에 자동 추가
Magic Form - 여러페이지의 양식
🔸 설문조사 양식


#step1.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:url var="actionUrl" value="/survey/step2"/>
<h1>step1</h1>
<form:form method="post" action="${actionUrl}" autocomplete="off" modelAttribute="requestSurvey">
질문1 : <form:input path="q1"/><br>
질문2 : <form:input path="q2"/><br>
<button type="submit">다음 설문</button>
</form:form>
#step2.jsp 동일 폼 작성 ...
#step3.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
질문1 : ${requestSurvey.q1}<br>
질문2 : ${requestSurvey.q2}<br>
질문3 : ${requestSurvey.q3}<br>
질문4 : ${requestSurvey.q4}



1번 2번값은 넘어오지않았다. 두번째 form 에서 step3으로 넘겨준거지 첫번째 form 내용은 넘겨주지 않았기 때문
🔹 SessionAttributes 값 유지시켜주고 model쪽에 넘겨준다.
강사님 말씀(o′┏▽┓`o)
@SessionAttrributes("속성명") 역시 @ModelAttribute 또는 Model과 서로 연결 되는데요. 보통 뷰에서 공유할 값은 request 범위의 속성으로 추가되지만 @SessionAttributes로 지정한 값은 세션 범위에서 값이 임시로 저장함으로써 이 역시 뷰에서 사용할 수 있다고 보시면 됩니다.
여러 페이지로 구성된 양식일경우 자주 사용됨

기본 post 동작 범위는 Request임
step1의 값을 남겨두기 위해서 범위를 session으로 확장 시켜줘야한다.
sessionAttribute의 속성명으로 커맨드객체를 넘겨주고 컨트롤러에서 동일 객체를 사용할수있도록 하기위해 ModelAttribute가 붙은 커맨드객체 메서드를 생성해준다.
세션 지정을 하지않은경우에는 request 범위이기 때문에 해당 ModelAttribute를 GetMapping 매개변수에 넣어주는 동작과 같다.

SessionStatus
세션값 조회


메소드 매개변수로 사용하여 세션의 값을 받아와서 form2에 저장함
🌟수정사항🌟
세션 비우기는
HttpSession

q3과 q4만 가지고 있지만 q1, q2은 세션에 값이 유지되고있음

세션에 값은 커맨드 객체에 넣어서 유지한다.
같은 커맨드 객체이면 값이 유지가 되기 때문에 step3에서 q1,2,3,4 모든 값을 얻을 수 있다.
# SurveyController 클래스
@Slf4j
@Controller
@RequestMapping("/survey")
@SessionAttributes("requestSurvey")
public class SurveyController {
//여러 페이지로 구현된 양식
@ModelAttribute
public RequestSurvey requestSurvey(){
return new RequestSurvey();
}
@GetMapping("/step1")
public String step1(){
return "survey/step1";
}
@PostMapping("/step2")
public String step2(RequestSurvey form, @SessionAttribute("requestSurvey") RequestSurvey form2){
log.info("form : " + form.toString());
log.info("form2 : " + form2.toString());
return "survey/step2";
}
@PostMapping("/step3")
public String step3(RequestSurvey form, @SessionAttribute("requestSurvey") RequestSurvey form2 , SessionStatus status, HttpServletRequest request){
//값을 가져오고 세션을 비운다음에 값 확인
log.info("form : " + form.toString());
log.info("form2 : " + form2.toString());
status.setComplete();
System.out.println("세션 비우기 후: "+ request.getSession().getAttribute("requestSurvey")); //null값 나옴
return "survey/step3";
}
}




🌟boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
🔸 회원만 접근 가능하도록 마이페이지를 통제해보자

반환값을 false로 하면 mypage경로의 내용을 볼 수 없다. 컨트롤러 메서드 실행되지않음

🔼 설정 클래스 새로 만들고 통합


🔹 로그인 상태 통제

➡ 로그인 아닌 상태에서 마이페이지 접근하려고 해도 로그인 페이지로 리다이렉트됨!
통제 기능보다 공통 처리 기능으로 많이 쓰임...^^
예시.. 
로그인 통제기능은 이미 만들어져 있는걸로 쓰게 될 것이당~



addInterceptors(InterceptorRegistry registry)
@CookieValue: 개별 쿠키값 조회
이메일 기억하기 옵션

@CookieValue 애노테이션은 요청 매핑 애노테이션 적용 메서드의 쿠키 타입 파라미터에 적용
쿠키 이름 -> savedEmail
기본값 required = true
지정한 이름의 쿠키가 존재하지 않으면(이메일 기억하기를 선택하지 않았을 경우) 익셉션 발생
required = false로 해주면 쿠키값이 null이여도 상관없다.
