@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
@RequestMapping 은 요청 정보를 매핑한다.
해당 URL이 호출되면 이 메서드가 호출되며 애노테이션을 기반으로 동작하기 때문에 메서드의 이름은 임의로 지으면 된다.
ModelAndView 앞서 봤던 것으로 모델과 뷰 정보를 담아서 반환한다.
@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(HttpServletRequest request, HttpServletResponse response) {
List<Member> members = memberRepository.findAll();
ModelAndView mv = new ModelAndView("members");
mv.addObject("members", members);
return mv;
}
}
매우 아름답지 않은가? 앞서 우리는 SOLID 원칙을 지키며 개발을 하고자 굉장히 다양한 인터페이스를 구축했고
이를 구현하여 굉장히 다양한 클래스를 만들었다.
하지만 스프링을 쓰면 프레임웤이 모든걸 알아서 다 해준다. 그래서 우리가 작성할 코드가 위 하나의 자바 클래스로 줄었다.
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping(value = "/new-form", method = RequestMethod.GET)
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";
}
}
앞서 언급했듯 스프링 OCP을 정확하게 구현하려면 정말 잘 짜여진 인터스페이스들이 있어야한다고 했다. 그리고 @RequestMappging이 아주 휼룽하게 짜여진 인터페이스이다. ModelandView를 반환할 수 있지만 그걸 일일이 적는게 귀찮으니 String을 반환하더라도 반환타입을 감지해 알아서 MV로 바꿔주는 것이다.
또한 @RequestParam이라는 어노테이션으로 Map 객체를 생성하여 iter를 돌며 일일이 값을 넣어주지 않아도, 알아서 값을 잘 갖고온다.
그리고 method 속성을 받아서 사이드이펙트가 없도록 더 단단하게 로직을 작성할 수 있다.