스프링 부트를 쓰면 자동으로 핸들러 매핑과 어댑터 여러가지를 등록하고 순차적으로 찾음
HandlerMapping
핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야 함
HandlerAdapter
핸들러 매핑을 통해서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요
- 가장 우선순위가 높은 핸들러 매핑과 핸들러 어댑터는
RequestMappingHandlerMapping
,RequestMappingHandlerAdapter
- 지금 스프링에서 주로 사용하는 애노테이션 기반의 컨트롤러를 지원하는 매핑과 어댑터
스프링 부트가 자동 등록하는 뷰 리졸버
스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작해서, 매우 유연하고 실용적
RequestMappingHandlerMapping
, RequestMappingHandlerAdapter
사용@Controller
//@Component
//@RequestMapping
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process(){
return new ModelAndView("new-form");
}
}
RequestMappingHandlerMapping
은 스프링 빈 중에서 @RequestMapping
또는 @Controller
가 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식, 핸들러로 꺼낼 수 있는 대상이 됨@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 mv=new ModelAndView("save-result");
mv.addObject("member",member);
return mv;
}
@RequestMapping
public ModelAndView members() {
List<Member> members=memberRepository.findAll();
ModelAndView mv = new ModelAndView("members");
mv.addObject("members",members);
return mv;
}
}
@RequestMapping("/springmvc/v2/members")
@RequestMapping("/new-form")
> /springmvc/v2/members/new-form
@RequestMapping("/save")
> /springmvc/v2/members/save
@RequestMapping
> /springmvc/v2/members
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository=MemberRepository.getInstance();
//@RequestMapping(value = "/new-form", method = RequestMethod.GET)
@GetMapping("/new-form")
//GET인 경우에만 호출되도록 > 제약을 거는것이 더 좋은 설계
public String newForm(){
return "new-form";
}
//@RequestMapping(value ="/save" , method = RequestMethod.POST)
@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(method = RequestMethod.GET)
@GetMapping
public String members(Model model) {
List<Member> members=memberRepository.findAll();
model.addAttribute("members",members);
return "members";
}
}
request.getParameter("username")
> @RequestParam("username")
@RequestMapping
> @GetMapping
, @PostMapping
@RequestMapping(value = "/new-form", method = RequestMethod.GET)
@GetMapping("/new-form")