스프링은 애노테이션 기반의 컨트롤러를 만드는데 @RequestMapping 애노테이션을 사용한다.
@RequestMapping 애노테이션이 있으면 RequestMappingHandlerMapping, RequestMappingHandlerAdapter가 사용되어 핸들러(컨트롤러)가 호출된다.
Spring MVC에서의 컨트롤러 코드는 아래와 같다.
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
ModelAndView는 말그대로 Model(Map객체)와 논리적인 View를 갖고 있는 객체다.
나중에 ModelAndView는 뷰리졸버를 통해서 실제 물리적 뷰 경로를 갖고 있는 View객체가 반환되고, View 객체의 render 함수를 통해서 thymeleaf나 jsp로 제어권을 넘긴다.
@Controller : 이 애노테이션이 있으면 스프링이 자동으로 스프링빈으로 등록한다. 내부에 @Component 애노테이션이 있어 컴포넌트 스캔의 대상이 된다. 그리고 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.
이게 무슨뜻이냐면, @Controller가 있으면 RequestMappingHandlerMapping(핸들러를 조회하는 객체)이가
스프링빈중에서 @RequestMapping 또는 @Controller가 클래스 레벨에 붙어있는 경우에 맵핑정보로 인식한다.
그래서 사실 @Controller는 @Component + @RequestMapping(클래스레벨에 있어야함)의 조합으로도 대체가 가능하다. 물론 @RequestMapping만 넣어놓고 스프링빈을 수동등록해도된다.
RequestMapping : 요청 정보를 맵핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션기반으로 동작하기 때문에 메서드 이름은 임의로 지어도 된다.
ModelAndView : 모델과 뷰정보를 담아서 변환한다.
스프링부트 3.0부터는 @RequestMapping이 클래스레벨에 있어도 스프링이 컨트롤러로 인식하지 않는다고 한다.오직 @Controller만 인식한다!
그리고 Controller에도 HttpServletRequest와 HttpServletResponse를 파라미터로 받아서 사용할 수 있다.
RequestMapping은 클래스레벨과 메서드 레벨에 함께 사용함으로써 컨트롤러를 통합할 수 있다.
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
@RequestMapping("/new-form")
public ModelAndView newForm()
@RequestMapping("/save")
public ModelAndView save
위 코드를 보면 클래스 레벨에 붙어있는 값으로 메서드레벨의 중복값을 공통처리할 수 있다.
ModelAndView를 반환하는게 아니라 좀 더 실용적인 방법으로 제공할 수 있도록 스프링에서 제공한다고 한다.
즉, ModelAndView를 반환해도 되고, 문자열로 뷰이름을 반환해도 된다.
또한, HttpServletRequest와 Response도 받을 수 고 있고, @RequestParam 애노테이션을 통해서 HttpRequest로 전달된 파라미터들을 직접 받을 수있다. 그리고
Model 파라미터를 통해서 직접 Model에 대한 데이터를 처리할 수 있다.
@RequestParam("username") 은 request.getParameter("username")와 같은 코드라고 볼 수 있다.
물론 @RequestParam은 Get 쿼리 파라미터와 Post Form 방식을 모두 지원한다.
@GetMapping("/new-form")
public String newForm() {
return "new-form";
}
@PostMapping("/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";
}
그리고 @RequestMapping은 URL만 매칭하는게 아니라 HttpMethod도 구분할 수 있다.
위 코드들은 구분을 하고 있지 않다. 즉 Get으로 오든 Post로 오든 모두 받을 수 있다.
하지만, Get만 받기 위해서 제약을 걸 수 있다.
@RequestMapping(value = "/new-form", method = RequestMethod.GET)
하지만 이 코드를
@GetMapping("/new-form")
@PostMapping("/new-form")
으로 변경도 가능
해당 포스팅은 아래의 강의를 학습 한 후 정리한 내용입니다.
김영한님의 스프링MVC