id
라는 query paramter을 추출해서 method의 paramter에 저장하는게 가능하다.@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
return "ID: " + id;
}
name
element를 사용한다. 밑은 fooId
에 id
를 추출한 값을, name
에 name
을 추출한 값을 저장한다.@PostMapping("/api/foos")
@ResponseBody
public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) {
return "ID: " + fooId + " Name: " + name;
}
value
가 name
에 해당되어서 그냥 @RequestParam("id")
를 해도 된다.@RequestParam
은 기본적으로 해당 parameter들이 '무조건' 필요하다고 설정을 한다. 즉 2번에서 /api/foos
에 GET request를 했는데 id
가 없으면 오류가 나온다. mapping을 저기로 했는데 query parameter이 없어서...(...)
이런 경우를 대비해 필수로 요구하지 않도록 설정하는게 가능한데, required
element를 false
로 설정하면 된다.
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false) String id) {
return "ID: " + id;
}
null
로 설정된다...만 5번에서 이걸 해결하는 방법을 소개하겠다.Optional
Java 8의 경우 최근 언어 트렌드를 따라 Optional
이라는 class가 생겼다.
알고있다고 가정하겠고... 이걸 사용하면 required
를 false
로 설정 안해도 문제가 없다.
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam Optional<String> id){
return "ID: " + id.orElseGet(() -> "not provided");
}
not provided
인 셈.required
만 false로 설정을 하면 없는 경우 null
이 저장되는데, default
를 사용하면 이때 사용할 기본값을 설정하는게 가능하다. 이때 default
를 설정하면 required
는 자동으로 false
가 된다는 것도 참고@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(defaultValue = "test") String id) {
return "ID: " + id;
}
Map<String, String>
을 활용하면 된다.@PostMapping("/api/foos")
@ResponseBody
public String updateFoos(@RequestParam Map<String,String> allParams) {
return "Parameters are " + allParams.entrySet();
}
위와 같이 하면 예를들어 http://localhost:8080/spring-mvc-basics/api/foos?name=John&age=30&city=New York
와 같은 url에 POST
가 오면 name
, age
, city
가 key인 map이 이루어진다. 각각의 value는 John
, 30
, New York
. (30
도 String
이라는 점 유의)
여기서 유의해야하는게 Map<String, String>
만 이 기능이 가능하다. 그냥 Map
을 쓰는 경우 documentation에 따르면 @RequestParam
에서 name을 지정해야하고, 이게 일치하는 경우에 그 값들이 Map
형태로 parameter에 저장된다고 한다.
List
type에 @RequestParam
annotation을 붙이고 request에서 해당 이름의 request parameter이 여러개의 값을 ,
, 혹은 &
의 구별을 통해 가지는 경우 이를 List
로 변환하는 것이 가능하다. 이는 밑과 같이 한다.@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
return "IDs are " + id;
}