스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작해서, 매우 유연하고 실용적이다. 과거에는 자바 언어에 애노테이션이 없기도 했고, 스프링도 처음부터 이런 유연한 컨트롤러를 제공한 것은 아니다.
@RequestMapping
스프링은 애노테이션을 활용한 매우 유연하고, 실용적인 컨트롤러를 만들었는데 이것이 바로 @RequestMapping 애노테이션을 사용하는 컨트롤러이다. 다들 한번쯤 사용해보았을 것이다. 여담이지만 과거에는 스프링 프레임워크가 MVC 부분이 약해서 스프링을 사용하더라도 MVC 웹 기술은 스트럿츠 같은 다른 프레임워크를 사용했었다. 그런데 @RequestMapping 기반의 애노테이션 컨트롤러가 등장하면서, MVC 부분도 스프링의 완승으로 끝이 났다.
SPRING MVC의 @RequestMapping을 사용할 때 역시 이전에 구조와 마찬가지로 HandlerMapping과 HandlerAdapter가 필요한데 @RequestMapping방식은 아래에 나와있는 핸들러와 어댑터가 사용이 된다.
- RequestMappingHandlerMapping
- RequestMappingHandlerAdapter
@RequestMapping 의 앞글자를 따서 만든 이름인데, 이것이 바로 지금 스프링에서 주로 사용하는 애노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑과 어댑터이다. 실무에서는 99.9% 이 방식의 컨트롤러를 사용한다.
애노테이션 기반의 컨트롤러를 만들어보자.
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("spirngmvc/v1/members/new-form")
public ModelAndView process(){
System.out.println("SpringMemberFormControllerV1.process");
return new ModelAndView("new-form");
}
}
구조가 매우 간단하다. 클래스 상단에 @Controller를 지정해주고 @RequestMapping이라는 애노테이션을 사용해서 ModelAndView 타입으로 만든 뒤 뷰 리졸버에서 인식할 수 있게 new ModelAndView("new-form")을 리턴한 모습이다.
해당 url로 접속을 하게 되면 우리가 원했던 new-form이라는 뷰가 확인이 된다.
구조를 하나씩 설명해보자면
- @Controller : 스프링이 자동으로 스프링 빈으로 등록한다. 이전까진 @Component를 사용해서 스프링 빈으로 등록을 해왔지만 @Controller 애노테이션이 @Component를 포함하고 있어서 자동으로 스프링 빈으로 인식을 해준다. 그리고 해당 애노테이션을 사용하면 SPRING MVC에서 자동으로 애노테이션 기반으로 인식을 한다.
- @RequestMapping : 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지으면 된다.
- ModelAndView : 모델과 뷰 정보를 담아서 반환하면 된다.
RequestMappingHandlerMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller 가 Class 레벨에 붙어 있는 경우에 매핑 정보로 인식한다.
@Component
@RequestMapping
public class SpringMemberFormControllerV1 {
@RequestMapping("spirngmvc/v1/members/new-form")
public ModelAndView process(){
System.out.println("SpringMemberFormControllerV1.process");
return new ModelAndView("new-form");
}
}
이렇게도 사용이 가능하다. 또는 @Component를 사용하지 않고 ServletApplication.java 안에 직접 스프링 빈으로 등록해서 사용해도 잘 작동한다.
하지만 @Controller를 넣어주는 것 만으로 이 모든걸 대신 해주니까 가장 간편한 방식이다.
이제 이 방식으로 이전에 했던 예시를 만들어보자.
- Form 이동
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("springmvc/v1/members/new-form")
public ModelAndView process(){
System.out.println("SpringMemberFormControllerV1.process");
return new ModelAndView("new-form");
}
}
단순히 new-form화면으로 이동하기 위한 컨트롤러
- Save-Result
@Controller
public class SpringMemberSaveControllerV1 {
MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/members/save")
public ModelAndView memberSave(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;
}
}
이전에 방식과 차이점이 있다면 동작 기반이 바뀌고 Map<Stirng,String>paramMap이 아닌 request와 response를 받아서 form에서 전달 받은 값들을 request로 받아와 변수에 저장하고 사용했다는 점이다. 다시 객체를 담아갈 때 역시 ModelAndView에 addObject를 이용해 값을 담아간다.
- MemberList
@Controller
public class SpringMemberListControllerV1 {
MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/members")
public ModelAndView ListMember(){
List<Member> members = memberRepository.findAll();
ModelAndView mv = new ModelAndView("members");
mv.addObject("members",members);
return mv;
}
}
'spring' 카테고리의 다른 글
SPRING MVC 실용적인 방식 (0) | 2023.03.22 |
---|---|
SPRING MVC 통합 컨트롤러 (0) | 2023.03.21 |
뷰 리졸버 (0) | 2023.03.21 |
HandlerMapping, HandlerAdapter (0) | 2023.03.20 |
SPRING MVC 구조 (0) | 2023.03.20 |