@RequestMapping("/hello-basic")
/hello-basic
과 /hello-basic/
둘은 같게 인식 @RequestMapping({"/hello-basic", "/hello-go"})
다중 설정 가능 메서드 매핑
@RequestMapping(value = "/hello", method = RequestMethod.GET)
PathVariable 경로 변수
@GetMapping("/mapping/{userId}")
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("userId={}", data);
return "ok";
}
public String mappingPath(@PathVariable("userId") String data)
public String mappingPath(@PathVariable userId)
params 특정 파라미터 조건
@GetMapping(value = "/mapping-param", params = "key=value")
params="key"
param="!key"
params="key=value"
params="key!=value"
params= {"key=value", "key2=value2"}
headers 특정 헤더 조건
@GetMapping(value = "/mapping-param", headers = "key=value")
consume 미디어 타입 조건
@PostMapping(value = "/mapping-consume", consumes = "application/json")
consumes="application/json"
consumes="!application/json"
consumes="application/*"
consumes="*\/*"
MediaType.APPLICATION_JSON_VALUE
produce 미디어 타입 조건
@PostMapping(value = "/mapping-produce", produces = "text/html")
produces = "text/html"
produces = "!text/html"
produces = "text/*"
produces = "*\/*"
@RequestParam
@ResponseBody
public String requestParam(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
파라미터 이름으로 바인딩
파라미터 이름과 변수명이 같으면 ("name") 생략 가능
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
public String requestParamV3(String username, int age) {
@ResponseBody
view 조회를 무시하고 HTTP 메시지 바디에 내용 입력
Required
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age) {
파라미터 필수 여부
required = true 필수 (기본값)
required = false 필수 X
int 타입의 경우 생략 불가 (500 예외 발생)
👉 생략시 null이 되는데 기본형 int는 null값을 넣을 수 없기 때문, 무조건 값이 들어가야 함
객체형 Integer 로 넣어야 null 가능 (혹은 defaultValue 사용하여 처리)
/request-param-required?username=
처럼 끝에 =
가 있는 경우 (=파라미터 이름만 있고 값이 없는 경우) null이 아닌 빈 문자로 들어감
👉 required = true의 경우 예외 X
null일 경우 400 예외 발생
defaultValue
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age) {
requestParamMap
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
log.info("username={}, age={}", paramMap.get("username"),
paramMap.get("age"));
파라미터를 Map, MultiValueMap으로 조회
파라미터의 값이 1개이면 Map, 그렇지 않으면 MultiValueMap
@RequestParam Map
Map(key=value)
@RequestParam MultiValueMap
MultiValueMap(key=[value1, value2, ...]
- ex) (key=userIds, value=[id1, id2])
@ModelAttribute
기능 1
public String class(@RequestParam String username, @RequestParam int age) {
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
👇
public String modelAttributeV1(@ModelAttribute HelloData helloData) {}
///
@Data
public class HelloData {
private String username;
private int age;
}
💡 @Data
@Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 를 자동으로 적용
스프링MVC는 @ModelAttribute 가 있으면 다음을 실행한다
ex) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.
프로퍼티?
getUsername( ), setUsername( ) 메서드가 있으면 이 객체는 username 이라는 프로퍼티를 가지고 있다. username 프로퍼티의 값을 변경하면 setUsername( ) 이 호출되고, 조회하면 getUsername( ) 이 호출된다
기능 2
@ModelAttribute 생략
생략 가능하나 @RequestParam도 생략 가능하기 때문에 혼란
String, int 같은 단순 타입 👉 @RequestParam
(argument resolver 로 지정해둔 타입 제외) 나머지 👉 @ModelAttribute
기능 3
컨트롤러에 있는 별도의 메서드에 적용 가능
👉 해당 컨트롤러를 요청할 때 자동으로 반환값이 model에 담긴다
반복해서 사용해야 하는 경우 활용
InputStream
@PostMapping("")
public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
}
메시지 바디의 데이터를 직접 읽음
InputStream , OutputStream
@PostMapping("")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
responseWriter.write("ok");
}
스프링 MVC에서 지원하는 파라미터
InputStream (Reader) : 요청 메시지 바디의 내용 직접 조회
OutputStream (Writer) : 응답 메시지 바디에 직접 결과 출력
HttpEntity
HTTP header, body 정보를 조회
응답에도 사용 가능
- 메시지 바디 정보 직접 반환
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
HTTPEntity를 상속받은 다음 객체들도 같은 기능을 제공
return new ResponseEntity<String>("Hello World", responseHeaders,
HttpStatus.CREATED)
@RequestBody
@ResponseBody
@PostMapping("")
public String requestBodyStringV4(@RequestBody String messageBody) {
log.info("messageBody={}", messageBody);
return "ok";
}
@RequestBody
메시지 바디 정보 직접 조회
헤더 정보는 HttpEntity, @RequestHeader 사용
요청 파라미터를 조회하는 @RequestParam, @ModelAttribute와는 관계 없이
메시지 바디를 직접 조회
@ResponseBody
정리
요청 파라미터 조회 :@RequestParam
,@ModelAttribute
HTTP 메시지 바디 직접 조회 :@RequestBody