@RequestMapping을 사용하면 RequestMappingHandlerMapping, RequestMappingHandlerAdapter를 사용한다는 의미이다.
# @Controller
- 스프링이 자동으로 스프링 빈으로 등록한다. @Controller은 @Component를 상속 받기 때문에 마찬가지로 컴포넌트 스캔의 대상이 된다.
- 스프링 MVC에서 어노테이션 기반 컨트롤러로 인식한다.
# @RequestMapping
- 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다.
- 어노테이션을 기반으로 동작하므로, 메서드 이름(process)는 임의로 지어도 된다.
# ModelAndView
- 모델과 뷰 정보를 담아서 반환하면 된다.
RequestMappingHandlerMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller가 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식한다. (중요)
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
다음 코드도 동일하게 동작한다.
@Component //컴포넌트 스캔을 통해 스프링 빈으로 등록 @RequestMapping
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
컴포넌트 스캔 없이 스프링 빈으로 직접 등록해도 동작한다.
@RequestMapping
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
ModelAndView를 반환할 때는 "save-result"라는 반환하고자 하는 View와 member라는 Model을 addObject로 담아야 한다.
@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;
}
}
@RequestMapping → 하나의 Class에 모으기 + 중복 URL 처리
@Controller 어노테이션을 붙인 하나의 객체에 여러 @RequestMapping들을 선언할 수 있다. 또한, 중복되는 URL의 경우 최상단 객체에 @RequestMapping을 함으로써 가독성을 높일 수 있다. 최상단 @RequestMapping 어노테이션의 URL에 더해지는 것이기 때문에 members 처럼 그대로 "springmvc/v2/members"의 경우 따로 URL을 추가하지 않아도 된다.
@Controller
@RequestMapping("springmvc/v2/members")
public class SpringMemerControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form")
public ModelAndView newForm() {
return new ModelAndView("new-form");
}
@RequestMapping
public ModelAndView members() {
List<Member> members = memberRepository.findAll();
ModelAndView mv = new ModelAndView("members");
mv.addObject("members", members);
return mv;
}
@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;
}
}
'🌱 Spring > MVC ①' 카테고리의 다른 글
[Spring] Logging (0) | 2023.07.22 |
---|---|
[Spring] MVC _ @RequestMapping (2) (0) | 2023.07.22 |
[Spring] MVC _ 어댑터 패턴 (0) | 2023.07.19 |
[Spring] MVC _ 개발자를 위한 기능 개선 (0) | 2023.07.17 |
[Spring] MVC _ ViewModel 추가 (0) | 2023.07.17 |