GET - 쿼리파라미터
POST - HTML Form
Http 메시지 바디에 데이터를 직접 담아서 요청
만약 쿼리파라미터를 이용해 /request-param?username=hello&age=24
와 같은 uri 요청을 한다고하자.
@Slf4j
@Controller
public class RequestParamController {
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username={}, age={}", memberName, memberAge);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
}
v2와 같은 경우에는 메서드의 파라미터 이름과 쿼리파라미터의 key값이 일치하지 않아 @RequestParam("username") String memberName
과 같이 옵션을 주어 memberName 파라미터에는 username이라는 쿼리 파라미터의 value값을 매핑한다(값을 넣어준다)
v3와 같이 메서드의 파라미터 이름과 쿼리파라미터의 key값이 일치하는 경우 옵션을 주지 않아도 되며, 심지어@RequestParam
을 생략할 수 있다. 그러나 이 방법은 협업시에 생략하자고 약속되지 않았으면 다른사람이 알아볼 수 있게 생략하지 않는 것이 좋다.(아 ~ 쿼리파라미터의 username값을 메서드의 username이라는 파라미터로 받아오는거구나 ~ 라고 알 수 있도록)
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age) {
log.info("username={}, age={}", username, age);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
요청 파라미터를 받아 필요한 객체를 만들고 파라미터 값을 객체에 넣어주어야할 때가 있다.
요청 파라미터를 받아 다음과 같은 객체에 값을 넣어준다고 생각해보자.
@Data
public class HelloData {
private String username;
private int age;
}
만약 우리가 직접 파라미터값을 객체에 바인딩시켜준다면(넣어준다면) 아래와 같이 코드를 짜야한다.
@RequestParam String username;
@RequestParam int age;
HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);
그러나 우리가 Http 요청마다 다음과 같이 반복되는 코드를 작성하는건 매우 비효율적이다.
그래서 스프링에서는 이 과정을 자동화해주는 @ModelAttribute
라는 애노테이션을 제공한다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData){
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
스프링 MVC는 @ModelAttribute
가 있으면 다음을 실행한다
여기서 프로퍼티란 객체의 필드를 말한다