✅ 프론트 컨트롤러 패턴
공통 처리
가능DispatcherServlet
✅ DispatcherServlet
DispatcherServlet
이다Controller
Component
어노테이션이 있어서 컴포넌트 스캔의 대상이 됨@RequestMapping
RequestMappingHandlerMapping
, RequestMappingHandlerAdapter
ModelAndView
RequestMappingHandlerMapping
RequestMapping
또는 @Controller
가 클래스 레벨이 붙어 있는 경우에 매핑 정보로 인식@Controller
public class SpringMemberSaveControllerV1 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/member/save") // 매칭 url 적기
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 -> 데이터를 전송시킬 수 있는 리턴 타입
ModelAndView mv = new ModelAndView("save-result"); // 매칭 jsp 뷰 파일 이름 적기
mv.addObject("member",member); // 데이터값 저장 (키, 값) 형태
return mv;
}
}
✅ 컨트롤러 통합 및 조합
@RequestMapping
을 통해 먼저 통일하기@Controller
@RequestMapping("/springmvc/v2/members") // 이 주소 매핑 + 밑에 있는 메소드 매핑 주소를 합침
public class SpringMemberControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form") // -> ex) /springmvc/v2/members/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;
}
}
✅ 스프링 MVC - 실용적인 방식 (실무에서 쓰이는 방식)
@RequestParam
@RequestParam("username")
= @request.getParameter("username")
RequestMapping
@GetMapping
, PostMapping
RequestMapping
보다 더 편하게 사용할 수 있는 방법@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping(value = "/new-form", method = RequestMethod.GET) // get 방식으로만 받음 (post는 허용 x)
// @GetMapping("/new-form") // 위 방식과 동일함 (더 간단해짐)
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";
}