Spring/Spirng MVC - 기본기능

스프링 - HTTP 요청 파라미터 - @RequestParam

진이최고다 2023. 3. 28. 15:27

@RequestParam

스프링이 제공하는 @RequestParam 을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다.


requestParamV2

@Slf4j
@Controller
public class RequestParamController {

    @ResponseBody
    @RequestMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge) {

        log.info("username={}, age={}", memberName, memberAge);
        return "ok";
    }
}

실행 : http://localhost:8080/request-param-v2?username=hello&age=20

 

@RequestParam : 파라미터 이름으로 바인딩

@ResponseBody : View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력

 

@RequestParam의 name(value) 속성이 파라미터 이름으로 사용

@RequestParam("username") String memberName

request.getParameter("username")


requestParamV3

HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능

@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
        @RequestParam("username") String username,
        @RequestParam("age") int age) {

    log.info("username={}, age={}", username, age);
    return "ok";
}

실행 : http://localhost:8080/request-param-v3?username=hello&age=20

 


 

requestParamV4

String , int , Integer 등의 단순 타입이면 @RequestParam 도 생략 가능

@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username,int age) {

    log.info("username={}, age={}", username, age);
    return "ok";
}

실행 : http://localhost:8080/request-param-v4?username=hello&age=20

 

💣 @RequestParam 애노테이션을 생략하면 스프링 MVC는 내부에서 required=false 를 적용한다. 

💡 코드는 간결해지지만, @RequestParam 이 있으면 명확하게 요청 파리미터에서 데이터를 읽는 다는 것을 알 수 있다.

 


파라미터 필수 여부 - requestParamRequired

@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
        @RequestParam(required = true) String username,
        @RequestParam(required = false) Integer age) {
    
    log.info("username={}, age={}", username, age);
    return "ok";
}

실행 : http://localhost:8080/request-param-required?username=hello

INFO 2840 --- [nio-8080-exec-5] h.s.b.request.RequestParamController     : username=hello, age=null

 

@RequestParam.required 

파라미터 필수 여부

기본값이 파라미터 필수( true )이다.

 

/request-param 요청

username 이 없으므로 400 예외가 발생한다.

 

💣파라미터 이름만 사용

/request-param?username= 파라미터 이름만 있고 값이 없는 경우 빈문자로 통과 주의!

 

💣기본형(primitive)에 null 입력

/request-param 요청

@RequestParam(required = false) int age

 

null 을 int 에 입력하는 것은 불가능(500 예외 발생)

따라서 null 을 받을 수 있는 Integer 로 변경하거나, 또는 다음에 나오는 defaultValue 사용


기본 값 적용 - requestParamDefault

@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
        @RequestParam(required = true, defaultValue = "guest") String username,
        @RequestParam(required = false,defaultValue = "-1" ) int age) {

    log.info("username={}, age={}", username, age);
    return "ok";
}

 

실행 : http://localhost:8080/request-param-default?

INFO 8712 --- [nio-8080-exec-3] h.s.b.request.RequestParamController     : username=guest, age=-1

 

파라미터에 값이 없는 경우 defaultValue 를 사용하면 기본 값을 적용할 수 있다.

이미 기본 값이 있기 때문에 required 는 의미가 없다. 

 

defaultValue 는 빈 문자의 경우에도 설정한 기본 값이 적용된다.

/request-param-default?username=

파라미터를 Map으로 조회하기 - requestParamMap

@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {

    log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
    return "ok";
}

실행http://localhost:8080/request-param-map?username=hello&age=20

INFO 4212 --- [nio-8080-exec-2] h.s.b.request.RequestParamController     : username=hello, age=20

 

파라미터를 Map, MultiValueMap으로 조회할 수 있다

. @RequestParam Map
  • Map(key=value)
@RequestParam MultiValueMap :
  • MultiValueMap(key=[value1, value2, ...] ex) (key=userIds, value=[id1, id2])

⭐️ 파라미터의 값이 1개가 확실하다면 Map 을 사용해도 되지만, 그렇지 않다면 MultiValueMap 을 사용하는것이 좋다.

 

 

 

 

출처 : 인프런 - 스프링 MVC 1편  by 우아한형제 김영한이사님