# GET 쿼리 파라미터
http://localhost:8080/request-param?username=hello&age=20
# POST HTML Form 전송
POST /request-param ...
content-type: application/x-www-form-urlencoded
username=hello&age=20
요청 파라미터 조회라고도 한다.
HttpServletRequest의 request.getParameter()
GET 쿼리 파라미터든 POST HTML Form이든 둘 다 형식이 같으므로 구분없이 조회할 수 있다.
@Slf4j@ControllerpublicclassRequestParamController { @RequestMapping("/request-param-v1")publicvoidrequestParamV1(HttpServletRequest request,HttpServletResponse response) throwsIOException {String username =request.getParameter("username");int age =Integer.parseInt(request.getParameter("age"));log.info("username = {}, age = {}", username, age);response.getWriter().write("ok"); }}
2022-03-01 00:10:55.961 INFO 23155 --- [nio-8080-exec-2] h.s.b.request.RequestParamController : username = 도던, age = 33
HTML Form으로 요청 파라미터를 조회한다.
@RequestParam
@Slf4j@ControllerpublicclassRequestParamController {// RestController처럼 스트링 값을 뷰가 아니라 문자 그래도 반환하도록 해준다. @ResponseBody @RequestMapping("/request-param-v2")publicStringrequestParamV2( @RequestParam("username") String memberName, @RequestParam("age") int memberAge ) {log.info("memberName = {}, memberAge = {}", memberName, memberAge);return"ok"; }}
이름과 변수명이 같고 String, int, Integer 등의 단순한 타입이면 @RequestParam 애너테이션까지 생략할 수 있다.
너무 다 생략하면 과할 수 있으니 애너테이션 정도는 붙여줘서 요청 파라미터를 읽는다고 명확하게 표시해주자.
필수값 지정
@Slf4j@ControllerpublicclassRequestParamController { @ResponseBody @RequestMapping("/request-param-required")publicStringrequestParamRequired( @RequestParam(required =true) String username, @RequestParam(required =false) int age ) {log.info("username = {}, age = {}", username, age);return"ok"; }}
# 쿼리 스트링에서 username을 뺐을 때
2022-03-01 13:36:44.587WARN 77398---[nio-8080-exec-4].w.s.m.s.DefaultHandlerExceptionResolver:Resolved
[org.springframework.web.bind.MissingServletRequestParameterException:Required String parameter'username'is not present]
# 쿼리 스트링에서 age를 뺐을 때
java.lang.IllegalStateException:Optional int parameter'age'is present but cannot be translated into a null value due to being declared as a primitive type.
Consider declaring it as object wrapper for the corresponding primitive type.
required 옵션은 기본적으로 true다.
필수값이 아니면 false로 지정한다.
필수값을 넣지 않으면 400 에러가 발생한다.
null이 아니라 ?username=처럼 빈 값이 들어오는 경우라면 ok가 떨어지므로 주의한다.
필수가 아니더라도 primitive type이면 null이 들어갈 수 없으므로 Wrapper 클래스로 바꿔줘야 한다.
@Slf4j@ControllerpublicclassRequestParamController { @ResponseBody @RequestMapping("/request-param-default")publicStringrequestParamDefault( @RequestParam(required =true, defaultValue ="guest") String username, @RequestParam(required =false, defaultValue ="-1") int age ) {log.info("username = {}, age = {}", username, age);return"ok"; }}