본문 바로가기

spring

@RequestParam

/**
 * @RequestParam 사용
 * - 파라미터 이름으로 바인딩
 * @ResponseBody 추가
 * - View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
 */
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
 @RequestParam("username") String memberName,
 @RequestParam("age") int memberAge) {
 log.info("username={}, age={}", memberName, memberAge);
 return "ok";
}
  • @RequestParam : 파라미터 이름으로 바인딩
  • @ResponseBody : View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력

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

  • @RequestParam("username") String memberName
  • ▶ request.getParameter("username")
/**
 * @RequestParam 사용
 * HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
 */
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
 @RequestParam String username,
 @RequestParam int age) {
 log.info("username={}, age={}", username, age);
 return "ok";
}

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

 

/**
 * @RequestParam 사용
 * String, int 등의 단순 타입이면 @RequestParam 도 생략 가능
 */
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
 log.info("username={}, age={}", username, age);
 return "ok";
}

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

 

> 주의

@RequestParam 애노테이션을 생략하면 스프링 MVC는 내부에서 required=false 를 적용한다. required 옵션은 바로 다음에 설명한다.

 

파라미터 필수 여부 - requestParamRequired

/**
 * @RequestParam.required
 * /request-param-required -> username이 없으므로 예외
 *
 * 주의!
 * /request-param-required?username= -> 빈문자로 통과
 *
 * 주의!
 * /request-param-required
 * int age -> null을 int에 입력하는 것은 불가능, 따라서 Integer 변경해야 함(또는 다음에 나오는
defaultValue 사용)
 */
@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";
}

@RequestParam.required

  • 파라미터 필수 여부
  • 기본값이 파라미터 필수( true )이다
  • /request-param?username= 
    파라미터 이름만 있고 값이 없는 경우 빈문자로 통과

여기서 주의해야할 점이 있다. 위에 예시를 보게 되면 String username만 넣을 경우 int age는 required가 false이기 때문에 안넣어도 될 것 같지만 500에러가 생긴다. 이유는 값을 넣지 않을 경우 null이 되지만 int형은 null이 될 수 없기 때문이다. 그러므로 int가 아니라 Intger로 바꿔주면 문제 없이 사용이 가능하다.

@RequestParam(required = false) Intger age)

기본 값 적용 - requestParamDefault

/**
 * @RequestParam
 * - defaultValue 사용
 *
 * 참고: defaultValue는 빈 문자의 경우에도 적용
 * /request-param-default?username=
 */
@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 를 사용하면 기본 값을 적용할 수 있다.

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

 

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

/**
 * @RequestParam Map, MultiValueMap
 * Map(key=value)
 * MultiValueMap(key=[value1, value2, ...]) ex) (key=userIds, value=[id1, id2])
 */
@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으로 조회할 수 있다.

@RequestParam Map

Map(key=value)

@RequestParam MultiValueMap

MultiValueMap(key=[value1, value2, ...] ex) (key=userIds, value=[id1, id2])

 

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

( 굳이 이러진 말자 )

'spring' 카테고리의 다른 글

HTTP 요청 메시지 - 단순 텍스트  (0) 2023.03.31
@ModelAttribute  (0) 2023.03.31
HTTP 요청 파라미터  (0) 2023.03.30
HTTP 요청 - 기본, header 조회  (0) 2023.03.30
요청 매핑 - 연습  (0) 2023.03.27