ViewResolver는 사용하는 View 기술에 따라 미리 정해진 설정을 이용하여실제 View 페이지와 연결된다. 다음은 application.properties에 설정된 기본 옵션이다. 아래 설정을 보면 왜 /templates/경로에 템플릿 파일을 저장해야 하는지 알 수 있다.
spring.thymeleaf.prefix=classpath:/templates/ # 기본 값이므로 설정할 필요는 없다.
spring.thymeleaf.suffix=.html
return 타입으로void를 사용할 수도 있는데 이 경우는request path 와 동일한 이름의 page를 사용하는 경우이다.
예를 들어 다음 코드는 결과적으로 index를 리턴하는 것과 동일한 효과가 있다.
@GetMapping("/index")
public void index(Model model) {
model.addAttribute("message", "index");
}
이 외에도 ModelAndView를 반환할 수 있는데 이 객체는 이름 그대로 Modle과 View를 함께 설정할 수 있는 객체이다.
리턴 값으로view name만 넘긴 경우내부적으로forward기법을 이용해서 page를 호출한다. forward는 request scope에 저장된 정보를 활용할 수 있는데Model 객체에 저장한 attribute가 이 영역에 저장된다.
이제까지 처리했던 기본 이동 방식으로 forward를 이용한 방식이므로 별도의 테스트는 생략한다.
redirect와 flash scope
만약redirect형식으로 다른 자원을 호출하려는 경우는 redirect:를 추가해준다. path가 /로 시작하는 경우 절대경로를 의미하는데 이때 최상위 경로는context path이다. HttpServletResponse를 통해서 redirect 할 때는 /가 container root여서 추가로 context root를 개입시켜야 했는데 이 부분이 좀 더 편리해졌다.
redirect로 이동한 페이지에서는 최초의 요청과는 다른 전혀 새로운 요청이 생성된다. 따라서 추가적인 정보를 전달하기 위해서는 Model에 정보를 저장하는 것은 의미가 없다. 그럼 어떤 방식으로 정보를 전달해야 할까?
redirect된 페이지에서 정보를 확인하기 위해서는 queryString을 이용하거나 session을 사용할 수 있다. 이것들을 편리하게 사용할 수 있게 도와주는 클래스로 RedirectAttributes가 제공된다. RedirectAttributes는 Model을 상속받았기 때문에 사용법은 Model과 유사하다.
queryString 형태로 url 뒤에 붙여주기: 가장 간단히 url 뒤에 redirect:/url?paramName=paramValue 형태로 추가해준다. RedirectAttributes의 attribute레 설정한 데이터는 URL에 queryString 형태로 전달된다.
session 활용: request scope 보다 큰 영역인 session scope에 데이터를 저장한다. 하지만 로그인 정보처럼 여러 요청에 거쳐서 사용되는 정보가 아니라 특정 요청에 대한 결과를 세션에 저장하는 것은 공간의 낭비를 유발하므로 바로 지워줘야 하는 번거로움이 존재한다. 이를 위해 Spring에서는 flash scope라는 것을 제안하는데 이는 1회성 세션으로 session 영역에 데이터를 저장했다가 한번 실행하면 삭제해준다. flash scope에 데이터를 저장하기 위해서는 addFlashAttribute를 이용한다.