본문 바로가기
인프런 🍀

🌱 @RequestParam 개념 정리

by 의정부핵꿀밤 2023. 3. 13.
728x90

@RequestParam

스프링이 제공하는 어노테이션으로, 이를 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다

@ResponseBody
@RequestMapping("/request-param")
public String requestParamV2(
        @RequestParam("username") String memberName,
        @RequestParam("age") int memberAge
) {
    log.info("username={}, age={}", memberName, memberAge);
    return "ok";
}

@RequestParam

  • 파라미터 이름으로 바인딩한다
    • /request-param?username=yum&age=20
    • 위처럼 요청이 들어오면, username=yum, age=20이 바인딩 된다

 

@ResponseBody

  • 해당 어노테이션이 적용되면, @Controller 가 적용되었더라도 View 조회를 무시하고, HTTP message body에 직접 반환되는 string 값을 입력한다

 

@RequestParam 속성

  • name(value)
    • @RequestParam(”username”) String name
    • 위의 경우 url에서 username으로 받은 파라미터가 name 변수에 저장된다
    • 만약 HTTP 파라미터 이름이 변수 이름과 같은 경우 name(value) 속성은 생략 가능하다
  • String, int, Integer 등의 단순 타입이면 @RequestParam 도 생략 가능하다 → 잘 쓰지는 않음..
💡 @RequestParam을 생략하면 스프링 MVC는 내부에서 required=false 를 적용하기 때문에, 반드시 파라미터를 입력해야 오류가 발생하지 않는다!

 


🌱 @RequestParam(required = false)

@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
        @RequestParam(required = true) String username,
        @RequestParam(required = false) int age
) {
    log.info("username={}, age={}", username, age);
    return "ok";
}
  • required 옵션은 파라미터의 필수 여부를 결정한다
  • 기본값이 파라미터 필수(true)여서 생략하면 파라미터를 반드시 입력해야 한다

 

  • required = true 인 경우, 위와 같이 파라미터를 입력하지 않으면 400 Bad Request 예외가 발생한다

 


🌱 required=true에 파라미터 이름만 있고 값이 없는 경우(null)

@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
        @RequestParam(required = true) String username
) {
    log.info("username={}", username);
    return "ok";
}
  • 만약 파라미터의 이름만 있고 값이 없는 경우는 오류가 발생하지 않고 빈문자로 통과된다!

 

  • 위처럼 오류 없이 통과하고 username에는 빈문자가 저장된다

 


🌱 required=true → 기본형(primitive)에 null 입력한 경우

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

  • 만약 int, long, float 과 같은 기본형(primitive)에 null을 입력한 경우는 500 Server error 가 발생한다
  • 위처럼 파라미터 이름도 없으면 500 에러가 발생한다
  • 따라서 null을 받을 수 있는 참조형(Integer, Long..)으로 변경하거나, defaultValue를 사용한다

 


🌱 defaultValue

@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";
}
  • 파라미터에 값이 없는 경우에 defaultValue를 사용하면 기본값을 적용할 수 있다
  • defaultValue가 적용된 경우, 이미 기본값이 있기 때문에 required는 의미가 없다!

 

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

 


🌱 requestParam → Map

@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";
}
  • 파라미터를 Map, MultiValueMap으로 조회할 수 있다
  • 파라미터의 값이 1개가 확실하다면 Map을 사용해도 되지만, 그렇지 않다면 MultiValueMap을 사용하자
💡 MultiValueMap
- 스프링이 제공하는 인터페이스이다
- 기존 Map과 달리, 하나의 key에 여러 value를 저장할 수 있다

 


[ 참고]

인프런(김영한) : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

728x90

댓글