[Spring] Controller, Model, ModelAndView

Controller

  • 사용자의 요청이 진입하는 지점(entry point)
  • 요청에 따라 어떤 처리를 할지 결정해준다. 실질적인 처리는 서비스에서 처리한다
  • 사용자에게 view를 응답으로 보내준다

왜 쓰는가

  • 대규모로 갈수록 처리해야할 서비스가 많아지는데, 이를 하나의 클래스에서 몰아서 처리하는게 아니라 A요청에 대한 것은 A controller에서 맡아 로직처리를 위한 서비스를 호출한다
  • spring은 기본적으로 MVC 패턴을 사용하는데 이 때 controller를 사용하며 역할에 따른 설계가 가능하여 유지보수에 유리하다

사용방법

  • spring 설정파일에 등록된 패키지 안에서 검색하기 때문에 컨트롤러를 스캔할 경로를 지정해주어야 한다
  • @Controller를 이용해 클래스 생성
  • @RequestMapping을 이용해 view의 요청 경로를 지정한다
  • view의 이름을 return한다. return하면 spring의 viewResolver를 통해 view와 ModelAndView를 DispathcerServlet에 전달한다
@Controller // 컨트롤러 지정 
@RequestMapping(value = "/home") // 컨트롤러와 메스드에 각각 mapping하면 깔끔하게 코드를 구현할 수 있다
public class HomeController { 

    @RequestMapping(value = "/list", method = RequestMethod.GET) // 뷰의 요청 경로 지정 
    public String home(Locale locale, Model model) { 
            // 로직 수행 
            ...

        // Model 객체를 paramater로 받아서 view로 Data를 전달할 수 있다
            // jsp 파일에서는 ${변수이름} 형태로 값을 사용할 수 있다
        model.addAttribute("변수이름", "변수에 넣을 데이터값"); 
            return "home"; // 뷰 파일 리턴 
    } 

    @RequestMapping("/content")
    public ModelAndView content() { // model과 거의 동일하다

        // 데이터와 뷰를 동시에 설정이 가능
        ModelAndView mv = new ModelAndView();
        mv.setViewName("/content"); // 뷰의 경로
            // model과 마찬가지로 jsp 파일에서는 ${변수이름} 형태로 값을 사용할 수 있다
        mv.addObject("변수이름", "데이터 값"); // 뷰로 보낼 데이터 값

        return mv;
    }
}

레퍼런스

https://wonos.tistory.com/380

https://po9357.github.io/spring/2019-05-11-Spring_Controller/

https://sudo-minz.tistory.com/25