@Slf4j
@Controller
public class RequestParamController {
@RequestMapping("/request-param-v1")
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
log.info("usename={}, age={}",username,age);
response.getWriter().write("ok");
}
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(@RequestParam("username") String memberName, @RequestParam("age") int memberAge){
log.info("usename={}, age={}",memberName,memberAge);
return "ok";
}
}
@ResponseBody를 사용함으로서 뷰 조회가 아닌 "ok" 라는 문자를 HTTP 응답 메시지에 담아 반환한다.
단일 파라미터를 전달 받을 때 사용하는 어노테이션
파라미터 필수 여부 - requestParamRequired
@ResponseBody @RequestMapping("/request-param-required") public String requestParamRequired(@RequestParam(required = true) String username, @RequestParam(required = false) int age){ log.info("usename={}, age={}",username,age); return "ok"; }
- 파라미터 필수 여부
- 기본값은 true이다.
- required = true 일 경우 무조건 값이 있어야한다.
- required = false는 생략가능하다.
💦주의! - 기본형(primitive)에 null 입력
@RequestParam(required = false) int age)
로 age는 필수 여부가 false이지만 생략하게 되면 500 예외가 발생한다.
이러한 경우는 null을 int에 입력하는 것이 불가능하기 때문에
👉 null을 받을 수 있는 Integer로 변경하거나,
👉 defaultValue를 사용해야한다.
💦주의! - 파라미터 이름만 있고 값이 없는 경우
username만 있고 값이 없는 경우는 null이 아닌""(빈문자)
로 들어 온다!
👩💻 defaultValue
@ResponseBody @RequestMapping("/request-param-default") public String requestParamDefault(@RequestParam(required = true, defaultValue = "guest") String username, @RequestParam(required = false, defaultValue = "-1") int age){ log.info("usename={}, age={}",username,age); return "ok"; }
- 파라미터에 값이 없는 경우
defaultValue
를 사용하면 기본값을 적용할 수 있다.- defaultValue는
빈 문자
의 경우에도 적용된다.
📌실습해보기
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String,Object> paramMap){
log.info("usename={}, age={}",paramMap.get("username"),paramMap.get("age"));
return "ok";
}
requestParamMap
을 사용하여 파라미터를 Map으로 조회할 수 있다.📌실습해보기
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData){
log.info("usename={}, age={}",helloData.getUsername(),helloData.getAge());
return "ok";
}
HelloData
객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter을 호출해서 값을 입력(바인딩)한다.@ModelAttibute는 생략 가능하다.
그런데 @RequestParam도 생략 가능하기 때문에 혼란이 발생한다.
🔑 스프링은 해당 생략시 다음과 같은 규칙을 적용한다!
String
,int
,Integer
같은 단순 타입 ➡@RequestParam
- 나머지 =
@ModelAttribute