- 서블릿에서 학습했던 HTTP 요청 데이터를 조회하는 방법은 예전 포스팅에서 다루었었다.
- 이번 포스팅에서는 서블릿으로 조회하는 방법이 아닌, 스프링으로 조회하는 방법에 대해서 알아보자.
💡 HTTP 요청 파라미터 - @RequestParam
@RequestParam
- 스프링이 제공하는 @RequestParam 을 사용하면 요청 파라미터를 매우 편리하게 조회가 가능하다.
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username={}, age={}", memberName, memberAge);
return "ok";
}
- @RequestParam은 파라미터 이름으로 바인딩하여 사용한다.
- @RequestParam("username") String memberName => request.getParameter("username")
- 만약 HTTP 파라미터 이름이 변수 이름과 같다면 @RequestParam(name="xx") 생략 가능
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
❗️@ResponseBody 란?
- View 조회를 무시한다.
- HTTP message body 에 직접 해당 내용 입력
✔︎ 파라미터 필수 여부
- @RequestParam 의 속성 중 required 를 사용하여 해당 파라미터의 필수 여부를 설정할 수 있다.
@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";
}
- 기본값은 파라미터 필수(true)이다.
- 해당 파라미터를 공백으로 전송하면 빈문자로 통과된다.
- required 가 true 일 때 파라미터를 보내주지 않을 경우 400에러가 발생한다.
- 원시타입으로 null 이 들어갈 수 없기 대문에 wrapper 타입을 사용해야 한다.
✔︎ 기본값을 설정하기 (defaultValue)
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(@RequestParam(defaultValue = "guest") String username,
@RequestParam(defaultValue = "-1") int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
- 파라미터가 없는 경우 기본값으로 설정된 값이 적용된다.
- 빈 문자("") 일 경우 설정한 기본 값이 적용된다.
✔︎ 파라미터를 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";
}
- 파라미터의 값이 1개면 Map 을 사용하고, 그렇지 않은 경우 MultiValueMap 을 사용하자.
💡 HTTP 요청 파라미터 - @ModelAttribute
@ModelAttribute
- 사용자가 요청시 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션이다.
- 요청 파라미터를 바인딩 받을 객체가 필요하다.
@Data
public class HelloData {
private String username;
private int age;
}
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
- 스프링 MVC 는 @ModelAttribute 가 있을 경우
- HelloData 객체를 생성하고
- 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾고, 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
- 예) 파라미터의 이름이 username 일 경우 setUsername() 을 찾아 호출하면서 값 입력.
- 생략이 가능하다.
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
💡 정리
- 만약 @ModelAttribute, @RequestParam 이 생략되어 있을 경우 스프링은 다음과 같이 규칙을 적용하여 해결한다.
- String, int, Integer 같은 단순 타입 = @RequestParam
- 나머지의 경우 = @ModelAttribute
<김영한 - '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술'을 참고하였습니다.>
'Spring' 카테고리의 다른 글
| [spring] 스프링 MVC - HTTP 응답 데이터 (0) | 2023.03.18 |
|---|---|
| [spring] 스프링 MVC - HTTP 요청 메세지 (0) | 2023.03.16 |
| [spring] 스프링 MVC - 요청을 매핑하는 다양한 방법 (0) | 2023.03.14 |
| [spring] logging (0) | 2023.03.13 |
| [spring] spring MVC 구조 이해 - dispatcherServlet (0) | 2023.03.12 |