2022. 7. 18. 17:00ㆍIT개발/Spring & Spring Security
Annotation Type RequestParam
@Target(value=PARAMETER) @Retention(value=RUNTIME) @Documented public @interface RequestParam
Annotation which indicates that a method parameter should be bound to a web request parameter.Supported for annotated handler methods in Spring MVC and Spring WebFlux as follows:
- In Spring MVC, "request parameters" map to query parameters, form data, and parts in multipart requests. This is because the Servlet API combines query parameters and form data into a single map called "parameters", and that includes automatic parsing of the request body.
- In Spring WebFlux, "request parameters" map to query parameters only. To work with all 3, query, form data, and multipart data, you can use data binding to a command object annotated with ModelAttribute.
If the method parameter type is Map and a request parameter name is specified, then the request parameter value is converted to a Map assuming an appropriate conversion strategy is available.
If the method parameter is Map<String, String> or MultiValueMap<String, String> and a parameter name is not specified, then the map parameter is populated with all request parameter names and values.
위와 같이 여러분들도 잘 아시다시피 RequestParam은 default로 required true이다.
그런데! 이녀석이 안먹히는 케이스가 있다!!!
아래 처럼 RequestParam에 name을 지정하지 않고, 타입을 Map을 사용했을때!!!
기냥 Required 개무시하고 통과했다... 즉 Map으로 선언하면, required=false가 되는 효과를 얻는 것이다...
@GetMapping("/list")
public ResponseEntity<?> getList( @RequestParam(required=true) Map<String, Object> param ) { }
Spring 문서에 보다시피,
"If the method parameter is Map<String, String> or MultiValueMap<String, String> and a parameter name is not specified, then the map parameter is populated with all request parameter names and values."
라고 나와 있지만 required가 당근 true라서 뭔데이터라도(최소1개라도) 줘야하는줄 알았다.
그런데 두둥! false 될줄이야... 암튼 이번기회에 다시금 문서를 확신하지 말자는걸 배웠다.
Spring 문서를 들먹이며, 아래처럼 false를 줘야한다고 후배에게 멋지게 알려주려다가 'false 안줘도 되던대요' 란 말에...
@GetMapping("/list")
public ResponseEntity<?> getList( @RequestParam(required=false) Map<String, Object> param ){ }
머쓱타드해진 하루였다. 켁... 체면이 말이 아니구만! 쿨럭... 뭐 그러면서 다같이 성장하는거지 ㅋ