컨트롤러 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로 받을 수 있다.
이부분이 좀 이상하다.
'dev > web' 카테고리의 다른 글
[javascript] for ... in VS Object.keys() (0) | 2023.05.09 |
---|---|
[Spring Boot] datasource bean not working (0) | 2017.08.17 |
SpringBoot @RequestBody 그리고 form (0) | 2017.07.09 |
Ajax 크로스 도메인 세션유지 (0) | 2017.03.02 |
웹 기술 동향 - 개인적인 로그 (0) | 2017.03.02 |