Spring MVC에서 HTTP요청을 어떤 메서드, 클래스에 매핑할지 지정한다
클래스 레벨에서는 공통 URL 경로를 지정 (prefix)
메서드 레벨에서는 실제 요청 처리를 매핑
@Controller
@RequestMapping("/uesrs")
public class UserController {
@RequestMapping(name = "/list", method=requestMethod.GET)
public String listUsers() {
return "userList";
}
}
/users/list로 get요청이 오면 listUsers()를 실행하여 userList 뷰 템플릿으로 렌더링
@GetMapping(), @PostMapping(), @PutMapping(), @DeleteMapping(), @PatchMapping()으로 HTTP메서드를 축약
@ResponseBody
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVarible("userId")String data) {
log.info("mappingPath userId = {}, data);
return "ok";
}
@PathVariable을 사용하면 매칭되는 부분을 편리하게 조회할 수 있다
@PathVariable의 이름과 파라미터 이름이 같으면 생략할 수 있다(String data -> String userID)
request.getParameter(paramName)으로 조회할 수 있다
@RequestParam을 사용하면 더욱 편리하게 요청파라미터를 사용할 수 있다
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username = {}, age = {}, memberName, memberAge);
return "ok";
}
쿼리파라미터의 값은 String으로 넘어오지만 Spring에서 자동으로 타입변환을 한다
(String age -> int age)
String, int, Integer등의 단순 타입이라면 @RequestParam또한 생략이 가능하다
(@RequestParam("username")String memberName -> String username)
@RequestParam(required = false)
-> 기본값은 true, false인 경우 해당값이 없으면 null. true인 경우에 없으면 예외 발생
/request-param-required?username과 같이 파라미터 이름만 있는경우 빈문자로 통과 ""
@RequestParamMap
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParamMap<String,Object> paramMap) {
log.info("username = {}, userage = {}, paramMap.get("username"),paramMap.get("age"));
return "ok";
}
@RequestParamMap에 파라미터값들을 담아서 사용할 수도 있다
요청파라미터를 받아서 뷰에 렌더링할 때 필요한 객체를 만들고 값을 넣어주어야한다. 이때 @ModelAttribute를 사용한다
@Getter
@Setter
public class HelloData {
private String username;
private int age;
}
요청 파라미터를 바인딩할 객체를 만든다
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username = {}, age = {}", helloData.getUsername(), helloData.getUserage());
return "ok";
}
@ModelAttribute는 HelloData 객체를 생성하고 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 값을 바인딩한다.
@ModelAttribute 또한 생략이 가능하다.
@RequestParam과의 차이점은 @RequestParam은 String, int 같은 단순한 타입이고 @ModelAttribute는 그 외의 나머지를 바인딩한다
- HttpEntity
Http header, body 정보를 함께 담음
컨트롤러 파라미터로 받아 요청 헤더+바디를 함께 읽을 때 사용
컨트롤러 반환값으로 응답 헤더+바디를 간단히 지정
- ReqeustBody
@ResponseBody
@PostMapping("/request-body-json)
public String reqeustBodyJson(@RequestBody HelloData data){
log.info("username = {}, age = {}", data.getUserName(), data.getAge());
return "ok";
}
Http 요청 바디를 객체로 바인딩한다 (JSON -> DTO로 자동 변환)
JSON 요청 -> HTTP 메시지 컨버터 -> 객체 바인딩
PathVariable, RequestParam, ModelAttribute와 달리 생략이 불가능하다.(Model에 담아버리기 때문)
- ResponseBody
@ResponseBody
@PostMapping("/request-body-json")
public HelloData requestBodyJson(@RequestBody HelloData data) {
log.info("username = {}, age = {]", data.getUsername(), data.getAge());
return data;
}
view에 반환하지 않고 메시지 바디 정보를 직접 담아 반환한다
객체 -> HTTP 메시지 컨버터 -> JSON 응답