@Component //컴포넌트 스캔을 통해 스프링 빈으로 등록
@RequestMapping
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
컴포넌트 스캔 없이 스프링 빈으로 직접 등록해도 동작 가능하지만 컴포넌트 스캔을 주로 이용한다
데이터 저장
ModelAndView를 통해 Model 데이터를 추가하자
@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);
System.out.println("member = " + member);
memberRepository.save(member);
ModelAndView mv = new ModelAndView("save-result");
mv.addObject("member", member);
return mv;
}
}
mv.addObject("member", member) : 스프링이 제공하는 ModelAndView를 통해 Model 데이터를 추가할 때는 addObject()를 사용하면 된다. 이 데이터는 이후 뷰 렌더링 할 때 사용된다.
컨트롤러 통합
위 두 코드를 보면 @RequestMapping이 클래스 단위가 아니라 메서드 단위에 적용 되었다. 따라서 컨트롤러 클래스를 하나로 통일 가능하다
@Controller
@RequestMapping("/springmvc/v2/members") //공통된 요청 url
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 mav = new ModelAndView("save-result");
mav.addObject("member", member);
return mav;
}
}
스프링 MVC 실용적인 방식
실무에서 주로 사용하는 방식 소개
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@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";
}
}
Model 파라미터
save() 를 보면 Model을 파라미터로 받는 것을 확인할 수 있다.
@Controller 와 @RestController
뷰의 논리 이름을 반환할 수 있다. @Controller는 반환 값이 String이면 뷰 이름으로 인식돼서 뷰를 찾고 뷰가 렌더링 된다.
@RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.
@RequestParam 사용
스프링은 HTTP 요청 파라미터를 @RequestParam으로 받을 수 있다.
@RequestParam("username") 은 request.getParameter("username")과 거의 같은 코드라고 생각하면 된다.
@RequestMapping 으로 HTTP Method 구분
@RequestMapping은 URL만 매칭하는게 아니라, HTTP Method도 함께 구분 가능
@RequestMapping(value = "/new-form", method = RequestMethod.GET)
@GetMapping, @PostMapping 등으로 더 편리하게 사용 가능
@GetMapping 에 @RequestMapping 포함
'Spring > Spring MVC' 카테고리의 다른 글
HTTP 요청 메시지 - 텍스트, JSON (1) | 2023.10.05 |
---|---|
HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form (0) | 2023.10.05 |
[스프링 MVC] 요청 매핑 (0) | 2023.10.05 |
컴포넌트 스캔 (0) | 2023.09.17 |
스프링 MVC 구조 (0) | 2023.09.04 |