Controller에서 parameter를 받는 방법에는 여러가지가 있는데, 좀 더 확실하게 알고 쓰면 개발하는데에 도움이 될 것 같아 찾아보고 정리하게 되었다.

내가 주로 사용하는 방법은 @RequestParam, @RequestBody, @ModelAttribute 이렇게 세가지 정도가 있었다.

@RequestParam 사용

GET 요청일 때 사용한다.

url?idx=1 에서 url 뒤에 붙는 idx 파라미터를 통해 Controller에서 idx=1이라는 값을 받게 된다.

controller에서는 아래처럼 @RequestParam을 사용해서 값을 한개 씩 받아 올 수 있다.

개별적으로 받는 경우

1
2
3
private String test (@RequestParam("idx") int idx) {
//이런 식으로 가져와서 idx 값으로 1을 controller로 넘겨 줄 수 있다.
}

파라미터를 일일이 지정하지 않고 Map으로 담아서 간단하게 받아올 수 있다.

Map으로 받는 경우

1
2
3
4
5
6
7
private String test (@RequestParam Map<String, String> params) {
//이렇게 Map에 담아서 한번에 받아 올 수 있다.
//params로 받아온 값을 꺼내서 사용할 때는 아래처럼 사용한다.
String data = params.get("idx");
//예를 들어 Map안에 ("idx","1") 이렇게 담겨있다면
//data에는 "1"이라는 값이 들어가게 된다.
}

@RequestBody 사용

POST 요청일 때 사용한다.

Http요청 Body를 Java 객체로 전달해준다. 그러므로 Body가 존재하지 않는 GET 방식의 메소드에 @RequestBody를 사용하는 것은 적합하지 않고 POST요청일때 사용되어야한다.

특히 @ResponseBody와 함께 Json형식의 데이터들을 주고 받으며 Ajax통신을 할 때 주로 사용된다.

RequestBody를 이용해 받는 경우

1
2
3
4
5
6
@ResponseBody
public HashMap<String, Object> test (@RequestBody Map<String, String> params) {
// RequestBody로 받아온 값 저장
String id = params.get("id");
String id = params.get("pwd");
}

@RequestBody 와 @ResponseBody

  • @RequestBody : Http요청의 body 내용을 자바 객체로 매핑하는 역할
  • @ResponseBody : 자바 객체를 Http요청의 body 내용으로 매핑하는 역할

@ModelAttribute 사용

클라이언트가 전송하는 여러 파라미터들을 1대1로 객체에 바인딩하고 다시 View로 넘겨서 출력해준다. 객체를 바인딩 하기 때문에 JSP에서 Form 태그를 통해 전달 받은 파라미터들을 객체로 바인딩 시키는 경우에 사용할 수 있다.

내가 이해한 @ModelAttribute는 @ModelAttribute를 사용하려면 객체가 있어야하고, gettersetter가 있어야 한다. 만약 전달 받고 싶은 데이터가 추가가 된다면 객체(DTO)에 추가가 되어야하고, getter / setter 또한 추가가 되어야한다.

ModelAttribute로 받는 경우

1
2
3
4
5
public String list (@ModelAttribute("searchDTO") SearchDto searchDTO) {
//이렇게 @ModelAttribute를 사용하려면 SearchDto라는 객체가 있어야 한다.
//그리고 아래 처럼 받아온 객체를 바로 전달해 사용할 수 있다.
searchService.searchList(searchDTO);
}

@ModelAttribute와 @RequestParam의 차이점

@ModelAttribute는 객체를 바인딩하고, @RequestParam은 단일요청 매개변수를 바인딩한다.

참고 사이트

@RequestBody와 @ResponseBody 개념
SpringMVC :: @RequestParam 을 이용한 값 받아오기
[Spring] @RequestBody, @ModelAttribute, @RequestParam의 차이