컨트롤러 리턴 타입에 따른 반환 && Model 관련

라이라·2023년 6월 13일
0

리턴 타입이 void인 경우
:: 스프링 MVC는 현재 경로에 해당하는 JSP 파일을 실행한다.
:: 요청 url에서 제일 앞의 '/'와 확장자를 제외한 나머지 부분을 뷰 네임으로 지정한다.

	@Controller
    public Class SampleVoidController{
    	@RequestMapping("sampleA")
        public void sampleA (){...}
        @RequestMapping("sampleB")
        public void sampleB (){...}
        ...
        
        >> localhost:8080/sampleA

리턴 타입이 String인 경우
:: MVC는 "문자열+.jsp" 파일을 찾아서 실행하게 된다.

public Class SampleStringController{
	@RequestMapping("sampleC")
    public String SampleC (
    	@ModelAttribute("msg") String msg
    ){
    ...
    return "result"; 
    }}


/WEB-INF/views/result.jsp

...
<body>
	<span> Hello ${msg} </span>
</body>

>> /WEB-INF/views/result.jsp를 찾아 실행하는데 @ModelAttribute는 자동으로 해당 객체를 뷰까지 전달한다. (브라우저에서 실행할 때 msg 파라미터를 넘겨주면 화면에 출력된다.)

Model & ModelMap & ModelAndView 차이

결론적으로 말하자면 Model과 ModelMap은 같은 기능이다.

Model은 인터페이스이고 ModelMap은 구현체인데 스프링 내부에서 사용하는 개체의 타입이 동일하므로 취향껏 골라 쓰면 된다.

	@GetMapping("/test")
public String test(Model model) {
    model.addAttribute("data", data);
    return "/test/data";
}

<!DOCTYPE html>
<html>
    <head>
        <title>Document</title>
    </head>
    <body>
        <p>${data.name}</p>
        <p>${data.age}</p>
    </body>
</html>

ModelAndView는 Model과 View를 동시에 설정 가능한 객체이다.

	@GetMapping("/test")
public ModelAndView test() {
    ModelAndView mav = new ModelAndView("test/viewPage");
    modelAndView.addObject("data", "Baeldung");
    return mav;
}

컨트롤러는 주로 View만을 반환하지만 ModelAndView는 Model과 View를 모두 가지고 반환한다.
생성자로 뷰의 이름을 지정하거나 setViewName() 메서드를 사용하여 뷰 이름을 지정하고 addObject() 메서드를 통해 데이터를 저장한다.

redirect는 절대경로, 상대경로를 설정하는 법이 다르다.

redirect: /api/test  
:: 현재 서블릿 컨텍스트에 대한 상대적인 경로로 리다이렉트를 하게 됩니다.

redirect: http//:localhost:8080/api/test
:: 전체 경로를 적는 경우 절대 경로로 리다이렉트를 하게 된다.

Model 오브젝트와 동일하게 Map 형태로도 리턴이 가능한데,모델과의 차이점은 개별로 모델이 등록되기 때문에 뷰에서 key.value 형태로 데이터에 접근했던 Model과는 다르게 value만으로 데이터에 접근해야한다.

	@GetMapping("/test")
public Map<String, String> test() {
    return data;
}

<!DOCTYPE html>
<html>
    <head>
        <title>Document</title>
    </head>
    <body>
        <p>${name}</p>
        <p>${age}</p>
    </body>
</html>
profile
혼자 보려고 올리는 용도

0개의 댓글