스프링 MVC 시작하기
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
@Controller :
- 스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨)
- 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.
@RequestMapping : 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지으면 된다.
ModelAndView : 모델과 뷰 정보를 담아서 반환하면 된다.
** 앞서 배웠듯 우선순위가 가장 높은 핸들러 매핑과 핸들러 어댑터는
RequestMappingHandlerMapping, RequestMappingHandlerAdapter이다.
이때 RequestMappingHandlerMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller가 클래스 레벨에 붙어있는 경우에만 매핑 정보로 인식함
<다른 예시>
@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;
}
}
mv.addObject("member", member) : 스프링이 제공하는 ModelAndView를 통해 Model 데이터를 추가할 때는 addObject()를 사용하면 된다. 이 데이터는 이후 뷰를 렌더링 할 때 사용됨
한편, @RequestMapping은 메서드 단위로 적용된다. 따라서 컨트롤러 클래스를 유연하게 하나로 통합할 수 있다.
+ 아래와 같이 클래스레벨에 @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/new-form")
@RequestMapping("/springmvc/v2/members/save")
@RequestMapping("/springmvc/v2/members")
실용적인 방식
스프링 MVC는 개발자에게 수많은 편의 기능을 제공한다.
위의 버전2와 비교해보자.
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@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";
}
@GetMapping
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members", members);
return "members";
}
}
- Model 파라미터 : 파라미터로 Model을 받을 수 있다.
- ViewName 이름을 직접 반환할 수 있다. 반환 형식을 String으로 바꿔주기만 하면 됨.
(ModelAndView를 새롭게 만들 필요가 없어짐)
- @RequestParam 사용 : GET 쿼리 파라미터, POST FORM 방식의 HTTP 요청 파라미터를 받을 수 있음
- @GetMapping, @PostMapping : HTTP 메서드도 구분이 가능해짐
(같은 주소로 매핑하더라도 메서드마다 다르게 동작하도록 할 수 있음)
---------------
참고: 인프런 김영한님 강의(스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술)
댓글