쌓고 쌓다
@RequestParam + required / defaultValue / Map 본문
클라이언트에서 서버로 데이터를 전달할 때 다음과 같은 방법이 있다.
1. GET 쿼리 파라미터
- /url?username=LSM&age=7
- 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해 전달하는 방법이다.
2. POST (HTML Form)
- html의 form 태그를 통해 데이터를 전송.
- content-type: application/x-www-form-urlencoded (폼으로 전송시 타입)
- 메시지 바디에 쿼리 파라미터 형식으로 전달한다. ( /url?username=LSM&age=7 )
@RequestParam - HTTP 요청 파라미터
@RequestParam을 통해서 HTTP 요청 데이터를 처리할 수 있다.
html form
<input type="text" name="username"/>
<input type="text" name="age"/>
input 태그의 name 속성 값으로 서버에서 파라미터로 받아 처리한다.
기본 형태 @RequestParam(name="username") -> @RequestParam("username")
@Slf4j
@Controller
public class RequestParamController {
@RequestMapping("/request-param-v2")
@ResponseBody
public String requestParamV2(@RequestParam("username") String memberName,
@RequestParam("age") int memberAge){
log.info("username={}, age={}", memberName, memberAge);
return "ok";
}
...
}
@RequestParam("username")에서 HTTP 파라미터 이름 "username"으로 바인딩을한다.
파라미터 "username"의 값은 memberName 변수에 담긴다.
+ @Controller이다. 메서드의 String 리턴 값을 통해 뷰를 찾는다.
하지만 @ResponseBody가 있어 뷰를 반환하지 않고 "ok"가 메시지 바디에 직접 들어가 응답한다.
@RestController라면 반환 값으로 뷰를 찾지 않고 HTTP 메시지 바디에 바로 입력한다.
파라미터 이름 생략
@RequestMapping("/request-param-v3")
@ResponseBody
public String requestParamV3(@RequestParam String username, @RequestParam int age){
log.info("username={}, age={}", username, age);
return "ok";
}
파라미터의 이름과 변수의 이름이 동일하다면 생략하고 @RequestParam만 써줘도 바인딩이 가능하다.
@RequestParam 생략
@RequestMapping("/request-param-v4")
@ResponseBody
public String requestParamV4(String username, int age){
log.info("username={}, age={}", username, age);
return "ok";
}
파라미터의 이름과 변수의 이름이 동일하고.
String, int, Integer과 같이 단순 타입이라면 @RequestParam도 생략할 수 있다... ㅋㅋ
*@RequestParam 생략시 require=false를 적용한다.
파라미터 필수 여부 지정 - required
@RequestMapping("/request-param-v5")
@ResponseBody
public String requestParamV5(@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age){
// int는 null을 가질 수 없다.
log.info("username={}, age={}", username, age);
return "ok";
}
require 속성으로 필수 여부를 지정할 수 있다. 기본값은 require=true이다.
여기서 int age -> Integer age로 수정이 필요하다.
age의 필수 여부를 false로 했다.
age 값을 넣어주지 않으면 null 값을 가지게 되는데 int는 null 값을 가질 수 없으므로
Integer로 수정이 필요하다.
필수 파라미터에 이름만 있고 값은 없이 절다되면 어떻게 될까?
/request-param?username=
널 값이 아닌 빈 문자열 ""로 처리되어 통과된다.
기본 값 설정 - defaultValue
@RequestMapping("/request-param-v6")
@ResponseBody
public String requestParamV6(@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age){
log.info("username={}, age={}", username, age);
return "ok";
}
파라미터에 값이 없을 때 기본 값을 넣어줄 수 있다.
기본 값이 설정되어 있어 required는 의미가 없긴하다.
빈 문자열이 들어가면 기본 값을 넣어줄까?
http://localhost:8080/request-param-v6?username=
위와 같이 빈 문자열을 넣어도 username에는 기본 값이 들어간다.
파라미터 Map으로 조회하기
@RequestMapping("/request-param-map")
@ResponseBody
public String requestParamV6(@RequestParam Map<String, Object> paramMap){
log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
key에 Value가 여러개라면 MultiValueMap을 쓰자.
@RequestParam MultiValueMap<String, Object> paramMap
key=userIds, value=[id1, id2] 형태로 값을 갖는다.
'프로그래밍 > spring' 카테고리의 다른 글
@ModelAttribute ? (0) | 2023.08.12 |
---|---|
[스프링 부트] 게시글 수정시 첨부파일 수정 방법 - 22 (0) | 2023.08.11 |
[스프링 부트] 첨부파일(파일 업로드) 목록 수정 - 21 (0) | 2023.08.09 |
Spring MVC 사용 방식 (0) | 2023.08.08 |
뷰 리졸버 동작 (0) | 2023.08.07 |