쿼리 파라미터, HTML From
1. request.getParameter()
HttpServletRequest 의 request.getParameter() 를 사용하면 다음 두가지 요청 파라미터를 조회할 수 있다.
- GET, 쿼리 파라미터 전송
- POST, HTML Form 전송
@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");
}
여기서는 단순히 HttpServletRequest가 제공하는 방식으로 요청 파라미터를 조회했다.
2. @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";
//controller 애노테이션에서 "ok"를 반환하면 뷰 리졸버가 ok라는 뷰를 찾는다.
//HTTP message에 ok를 넣고 싶으면 RestController 애노테이션으로 바꿔도 되고 @ResponseBody를 적어도 된다.
}
@RequestParam : 파라미터 이름으로 바인딩
@RequestParam String name: HTTP 파라미터 이름이 변수 이름과 같으면 괄호 생략 가능
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
//String, int, Integer등의 단순 타입이면 @RequestParam 생략 가능
log.info("username={}, age={}", username, age);
return "ok";
}
String, int 등의 단순 타입이면 @RequestParam 도 생략 가능
주의할 점은 @RequestParam 애노테이션을 생략하면 스프링 MVC는 내부에서 required=false 를 적용한다.
파라미터 필수 여부
@RequestParam.required
- 파라미터 필수 여부
- 기본값이 파라미터 필수( true )이다
주의!
파라미터 이름만 사용 ( /request-param?username=)
→ 파라미터 이름만 있고 값이 없는 경우 빈문자로 통과
기본형(primitive)에 null 입력
→ /request-param 요청을 했고 @RequestParam(required = false) int age로 파라미터 조회하면
null 을 int 에 입력하는 것은 불가능해서 500 예외 발생
null 을 받을 수 있는 Integer 로 변경하거나, 또는 다음에 나오는 defaultValue 사용
defaultValue 적용
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age) {
// required = true이고 defalutValue를 설절해 놓으면 파라미터 값이 안들어와도 오류 발생하지 않음.
log.info("username={}, age={}", username, age);
return "ok";
}
파라미터에 값이 없는 경우 defaultValue 를 사용하면 기본 값을 적용할 수 있다.
파라미터를 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";
}
파라미터를 Map, MultiValueMap으로 조회할 수 있다.
3. ModelAttribute
필요한 객체를 만들고 그 객체에 요청 파라미터를 조회한 데이터를 넣어주기 위해 ModelAttribute라는 기능을 제공한다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData){
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
log.info("helloData={}", helloData); //helloData=HelloData(username=hello, age=20)
return "ok";
}
스프링 MVC는 @ModelAttribute가 있으면 다음을 실행한다.
- HelloData 객체를 생성한다.
- 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다. 예) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.
프로퍼티 더보기 글 참고
프로퍼티 → 객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다. username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고, 조회하면 getUsername() 이 호출된다.
@ModelAttribute 생략
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData){ //@ModelAttribute 생략
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
log.info("helloData={}", helloData); //helloData=HelloData(username=hello, age=20)
return "ok";
}
@ModelAttribute 는 생략할 수 있다. 그런데 @RequestParam 도 생략할 수 있으니 혼란이 발생할 수 있다.
스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
- String , int , Integer 같은 단순 타입 = @RequestParam
- 나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)
'Spring > Spring MVC' 카테고리의 다른 글
요청 매핑 (API), HTTP 헤더 조회, 요청 (0) | 2023.10.05 |
---|---|
HTTP 요청 메시지 - 텍스트, JSON (1) | 2023.10.05 |
[스프링 MVC] 요청 매핑 (0) | 2023.10.05 |
컴포넌트 스캔 (0) | 2023.09.17 |
스프링 MVC 시작하기 (0) | 2023.09.05 |