HttpServeltRequest의 request.getParameter()를 사용하면 두 가지 요청 파라미터를 조회할 수 있다. GET 쿼리 파라미터, POST HTML Form 전송 방식이든 둘다 형식이 같으므로 구분없이 조회할 수 있다.
RequestParam
@ResponseBody
@RequestMapping("/request-param")
public String requestParam(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge
return "ok";
}
1. RequestParam의 이름와 변수명이 같으면 생략할 수 있다.
@ResponseBody
@RequestMapping("/request-param")
public String requestParam(
@RequestParam String username,
@RequestParam int age,
return "ok";
}
2. 필수 파라미터 선언
required 메소드를 이용 -> true가 기본값. 없으면 오류
@ResponseBody
@RequestMapping("/request-param")
public String requestParam(
@RequestParam(required = false) String memberName,
@RequestParam int memberAge
return "ok";
}
/request-param?username=이라고 들어오면 빈 문자로 통과된다. 즉, required=true이어도 이를 분리 할 수 없다. 또 한 age에 값이 안들어오는 경우 에러가 발생하는데 이는 int에는 null값이 들어갈 수 없기 때문이다. 따라서 Integer로 바꿔야 한다. 이들을 모두 해결하는 방법으로 defaultValue메소드를 이용할 수도 있다.
ModelAttribute
실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어준다.
@RequestParam String username
@RequestParam int age
HelloData data = new HelloData();
data.setUsername(username)
data.setAge(age);
스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.
1. 먼저 요청 파라미터를 바인딩 받을 객체를 만든다.
@Data
public class HelloData {
private String username;
private int age;
}
2. @RequestParam대신 @ModelAttribute와 1번에서 만든 객체를 넣어준다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttribute(@ModelAttribute HelloData helloData) {}
[동작 과정]
스프링 mvc는 @ModelAtrribute가 있으면 다음을 실행한다.
1. HelloData 객체를 생성한다.
2. 요청 파라미터 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력 (바인딩) 한다.
3. 파라미터 이름이 username이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.
ModelAttribute와 RequestParam의 생략
@ModelAttribute와 @RequestParam은 생략할 수 있다. 그러면 이 둘을 스프링은 어떻게 구분할까?
-> 스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
1. String, int Integer 같은 단순 타입 = @RequestParam
2. 나머지 = @ModelAttribute(argument resolver로 지정해둔 타입 외)