[Spring] @RequestParam Map param - 파라미터를 안줬는데 왜 잘되지? @RequestParam(required=false) 줘야되는거 아니였어? 응 Map은 아니야!

2022. 7. 18. 17:00IT개발/Spring & Spring Security

반응형
이게 모두 같은 동작을 한다. 파라미터가 있던 없던! 으잉? 설마!
 
자~~~~ 보자! 보자! 어디보자! 스프링 너 지금 보자! ....  ㅡ,.ㅡ
 
아래의 Spring의 스펙을 보자! 

 
org.springframework.web.bind.annotation

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 ){ }

머쓱타드해진 하루였다. 켁... 체면이 말이 아니구만! 쿨럭... 뭐 그러면서 다같이 성장하는거지 ㅋ

반응형