본문 바로가기
Spring

[Spring] 컨트롤러의 리턴 타입

by Amy IT 2022. 9. 4.

 

목차

     

    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 }

    /redirect1 주소 요청시

     

    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 }

    /forward 주소 요청시

     

     

    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>

    /hello?msg2=world 주소 요청시

     

     

    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;
    }

    /info?msg=hello 주소 요청시

     

     

    참고

     

    댓글