쌓고 쌓다
Spring MVC 사용 방식 본문
핸들러와 핸들러 어댑터에서 우선순위가 가장 높은 것은
RequestMappingHandlerMapping과 RequestMappingHandlerAdapter이다.
이 핸들러와 핸들러 어댑터는 어노테이션 기반의 컨트롤러를 지원한다.
@RequestMapping 기반으로 컨트롤러를 구성해보자.
V1 (Save)
@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;
}
}
HttpServletRequest
폼 데이터로 넘어온 정보를 getParameter를 통해 꺼낼 수 있다.
@Controller
내부에 @Component 어노테이션이 존재하므로 컴포넌트 스캔으로 스프링 빈으로 등록된다.
스프링 MVC에서 어노테이션 기반 컨트롤러로 인식된다.
@RequestMapping
요청 정보를 매핑하여 이 URL로 메서드가 호출된다.
MovelAndView
생성자로 뷰 이름을 줄 수 있으며 모델에 정보를 담을 수 있다.
addObject(이름, 데이터)로 모델에 맵 형식으로 데이터를 넣을 수 있다.
V1 (Form 페이지)
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
꼭 @RequestMapping에서 꼭 파라미터가 존재해야하는것은 아니다.
V2 (클래스 레벨 @RequestMapping)
@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 members(HttpServletRequest request, HttpServletResponse response) {
...
}
}
@RequestMapping은 메서드 단위로 적용되므로 하나의 컨트롤러에 여러 요청 정보를 매핑할 수 있다.
클래스 레벨에 @RequestMapping을 사용하여
메서드 레벨의 @RequestMapping과 조합할 수 있다.
"/springmvc/v2/members" + "/new-form" => "/springmvc/v2/members/new-form"
V3 (주로 사용하는 방식)
모델뷰를 직접 생성하지 않고 Model 파라미터로 받아 사용하면서 뷰의 논리 이름을 반환하여 사용할 수 있다.
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
//@GetMapping("/new-form")
@RequestMapping(value = "/new-form", method = RequestMethod.GET)
public String newForm() {
return "new-form";
}
//@PostMappnig("/save")
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String members(
@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
@RequestMapping(method = RequestMethod.GET)
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members", members);
return "members";
}
}
@RequestParam
@RequestParam은 요청 파라미터를 받아 처리하는 어노테이션인데
GET 쿼리 파라미터, POST Form 둘다 요청 파라미터이라 두 방식 다 지원하기에 폼 데이터를 이 어노테이션으로 받을 수 있다.
method 속성으로 요청 방식을 지정할 수 있다.
@GetMapping, @PostMapping
@RequestMapping(value = "/new-form", method = RequestMethod.GET)을 아래와 같이 작성할 수 있다.
@GetMapping("/new-form")
물론 @PostMapping도 가능하다.
사실 @GetMapping에 @RequestMapping(method = RequestMethod.GET)이 포함되어있다.
Model 파라미터
@RequestMapping(method = RequestMethod.GET)
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members", members); // 모델 파라미터 사용
...
}
Model 파라미터를 사용할 수 있다. 모델뷰를 직접 생성하지 않아도 모델에 값을 넣을 수 있다.
viewName 직접 반환
@RequestMapping(method = RequestMethod.GET)
public String members(Model model) {
...
return "members";
}
뷰의 논리 이름을 반환할 수 있다.
'프로그래밍 > spring' 카테고리의 다른 글
@RequestParam + required / defaultValue / Map (0) | 2023.08.10 |
---|---|
[스프링 부트] 첨부파일(파일 업로드) 목록 수정 - 21 (0) | 2023.08.09 |
뷰 리졸버 동작 (0) | 2023.08.07 |
[스프링 부트] 게시글 삭제시 첨부파일 삭제 - 20 (0) | 2023.08.07 |
핸들러 매핑과 핸들러 어댑터 이해하기 (0) | 2023.08.06 |