RequestParamController 참고하면서 공부하기!📌 스프링을 통해 깔끔하고 효율적으로 요청 데이터를 전달하는 방법을 알아보자!
// 반환 타입이 없으면서 이렇게 응답에 값을 직접 넣으면 view 조회 X
// http://localhost:9090/request-param-v1?username=hello&age=10
// @RequestMapping : get, post 방식 상관 없이 사용하겠다는 의미
@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"));
System.out.println("username : " + username);
System.out.println("age : " + age);
response.getWriter().write("ok");
}
- 스프링이 제공하는
@RequestParam을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다.
/*
* @ResponseBody
* - view 조회를 무시하고 Http message body에 직접 해당 내용 입력
* @RequestParam
* - 파라미터 이르으로 바인딩
* - @RequestParam("username")
* = request.getParameter("username")
*/
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2( @RequestParam("username") String memberName, @RequestParam("age") int memberAge ) {
// 보통 이름을 통일하지만 맵핑이 어디에 되는지 확인하기 위해 구분해준 것! 실무에서는 모두 통일시킴
System.out.println("username : " + memberName);
System.out.println("age : " + memberAge);
return "ok2";
}
/*
* @RequestParam
* - HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="...") 생략 가능
*/
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3( @RequestParam String username, @RequestParam int age ) {
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok3";
}
/*
* @RequestParam
* - String, int 등의 단순 타입이면 @RequestParam 생략 가능
(파라미터에 대한 인지가 떨어질 수 있기 때문에 권장하는 방법은 아니다)
* <주의사항>
* - @RequestParam 어노테이션을 생략하면 스프링 MVC 내부에서 required=false를 적용한다.
* - @RequestParam이 있으면 명확하게 요청 파라미터에서 데이터를 읽는다는 것을 알 수 있다.
*/
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4( String username, int age ) {
System.out.println("username : " + username);
System.out.println("age : " + age);
return "ok4";
}
/*
* required = true 이면 반드시 파라미터 값이 들어와야 한다.
*/
// http://localhost:9090/request-param-required?username=admin
// → age의 값에 'null'을 넣는데 int 타입에는 null을 받아올 수가 없다.
// int 타입에 'required = false'를 쓸 경우에는 Integer 타입으로 넣어주기!
/*
* 1) /request-param-required : username이 없으므로 Exception 발생
* 2) /request-param-required?username= : 빈 문자열로 통과
* 3) /request-param-required?username=admin : int age에서 Exception 발생
(null을 int에 입력하는 것은 불가능하기 때문에 Integer로 변경해야 함)
* 또는, defaultValue를 사용하면 된다.
*/
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired( @RequestParam(required = true) String username, @RequestParam(required = false) Integer age ) {
System.out.println("username : " + username);
System.out.println("age : " + age);
return "required";
}
/*
* defaultValue
* - defaultValue는 빈 문자열의 경우에도 적용
* - 이미 기본값이 있기 때문에 required는 의미가 없다.
*/
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault( @RequestParam(required = true, defaultValue = "guest") String username, @RequestParam(required = false, defaultValue = "-1") int age ) {
System.out.println("username : " + username);
System.out.println("age : " + age);
return "default";
}
/*
* 파라미터를 Map으로 조회
* - Map<key, value>
*/
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap( @RequestParam Map<String, Object> paramMap ) {
System.out.println("username : " + paramMap.get("username"));
System.out.println("age : " + paramMap.get("age"));
return "map";
}
// DTO로 받아오기
// 사용 전
@ResponseBody
@RequestMapping("/request-attribute-v1")
public String requestAttributeV1( @RequestParam String username, @RequestParam int age ) {
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
System.out.println("username : " + helloData.getUsername());
System.out.println("age : " + helloData.getAge())
;
return "attr1";
}
// 사용 후
/*
* @ModelAttribute
* - model.addAttribute(helloData) 코드도 함께 자동 적용됨.
* - 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.
* - 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
*/
@ResponseBody
@RequestMapping("/request-attribute-v2")
public String requestAttributeV2(@ModelAttribute HelloData helloData) {
System.out.println("username : " + helloData.getUsername());
System.out.println("age : " + helloData.getAge());
System.out.println("helloData : " + helloData.toString());
return "attr2";
}
/*
* @ModelAttribute의 생략 가능
* - String, int 같은 단순 타입 = @RequestParam 생략
* - 객체로 파라미터가 넘어왔을 때 생략 = @ModelAttribute 생략
*/
@ResponseBody
@RequestMapping("/request-attribute-v3")
public String requestAttributeV3(HelloData helloData) {
System.out.println("username : " + helloData.getUsername());
System.out.println("age : " + helloData.getAge());
System.out.println("helloData : " + helloData.toString());
return "attr3";
}