사용자가 전달하는 데이터를 다뤄보자.
요청 파라미터
를 다루기 위해 사용한다.
요청 파라미터
1. GET 메서드의 Query String
2. Form으로 전달하는 데이터 (application/x-www-form-urlencoded)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/requestParam")
public String requestParam(
@RequestParam(name = "name") String name,
@RequestParam int age
) {
return name + " " + age;
}
@PostMapping("/modelAttribute")
public String modelAttribute(
@ModelAttribute Info info
) {
return info.getName() + " " + info.getAge();
}
static class Info {
private String name;
private int age;
public Info(String name, int age) {
this.name = name;
this.age = age;
}
... Getter ...
}
}
@RequestParam
, @ModelAttribute
에 매핑할 데이터의 이름을 명시할 수 있다. 그런데 파라미터 이름과 같은 경우 생략할 수 있다.
더 나아가 Annotation도 생략할 수 있다. 그 때는 다음의 규칙을 따른다.
@RequestParam
이 적용된다.@ModelAttribute
가 적용된다.아래 예시처럼 age
필드에 숫자가 아닌 문자열이 입력되면
localhost:8080/test?name=abc&age=abc
DefaultHandlerExceptionResolver
가 처리한다.400 BAD REQUEST
응답을 받게 된다.@ModelAttribute
는 HttpMessageConverter
가 아닌, ModelAttributeMethodProcessor
에서 만든다.
@ModelAttribute
를 사용함을 확인하면 ModelAttributeMethodProcessor
를 통해 적합한 ModelAttribute 객체를 만든다.@ModelAttribute
의 Getter, Setter, Constructor@ModelAttribute
를 통해 만들 객체에 Setter가 있는지, Constructor가 어떤지에 따라 결과가 다르다.
필드는 전부 private인 상황
조건 | 결과 |
---|---|
Getter X Setter X All Args Constructor X | name: null, age: null |
Getter O Setter X All Args Constructor X | name: null, age: null |
Getter X Setter X All Args Constructor O | name: name#1, age: 10 |
Getter X Setter O All Args Constructor X | name: name#1, age: 10 |
Name만 Setter 만듦 | name: name#1, age: null |
Name만 Constructor로 값 할당 | name: name#1, age: null |
public
인 경우에도)Path Variable
을 추출(?)하기 위한 방법import org.springframework.web.bind.annotation.PathVariable;
@RestController
public class MyController {
@GetMapping("/path-variable/{id}/{name}")
public String pathVariable(
@PathVariable(name = "id") Integer id,
@PathVariable String name
) {
return name + " " + id;
}
}
@RequestParam
과 마찬가지로 컨버팅을 실패하면 400응답이 나간다.
@PathVariable
과 @RequestParam
을 같이 사용할 수 있다. (같이 사용할 경우가 있을지는 모르겠다)
Message Body
를 객체로 만들기 위해 사용한다.