[Spring MVC] HTTP 요청 파라미터
HTTP 요청 데이터 조회
클라이언트에서 서버로 요청 데이터를 전달할 때 사용하는 3가지 방법
HTTP요청 데이터
RequestParamController
@Slf4j
@Controller
public class RequestParamController {
@RequestMapping("/request-param-v1")
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
log.info("username={}, age={}", username, age);
response.getWriter().write("ok");
}
}
GET 실행
http://localhost:8080/request-param-v1?username=hello&age=20
HTML Form은 생략
HTTP 요청 파라미터 - @RequestParam
requestParamV2
@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
: 파라미터 이름으로 바인딩@ResponseBody
: View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
requestParamV3
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
HTTP 파라미터 이름이 변수 이름과 같으면 RequestParam(name="xx")
생략가능
requestParamV4
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
String
,int
,Integer
등의 단순 타입이면 @RequestParam
도 생략 가능
주의
@RequestParam
애노테이션을 생략하면 스프링 MVC는 내부에서require=false
를 적용한다.
requestParamRequired
@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";
}
@RequestParam.required
- 파라미터 필수 여부
- 기본값이 파라미터 필수(true)이다.
/request-param
요청username
이 없으므로 400 예외가 발생한다.
주의!
request-param?username=
- 파라미터 이름만 있고, 값이 없는 경우 -> “” 문자로 통과
주의!
/request-param
요청@RequestParam(required = false) int age
null
을int
에 입력하는 것은 불가능(500예외 발생)- 따라서,
null
을 받을 수 있는Integer
로 변경하거나,defaultValue
사용
requestParamDefault
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
- 이미 기본 값이 설정되었기 때문에
required
는 의미가 없다. defaultValue
는 빈 문자의 경우에도 설정한 기본값이 적용된다.request-param?username=
requestParamMap
@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";
}
파라미터를 Map, MultiValueMap으로 조회할 수 있다.
@RequestParam Map
Map(key=value)
@Requestparam MultiValueMap
MultiValueMap(key=[value1, value2, ...])
HTTP 요청 파라미터 - @ModelAttribute
기존 코드
@RequestParam String username;
@RequestParam int age;
HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);
스프링은 이 과정을 자동화해주는 @ModelAttribute
기능을 제공한다.
HelloData
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
@Data
@Getter
,@Setter
,@ToString
,@EqualsAndHashCode
,@RequiredArgsConstructor
를 자동 적용.
modelAttributeV1
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
HelloData
객체 생성- 요청 파라미터의 이름으로
HelloData
객체의 프로퍼티를 찾는다. - 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
- Ex) 파라미터 이름이
username
이면setUsername()
메서드를 찾아서 호출해 값을 입력.
프로퍼티
객체에 getUsername()
, setUsername()
메서드가 있으면, 이 객체는 username
이라는 프로퍼티를 가지고 있다.
modelAttributeV2
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
@ModelAttribute
는 생략할 수 있다.
String
,int
,Integer
같은 단순 타입 ->@RequestParam
- 나머지 ->
@ModelAttribute
(argument resolver로 지정해둔 타입 외)
댓글남기기