이 포스팅은 토비의 스프링 3.1을 읽고 일부분을 요약정리한 글입니다.
스프링 컨트롤러에서 받아서 사용할 수 있는 파라미터를 알아보자.
@RequestMapping("/user/view/{id}")
public String view(@PathVariable("id") int id) { ... }
@RequestMapping("/member/{memberCode}/order/{orderId}")
public String lookup(@PathVariable("memberCode") String code,
@PathVariable("orderId") int orderId) { ... }
public void view(@RequestParam("id") int id) { ... }
public void view(@RequestParam("id") int id,
@RequestParam("name") String name,
@RequestParam("file") MultipartFile file) { ... }
Map<String, String>
타입으로 선언하면 모든 요청 파라미터를 담은 맵으로 받을 수 있다. 파라미터의 이름은 맵의 키에, 파라미터 값은 맵의 값에 담겨 전달된다.public void add(@RequestParam Map<String, String> params) { ... }
@RequestParam
을 사용했다면 해당 파라미터가 반드시 있어야만 한다. 없다면 400 - Bad Request
를 받게 될 것이다. 파라미터를 선택적으로 제공하게 하려면 required
엘리먼트를 false
로 설정해주면 된다. 요청 파라미터가 존재하지 않을 때 사용할 디폴트 값도 지정할 수 있다.public void view(@RequestParam(value="id", required=false, defaultValue-"-1" int id) { ... }
value
를 생략할 수 있다.public void view(@RequestParam int id) { ... }
@RequestParam
을 아예 생략할 수도 있다. 하지만 파라미터의 개수가 많고 종류가 다양하면 코드를 이해하는 데 불편할 수도 있다. 단순한 메소드가 아니라면 명시적으로 @RequestParam
을 부여해주는 것을 권장한다.public String check(@CookieValue("auth") String auth) { ... }
required
엘리먼트를 false
로 선언해줘야 한다. 또한 defaultValue
로 디폴트 값을 선언할 수도 있다.required
와 defaultValue
를 이용할 수 있다.public void header(@RequestHeader("Host") String host,
@RequestHeader("Keep-Alive") long keepAlive) { ... }
Model
과 ModelMap
은 모두 addAttribute()
메소드를 제공해준다.put()
처럼 이름을 지정해서 오브젝트 값을 넣을 수 있다.model.addAttribute(user)
는 model.addAttribute("user", user)
와 동일하다.ModelMap
과 Model
의 addAllAttribute()
메소드를 사용하면 Collection에 담긴 모든 오브젝트를 자동 이름 생성 방식을 적용해서 모두 모델로 추가해준다.@RequestMapping("/user/search")
public String serarch(@RequestParam int id,
@RequestParam String name,
@RequestParam int level,
@RequestParam String email) { ... }
public class UserSearch {
int id;
String name;
int level;
String email;
// 수정자, 접근자 생략
}
@RequestMapping("/user/search")
public String serarch(@ModelAttribute UserSearch userSearch) { ... }
@ModelAttribute
와 @RequestParam
이 생략된 파라미터를 보고 String, int
와 같은 단순타입이면 @RequestParam
으로 간주하고, 그 외의 복잡한 오브젝트는 모두 @ModelAttribute
로 간주한다.@ModelAttribute
애노테이션을 사용하면 뷰에서 필요하다고 해서 코드에서 추가해줄 필요가 없다.@RequestMapping(value="add", method=RequestMethod.Post)
public String add(@ModelAttribute User user, BindingResult bindingResult) { ... }
BindingResult
대신 Errors
타입으로 선언할 수 있다.@ModelAttribute
파라미터 뒤에 나와야 한다. 자신의 바로 앞에 있는 @ModelAttribute
파라미터의 검증 작업에서 발생한 오류만을 전달해주기 때문이다.@ResponseBody
와 함께 사용된다.@Value
애노테이션도 컨트롤러 메소드 파라미터에 부여할 수 있다.@ModelAttribute
와 함께 사용된다.