특정한 요청이나 데이터를 변환하는 역할을 하는 객체
ViewResolver(뷰리졸버): 인터페이스를 구현한 ThymeleafViewResolver가 현재 처리하게 된다.(예제 기준)
접두사(prefix): resources/teamplates/
접미사(suffix): .html
핸들러 메소드가 반환하는 문자열은 viewResolver로 향하게 되고 'redirect:'가 들어간 문자열의 경우에는 접두사와 접미사가 추가되지 않음
컨트롤러에서 반환한 뷰 이름을 실제 HTML파일로 매핑하는 역할
어떤 컨트롤러가 특정 요청을 처리할지 결정
: 모든 URL 패턴을 처리하는 컨트롤러 매핑
기본적으로, @RequestMapping은 특정 URL과 컨트롤러 메서드를 매핑하는 역할을 한다.
컨트롤러와 연결되도록 컨트롤러의 요청을 정의해주는 역할이다!
Spring Boot에서 ResolverController는
여러 가지 방법으로 뷰를 반환하거나 리다이렉트하는 방식을 보여주는 컨트롤러이다.
애플리케이션의 메인 페이지를 처리하는 전용 컨트롤러로 따로 분리하기 위해
MainController클래스를 만든다!
@Controller
@RequestMapping("/*") //1단계 하위 경로(/*)에 대한 요청을 처리.
public class MainController {
@RequestMapping(value={"/","/main"})
public String main() {
return "main";
}
}
루트 경로(/)와 /main 요청을 모두 처리함
"main"을 반환 → View Resolver가 main.html을 찾아서 렌더링.
controller가 알아서 변환해주는 것이 아니다!!!
실제로 변환해주는 것은 View Resolver!

controller는 뷰 이름(string)만 반환하고, ViewResolver가 이를 받아서 해당 뷰 파일을 찾아서 렌더링한다!
@GetMapping("string")
public String stringReturning(Model model) {
model.addAttribute("forwardMessage", "문자열로 뷰 이름 반환함...");
return "result";
}
return "뷰이름"은 기본적으로 forward 동작
(Model 객체에 데이터를 담아 result.html로 포워딩함.)
Model에 담긴 값이 해당 뷰까지 전달됨.
@GetMapping("string-redirect")
public String stringRedirect(Model model) {
model.addAttribute("message1", "문자열로 뷰 이름 반환하며 리다이렉트");
return "redirect:/";
}
리다이렉트하면 Model 데이터가 사라짐.
→ message1은 새 요청에서는 사용 불가능! > 따라서, 아래 RedirectAttributes 사용
redirect:/ 는 /경로(루트경로)로 리다이렉트된다는 의미이다.
redirect:는 그저 새로운 요청을 보내는 의미일뿐.
@GetMapping("string-redirect-attr")
public String stringRedirectFlashAttribute(RedirectAttributes rttr) {
rttr.addFlashAttribute("flashMessage1", "리다이렉트 attr 사용하여 리다이렉트");
return "redirect:/";
}
리다이렉트 후에도 데이터가 유지됨 (일회성).
기존 session과 key 값이 충돌하면 안 됨.
@GetMapping("modelandview")
public ModelAndView modelAndViewTest(ModelAndView mv) {
mv.addObject("forwardMessage", "ModelAndView를 이용한 forward");
mv.setViewName("result");
return mv;
}
(1번과 동일한 방식)
ModelAndView를 사용해 뷰 이름과 데이터를 함께 반환.
Forward 방식으로 result.html에 데이터 전달됨.
@GetMapping("modelandview-redirect")
public ModelAndView modelAndViewRedirect(ModelAndView mv) {
mv.addObject("message2", "ModelAndView를 이용한 redirect");
mv.setViewName("redirect:/");
return mv;
}
(2번과 동일한 방식)
"redirect:/"로 인해 새로운 요청이 발생,
mv.addObject()로 추가한 데이터는 전달되지 않음 > 해결방법: RedirectAttributes사용
@GetMapping("modelandview-redirect-attr")
public ModelAndView modelAndViewRedirectFlashAttribute(ModelAndView mv,
RedirectAttributes rttr) {
rttr.addFlashAttribute("flashMessage2", "ModelAndView를 이용한 redirect attr");
mv.setViewName("redirect:/");
return mv;
}
(3번과 동일한 방식)
RedirectAttributes를 사용해 데이터를 한 번만 전달.
flashMessage2가 redirect:/ 이후에도 전달됨.
배경지식)
Forward는 기존 유청이 유지되며 페이지 전환이 없지만, Redirect는 새로운 요청이 발생하며 기존데이터는 사라지고 url이 변경된다.