dev/web

spring @ModelAttribute and @RequestBody

재삐신생 2017. 8. 13. 17:22
반응형

컨트롤러 request mapping시 인자로 객체를 받을 수 있는데


어노테이션이 헷갈린다.


@ModelAttribute는 단순히 요청으로 들어온 parameter와 객체 빈의 멤버변수와 bind한다. 없으면 null

@ModelAttribute 요청으로 들어온 bind된 object를 Model에 Attribute로 추가시켜준다. View에서 사용할 수 있도록

model.addAttribute의 호출을 편하게 도와주는 역활


이부분이 어째서 구글링으로 혼선을 야기했는지는 모르겠다.

필자도 헷갈렸다.ㅠㅠ아직 많이 부족하다.


@RequestBody는 HttpMessageConverter 구현체를 거쳐서 받는다. 특정 객체에 대한 컨버터를 지정해주지 않으면 Unsupported Media Type이라고 나올것이다.

Jackson library 사용시, content type json과 xml을 받을 수 있다.

urlencoded같은 경우도 스프링에서 MultiValueMap으로 바꿔주므로 받을 수 있다.(그냥 Map으로 받으면 못받더라)


주의할 점은 메소드에 @RequestBody를 사용하면 무조건 HttpMessageConverter를 canRead를 호출하는 것으로 보인다. conveter 체인을 통과하지 못하면 역시 Unsupported Media Type을 출력할 것이다.


요청 content-type에 매우 민감하다


정리해보면

application/urlencoded는 @RequestBody MultiValueMap으로 받을 수 있지만 Map으로는 못받음

application/urlencoded는 Object로 받을 수 있다


application/json은 @RequestBody로 받을 수 있다.


이부분이 좀 이상하다.




반응형