스프링

스프링 MVC의 사용

winwin-k9 2022. 12. 26. 19:04

@RequestMapping 스프링은 애노테이션을 활용한 매우 유연하고, 실용적인 컨트롤러를 만들었는데 이것이 바로 @RequestMapping 애노테이션을 사용하는 컨트롤러이다.

 

  • @RequestMapping
    • RequestMappingHandlerMapping
    • RequestMappingHandlerAdapter
    • 가장 우선순위가 높은 핸들러 매핑과 핸들러 어댑터는 RequestMappingHandlerMapping , RequestMappingHandlerAdapter 이다.
    • @RequestMapping 의 앞글자를 따서 만든 이름인데, 이것이 바로 지금 스프링에서 주로 사용하는 애노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑과 어댑터이다.
      즉, @RequestMapping이 있으면, RequestMappingHandlerMapping과 RequestMappingHandlerAdapter이 사용되는 것이다.

 

@RequestMapping("/springmvc/v1/members/save")
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
  String username = request.getParameter("username");
  int age = Integer.parseInt(request.getParameter("age"));
  Member member = new Member(username, age);
  System.out.println("member = " + member);
  memberRepository.save(member);
  ModelAndView mv = new ModelAndView("save-result");
  mv.addObject("member", member);
  return mv;
}

@Controller

  • 스프링이 자동으로 스프링 빈으로 등록한다.
    • (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨, 그런데 controller안에 Component가 있다.)
  • 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.
    • RequestMappingHandlerMapping에서 핸들러 정보로 꺼낼수 있는 대상이 되는것이다.

@RequestMapping 

요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지으면 된다.

 

ModelAndView 

모델과 뷰 정보를 담아서 반환하면 된다.

 

 

mv.addObject("member", member)

스프링이 제공하는 ModelAndView 를 통해 Model 데이터를 추가할 때는 addObject() 를 사용하면 된다. 이 데이터는 이후 뷰를 렌더링 할 때 사용된다.

 

정리 하자면 @Controller가 되어 있으면 RequestMappingHandlerMapping이 자신이 처리할 수 있기 때문에 핸들러를 꺼내주고, 해당 어댑터를 호출하여 실행을 하는 것이다.

 

개선

ModelAndView를 계속 생성을 해야 하는 번거로움이 있다.

따라서 ModelAndView를 return하지 말고, String자체만을 return시키도록 한다.

 

@RequestMapping("/springmvc/v1/members/save") 
public String save(
     @RequestParam("username") String username,
     @RequestParam("age") int age,
     Model model) {
     Member member = new Member(username, age);
     memberRepository.save(member);
     model.addAttribute("member", member);
     return "save-result";
 }

문자를 반환해도 이를 view이름으로 인지하고 실행이 된다.

또한 파라미터를 직접 받을 수 있다.

728x90