HTTP 요청 파라미터
HTTP 요청 파라미터
HTTP 요청 파라미터를 조회하는 기능에는 @RequestParam, @ModelAttribute가 있다.
@RequestParam
@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"));
response.getWriter().write("ok");
}
request.getParameter()
로 단순히 HttpServletRequest가 제공하는 방식으로 요청 파라미터를 조회한 모습이다.
반면에 스프링이 제공하는 @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 : 파라미터 이름으로 바인딩한다.
- @ResponseBody는 View 조회를 무시하고, HTTP message body에 직접 해당 내용을 입력한다.
@RequestParam의 name(value)속성이 파라미터 이름으로 사용된다.
@RequestParam("username") -> 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";
}
HTTP 파라미터 이름이 변수이름과 같아 생략된 모습이다.
- String, int, Integer 등의 단순타입이면
@RequestParam
도 생략가능하다.
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(String username, int age) {
하지만 @RequestParam
이 있으면 명확하게 요청 파리미터에서 데이터를 읽는 다는 것을 알 수 있으므로 선택해서 사용하도록 하자.
파라미터 필수 여부
@RequestParam.required
를 사용해서 파라미터의 필수 여부를 나타 낼 수 있다.
- 기본값이 파라미터 필수(true)이다.
- 사용방법
- @RequestParam(required = true 또는 faluse 작성)
- 파라미터에 값이 없는 경우에 defaultValue를 사용하여 기본 값을 적용할 수 있다.
@RequestParam(required = false, defaultValue = "-1") int age
참고로 defaultValue
는 빈 문자의 경우에도 설정한 기본값이 적용된다.
@ModelAttribute
실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 아래의 예시처럼 값을 넣어주어야 한다.
@RequestParam String username;
@RequestParam int age;
HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);
스프링은 위의 과정을 자동화해주는 @ModelAttribute
기능을 제공한다.
스프링 MVC는 @ModelAttribute
가 있으면 다음을 실행한다.
- 필요한 객체를 생성한다.
- 요청 파라미터의 이름으로 해당 객체의 프로퍼티를 찾는다.
- 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
- 예를 들어 파라미터 이름이 username이면 setUsername()메서드를 찾아서 호출하면서 값을 입력한다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
직접 setter메서드에 파라미터의 값을 입력하지 않고 @ModelAttribute
를 사용함으로써 자동으로 파라미터의 값을 바인딩 했다.
@ModelAttribute
는 모델(Model)에@ModelAttribute
로 지정한 객체를 자동으로 넣어준다.- 이름을 다르게 지정한 경우 아래와 같이 다른 이름으로 모델에 포함된다.
@ModelAttribute("hello") Item item //이름을 hello 로 지정
model.addAttribute("hello", item); //모델에 hello 이름으로 저장
- 이름을 생략할 경우 모델에 저장될 때 클래스명을 사용하며, 이 때 클래스의 첫 글자만 소문자로 변경해서 등록한다.
@ModelAttribute
는 생략할 수 있다.
@RequestParam
도 생략이 가능하고, @ModelAttribute
도 생략이 가능하기에 혼란이 발생할 수 있다.
- 스프링은 해당사항들을 생략할 시에 다음과 같은 규칙을 적용한다.
- String, int, Integer와 같은 단순 타입은 @RequestParam
- 나머지는 @ModelAttribute로 판단한다.(argument resolver 로 지정해둔 타입 외)
프로퍼티란?
객체에 getUsername(), setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다. username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고, 조회하면 getUsername() 이 호출된다.
Reference
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1
김영한님의 스프링 MVC 강의를 수강하면서 작성한 글입니다.
틀린 부분 등 다양한 피드백 환영합니다.
Author And Source
이 문제에 관하여(HTTP 요청 파라미터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@hyeming/HTTP-요청-파라미터
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1
김영한님의 스프링 MVC 강의를 수강하면서 작성한 글입니다.
틀린 부분 등 다양한 피드백 환영합니다.
Author And Source
이 문제에 관하여(HTTP 요청 파라미터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyeming/HTTP-요청-파라미터저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)