Controller Interface
public interface Controller {
ModelAndView handleRequest(
HttpServletRequest req,
HttpServletResponse resp
) throws Exception;
}
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(
HttpServletRequest request,
HttpServletResponse response
) throws Exception {
System.out.println("OldController.handleRequest");
return null;
}
}
- 스프링 초기에 사용되던 컨트롤러 인터페이스이다.
@Component
애노테이션을 사용해 Spring Bean으로 등록한다.
- name 프로퍼티에 값을 입력하면, 그 값을 URL에 매핑한다.
Controller
를 상속받아 handleRequest
를 오버라이딩하여 구현하는 방식이다.
Controller Annotation
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
- 현재 가장 많이 사용되고 있는 방식이다.
- 클래스 앞에
@Controller
애노테이션을 작성하여 사용한다.
@Component
를 상속받아, Spring Bean으로 등록된다.
- Controller로 등록된 클래스 내의 메서드에서 문자열을 반환하면,
src/main/resource/static
경로에서 해당 문자열과 같은 이름의 파일을 찾아
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 req,
HttpServletResponse resp
) {
String username = req.getParameter("username");
int age = Integer.parseInt(req.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;
}
}
- Class 단위로
@RequestMapping
을 등록하면 맴버 메소드들은 그 URL을 접두사로 자동 등록한다.
/new-form
⇒ /springmvc/v2/members/new-form
- 메서드 단위로 동작하여 서로 관련된 URL을 묶어서 관리할 수 있다.
Get, Post, Put, Patch, Delete Mapping
@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";
}
}
@GetMapping
이나 @PostMapping
을 사용하여 HTTP Method를 설정할 수 있다.
@RequestMapping(method = RequestMethod.GET)
의 축약어라 생각하면 편하다.