Spring
Spring의 HTTP 요청파라미터 - @RequestParam
MKJo
2023. 8. 17. 02:00
스프링에서 제공하는 RequestParam 어노테이션을 사용하면 클라이언트의 요청 파라미터를 매우 편리하게 사용이 가능하함.
예제의 클래스에선 스프링에서 지원하는 Controller 어노테이션을 사용
@Controller
public class RequestParamController {
private final Logger log = LoggerFactory.getLogger(getClass());
//println() 메소드가아닌 로그로 기록을 남김
... 내용
}
로그 출력형태
2023-08-17 01:49:37.197 INFO 13452 --- [nio-8080-exec-7] s.s.b.request.RequestParamController : NAME: 홍길동 AGE : 50
@RequestParam을 사용하기 이전 쿼리 파라미터 정보를 서블릿을 통해 받아옴
@RequestMapping("/request-param-classic")
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
//localhost:8080/request-param-classic?username=홍길동&age=50
log.info("NAME: {} AGE : {}", username, age);
response.getWriter().write("OK! Classic");
//Return을 하지않고 response의 Writer를 받아와 직접 HTTP 바디에 응답
}
서블릿을 사용하지않고 @RequestParam 어노테이션을 통해 쿼리 파라미터를 매개인자로 바로 받아옴
// @Controller 어노테이션사용시 String 반환은 View를 찾기때문에 ResponseBody 어노테이션을통해 뷰로 가지않고 Body로 바로 응답
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam(value = "username") String memberName,
@RequestParam(value = "age") int memberAge
//Servlet의 HttpServletRequest request.getParameter()와 동일
) {
log.info("NAME: {} AGE : {}", memberName, memberAge);
return "OK! V2";
}
@RequestParam의 value값과 받아올 매개변수명이 동일하면 value값은 생략이 가능함
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age
//쿼리 파라미터와 매개변수명이 동일하면 @RequestParam의 value값 생략가능
) {
log.info("NAME: {} AGE : {}", username, age);
return "OK! V3";
}
추가적으로, @RequestParam 어노테이션 자체도 생략이 가능하나 직관적이지않아보일 수 있음
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(
String username,
int age
// String, int, Integer 등의 단순타입이면 @RequestParam또한 생략가능하나 너무 간소화하는것도 좋아보이진 않음
) {
log.info("NAME: {} AGE : {}", username, age);
return "OK! V4";
}
@RequestParam 어노테이션의 required 속성을통해 파라미터 필수 여부 설정 가능
기본값 = 필수(true)
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
// required는 기본값 true, 이 파라미터들이 넘어오지않으면 Client에서 Bad Request(400) 오류가남
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age
// false로 설정후 요청파라미터가 넘어오지않으면 null값이 들어옴
// 기본자료형(primitive type)일 경우 null값이 들어올 수 없어 서버오류(500)가 나므로 따로 처리를 해주어야함
) {
log.info("NAME: {} AGE : {}", username, age);
return "OK! Required";
}
@RequestParam의 defaultValue 속성을 통해, 값이 넘어오지 않아도 값을 할당가능.
결과적으로 이 속성이 적용되면 required 속성은 의미가 없어짐
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age
//defaultValue값을 설정해놓으면 required는 사실상 필요가 없어서 생략이 가능함
//defaultValue는 null이 아닌 빈 문자열도 defaultValue로 치환해줌.
//ex) http://localhost:8080/request-param-default?username=
) {
log.info("NAME: {} AGE : {}", username, age);
return "OK! Default";
}
파라미터들을 Map으로 받아오기
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(
//하나의 키에 복수개의 밸류값이 들어가있는 경우 MultiValueMap으로 받으면 됨
@RequestParam Map<String, Object> paramMap
) {
log.info("NAME: {} AGE : {}", paramMap.get("username"), paramMap.get("age"));
return "OK! Map";
}