목차
String
뷰 페이지 이름으로서, ViewResolver에 의해 해석됩니다. 프로젝트를 생성하면 기본적으로 servlet-context.xml에 다음과 같이 ViewResolver가 등록됩니다. prefix로 폴더 경로를 지정하고 suffix로 .jps를 붙여 뷰 페이지 지정을 편리하게 합니다.
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
따라서 다음의 코드는 /WEB-INF/views/main.jsp 뷰 페이지를 요청하게 됩니다.
@RequestMapping("/")
public String main() {
return "main";
}
Redirecting
redirect: 라는 특별한 prefix를 붙이면 UrlBasedViewResolver가 이를 redirect가 필요하다는 지시로 인식하여 해당 주소로 재요청이 가게 됩니다. 여기에 지정하는 String은 재요청이 갈 URL주소입니다. 상대주소와 절대주소 모두 지정 가능합니다.
@RequestMapping("/test")
public String test() {
return "view";
}
@RequestMapping("/redirect1")
public String redirect1(RedirectAttributes rttr) {
rttr.addFlashAttribute("msg", "hello");
return "redirect:/test";
}
@RequestMapping("/redirect2")
public String redirect2() {
return "redirect:https://www.daum.net/";
}
<h1>view.jsp</h1>
msg : ${ msg }
Forwarding
마찬가지로 forward: prefix를 붙이면 UrlBasedViewResolver가 해석하여 해당 주소로 forward를 시켜줍니다. UrlBasedViewResolver는 InternalResourceView를 생성하는데, 이는 RequestDispatcher.forward()를 수행합니다.
@RequestMapping("/forward")
public String forward(Model model) {
model.addAttribute("msg", "hello");
return "forward:/test";
}
<h1>view.jsp</h1>
msg : ${ msg }
void
메소드의 리턴 타입이 void이면, 메소드가 ServletResponse, OutputStream 인자, @ResponseStatus 등을 가지며 응답을 완전히 처리한 것으로 간주됩니다. 이런 경우에 해당하지 않으면 REST 컨트롤러의 경우 "응답 본문 없음"을 나타내거나, HTML 컨트롤러의 경우 RequestToViewNameTranslator에 의해 디폴트 뷰 이름을 선택하는 것을 나타냅니다. 아래는 호출한 URL과 동일한 이름의 뷰 페이지로 해석됩니다.
@RequestMapping("/hello")
public void hello(Model model) {
model.addAttribute("msg", "hello");
}
<h1>hello.jsp</h1>
msg : ${ msg } <br>
param : ${ param.msg2 } <br>
Model
객체를 리턴 타입으로 지정하는 것도 가능합니다. Model에 추가할 오브젝트가 하나뿐이라면 Model 파라미터를 받아서 저장하는 대신 원하는 타입의 객체를 바로 리턴해도 Model 객체에 자동으로 추가해서 전달해 줍니다. 뷰 이름은 RequestToViewNameTranslator에 의해 디폴트 뷰 이름으로 지정됩니다.
public class Person {
private String name;
private int age;
//Constructors, Getters and Setters
}
@RequestMapping("/member")
public Person member() {
return new Person("amy", 10);
}
<h1>member.jsp</h1>
person : ${ person } <br>
name : ${ person.name } <br>
age : ${ person.age } <br>
@RequestMapping 메소드 레벨에 @ModelAttribute 어노테이션을 사용해 해당 메소드가 리턴하는 값이 Model 객체에 추가됨을 명시적으로 나타낼 수 있으며, Model 속성의 이름을 별도로 설정할 수 있습니다.
@RequestMapping("/member2")
@ModelAttribute("xxx")
public Person member2() {
return new Person("amy", 10);
}
<h1>member2.jsp</h1>
person : ${ xxx } <br>
name : ${ xxx.name } <br>
age : ${ xxx.age } <br>
ModelAndView
Model과 함께 View에 대한 정보도 지정하여 리턴합니다. ModelAndView.addObject를 이용하여 데이터를 담고, ModelAndView.setViewName을 이용하여 뷰 페이지 이름을 지정합니다.
@RequestMapping("/mav")
public ModelAndView mav() {
ModelAndView mav = new ModelAndView();
mav.addObject("p", new Person("amy", 10));
mav.setViewName("member3");
return mav;
}
<h1>member3.jsp</h1>
person : ${ p } <br>
name : ${ p.name } <br>
age : ${ p.age } <br>
@ResponseBody
@ResponseBody 어노테이션을 메소드 레벨에 부여하면, 메소드가 리턴하는 값이 HttpMessageConverter에 의해 응답의 메시지 본문으로 전환됩니다. @ResponseBody 어노테이션을 클래스 레벨에도 부여할 수 있는데, 이는 @RestController 어노테이션과 동일한 효과를 가지며 해당 컨트롤러 내의 모든 메소드에 효과가 상속되도록 합니다.
@RequestMapping("/info")
@ResponseBody
public String info(String msg) {
return "msg : "+msg;
}
참고
- 코드로 배우는 스프링 웹 프로젝트 (구멍가게 코딩단 지음, 남가람북스)
- https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-return-types
- https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-redirecting-redirect-prefix
- https://title-developer.tistory.com/132?category=428275
'Spring' 카테고리의 다른 글
[Spring] @RequestBody, @ResponseBody로 JSON 전송하기 (0) | 2022.09.09 |
---|---|
[Spring] RedirectAttributes - 리다이렉트 데이터 전달하기 (0) | 2022.09.05 |
[Spring] Model, ModelAndView, @ModelAttribute - 컨트롤러에서 뷰로 데이터 전송하기 (0) | 2022.09.03 |
[Spring] @RequestParam - 요청 파라미터 데이터 파싱하기 (0) | 2022.09.02 |
[Spring] @RequestMapping - 요청 주소 매핑하기 (0) | 2022.09.01 |
댓글