코드 그라데이션
HTTP 요청 파라미터 - @RequestParam 본문
RequestParamController 中
requestparamV2
/**
* @RequestParam 사용
* - 파라미터 이름으로 바인딩
* @ResponseBody 추가
* - View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
*/
// @RequestParam 어노테이션을 사용하여 파라미터를 바로 메서드 매개변수로 받는 방법.
@ResponseBody // 메서드의 반환 값이 HTTP 응답 본문에 직접 쓰여야 함을 나타냄.
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username={}, age={}", memberName, memberAge); // 파라미터를 로깅.
return "ok";
}
@ResponseBody 어노테이션이 사실상 @RestController 역할을 한다.
왜? 컨트롤러 어노테이션이 있고 메서드의 반환타입이 String이고, return 이 있으면, 스프링은 쟈연스럽게 이 리턴을
뷰 이름으로 인식하고 랜더링 한다고 했음.
실행 결과
즉 이게 무슨 말이냐면,
"username" 과 "age" 가 http 메시지의 키와 매핑이 된다.
그림으로 비교하면
이렇게 된다는 이야기.
변수명은 아무거나 써도 된다.
requestparamV3
/**
* @RequestParam 사용
* HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
*/
// @RequestParam 어노테이션을 사용하되, 파라미터 이름과 메서드 매개변수 이름이 동일한 경우.
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
궁극적으로 이 코드랑 위의 v2 코드랑 같다는 의미가 된다.
requestparamV4
더 없앨 수도 있다.
/**
* @RequestParam 사용
* String, int 등의 단순 타입이면 @RequestParam 도 생략 가능
*/
// @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 도 생략 가능
파라미터 필수 여부 - requestParamRequired
/**
* @RequestParam.required /request-param-required -> username이 없으므로 예외
* <p>
* 주의!
* /request-param-required?username= -> 빈문자로 통과
* <p>
* 주의!
* /request-param-required
* int age -> null을 int에 입력하는 것은 불가능, 따라서 Integer 변경해야 함(또는 다음에 나오는
* defaultValue 사용)
*/
// @RequestParam 어노테이션을 사용하여 파라미터를 받고,
// 필수 파라미터와 선택적 파라미터를 다루는 방법
@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";
}
이렇게 되어야 하나
필수값 하나 빠뜨린다면 결과는
400 에러가 나옴.
-> 요청 파라미터와 스펙이 맞지 않기 때문에. 400에러
500에러, int는 null을 쓸 수 없다.
Integer은 객체형. 객체형에는 null이 들어갈 수 있으니까.
그래서 Integer 등으로 바꿔서 쓴다는 말.
빈 문자로 통과하는 경우는 뭐냐
이러한 경우. 이래도 ok 정상적으로 출력된다는 소리.
"" 라는 뜻.
기본 값 적용 - requestParamDefault
// @RequestParam 어노테이션을 사용하여 파라미터를 받고, 기본값을 설정하는 방법.
/**
* @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";
}
1) 정상적으로 값 집어넣은 경우
값을 누락시킨 경우
기본값 출력됨.
참고.
defaultValue가 있는 경우
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age)
required가 필요 없음(어차피 기본값이 들어갈 테니까. 안 적어도 된다는 이야기.)
defaultValue의 경우,
파라미터를 Map으로 조회하기 - requestParamMap
/**
* @RequestParam Map, MultiValueMap
* Map(key=value)
* MultiValueMap(key=[value1, value2, ...]) ex) (key=userIds, value=[id1, id2])
*/
// @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개가 일반적이긴 하다고 한다.
'Spring > MVC 1' 카테고리의 다른 글
HTTP 요청 메시지 - 단순 텍스트 (0) | 2023.10.09 |
---|---|
HTTP 요청 파라미터 - @ModelAttribute (0) | 2023.10.08 |
HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form (1) | 2023.10.08 |
HTTP 요청 - 기본, 헤더 조회 (0) | 2023.10.08 |
<추가> Locale이란? By chat GPT (0) | 2023.10.08 |