

동작 순서는 다음과 같다.
💡 @RequestMapping
- RequestMappingHandlerMapping : 가장 우선순위가 높은 핸들러 매핑 (처리할 수 있는 핸들러 꺼내주고)
- RequestMappingHandlerAdapter : 가장 우선순위가 높은 핸들러 어댑터 (어댑터가 처리)
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
@Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨.)@Controller
public class SpringMemberSaveControllerV1 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@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);
memberRepository.save(member);
ModelAndView mv = new ModelAndView("save-result");
mv.addObject("member", member);
return mv;
}
}
ModelAndView 를 통해 Model 데이터를 추가할 때는 addObject() 를 사용한다. 이 데이터는 이후 뷰를 렌더링할 때 사용.@Controller
public class SpringMemberListControllerV1 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/members")
public ModelAndView process() {
List<Member> members = memberRepository.findAll();
ModelAndView mv = new ModelAndView("members");
mv.addObject("members", members);
return mv;
}
}
@RequestMapping 이 메서드 단위에 적용되었으므로 컨트롤러 클래스를 유연하게 하나로 통합해보자.
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form")
public ModelAndView newForm() {
return new ModelAndView("new-form");
}
@RequestMapping("/save")
public ModelAndView save(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
ModelAndView mav = new ModelAndView("save-result");
mav.addObject("member", member);
return mav;
}
@RequestMapping
public ModelAndView members() {
List<Member> members = memberRepository.findAll();
ModelAndView mav = new ModelAndView("members");
mav.addObject("members", members);
return mav;
}
}
@RequestMapping("/springmvc/v2/members") 을 추가해 메서드 레벨과의 조합을 한다.@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form")
public String newForm() {
return "new-form";
}
@RequestMapping("/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
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members", members);
return "members";
}
}
save(), members() 를 보면 Model을 파라미터로 받는 것을 확인할 수 있다 ! (스프링의 편의 기능)@RequestParam 으로 받을 수 있다.@RequestMapping 은 URL만 매칭하는 것이 아니라, HTTP Method 도 함께 구분할 수 있다 !