Http Message Converter ์ด์ผ๊ธฐ(2)
Http Message Converter ์ด์ผ๊ธฐ(1) ์ ๋ค์ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์ :)
https://mong-dev.tistory.com/41
HTTP Message Converter ์ด์ผ๊ธฐ(1)
๋ทฐ ํ ํ๋ฆฟ์ผ๋ก HTML์ ์์ฑํด์ ์๋ตํ๋ ๊ฒ์ด ์๋๋ผ, HTTP API์ฒ๋ผ JSON ๋ฐ์ดํฐ๋ฅผ HTTP ๋ฉ์์ง ๋ฐ๋์์ ์ง์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๊ฒฝ์ฐ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๋ค. ์คํ๋ง MVC๋ ๋ค์์ ๊ฒฝ์ฐ์
mong-dev.tistory.com
Http ๋ฉ์์ง ์ปจ๋ฒํฐ๋ ์คํ๋ง MVC ์ด๋์ฏค์์ ์ฌ์ฉ๋๋ ๊ฒ์ผ๊น?
์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํด์ผ ํ ๋ถ๋ถ์ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ, ์ฆ @RequestMapping์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ ์ด๋ํฐ์ธ RequestMappingHandlerAdapter(์์ฒญ ๋งคํ ํธ๋ค๋ฌ ์ด๋ํฐ)์ ์๋ค.
ArgumentResolver
์๊ฐํด๋ณด๋ฉด, ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ๋ ๋งค์ฐ ๋ค์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ์ ์์๋ค.
HttpServletRequest , Model ์ ๋ฌผ๋ก ์ด๊ณ , @RequestParam , @ModelAttribute ๊ฐ์ ์ ๋ ธํ ์ด์ ๊ทธ๋ฆฌ๊ณ @RequestBody , HttpEntity ๊ฐ์ HTTP ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ๊น์ง ๋งค์ฐ ํฐ ์ ์ฐํจ์ ๋ณด์ฌ์ฃผ์๋ค.
์ด๋ ๊ฒ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ์ด์ ๊ฐ ๋ฐ๋ก ArgumentResolver ๋๋ถ์ด๋ค.
์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ RequestMappingHandlerAdapter ๋ ๋ฐ๋ก ์ด ArgumentResolver ๋ฅผ ํธ์ถํด์ ์ปจํธ๋กค๋ฌ(ํธ๋ค๋ฌ)๊ฐ ํ์๋ก ํ๋ ๋ค์ํ ํ๋ผ๋ฏธํฐ์ ๊ฐ(๊ฐ์ฒด)์ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ํ๋ฆฌ๋ฏธํฐ์ ๊ฐ์ด ๋ชจ๋ ์ค๋น๋๋ฉด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๋ฉด์ ๊ฐ์ ๋๊ฒจ์ค๋ค.
์คํ๋ง์ 30๊ฐ๊ฐ ๋๋ ArgumentResolver ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
(https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann- arguments)

ArgumentResolver ์ supportsParameter() ๋ฅผ ํธ์ถํด์ ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ํ๋์ง ์ฒดํฌํ๊ณ , ์ง์ํ๋ฉด resolveArgument() ๋ฅผ ํธ์ถํด์ ์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ปจํธ๋กค๋ฌ ํธ์ถ์ ๋์ด๊ฐ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ํ๋ค๋ฉด ์ง์ ์ด ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํด์ ์ํ๋ ArgumentResolver ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
ReturnValueHandler
HandlerMethodReturnValueHandler ๋ฅผ ์ค์ฌ์ ReturnValueHandler ๋ผ ๋ถ๋ฅธ๋ค. ArgumentResolver ์ ๋น์ทํ๋ฐ, ์ด๊ฒ์ ์๋ต ๊ฐ์ ๋ณํํ๊ณ ์ฒ๋ฆฌํ๋ค.
์ปจํธ๋กค๋ฌ์์ String์ผ๋ก ๋ทฐ ์ด๋ฆ์ ๋ฐํํด๋, ๋์ํ๋ ์ด์ ๊ฐ ๋ฐ๋ก ReturnValueHandler ๋๋ถ์ด๋ค.
์คํ๋ง์ 10์ฌ๊ฐ๊ฐ ๋๋ ReturnValueHandler ๋ฅผ ์ง์ํ๋ค.
์) ModelAndView , @ResponseBody , HttpEntity , String
๊ฐ๋ฅํ ์๋ต ๊ฐ ๋ชฉ๋ก์ ๋ค์ ๊ณต์ ๋ฉ๋ด์ผ์์ ํ์ธํ ์ ์๋ค.
(https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann- return-types)
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ ์ด๋์ฏค ์์๊น?
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ๋ @RequestBody ๋ ์ปจํธ๋กค๋ฌ๊ฐ ํ์๋ก ํ๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์ฌ์ฉ๋๋ค. @ResponseBody ์ ๊ฒฝ์ฐ๋ ์ปจํธ๋กค๋ฌ์ ๋ฐํ ๊ฐ์ ์ด์ฉํ๋ค.
์์ฒญ์ ๊ฒฝ์ฐ @RequestBody ๋ฅผ ์ฒ๋ฆฌํ๋ ArgumentResolver ๊ฐ ์๊ณ , HttpEntity ๋ฅผ ์ฒ๋ฆฌํ๋ ArgumentResolver ๊ฐ ์๋ค. ์ด ArgumentResolver ๋ค์ด HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํด์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
์๋ต์ ๊ฒฝ์ฐ @ResponseBody ์ HttpEntity ๋ฅผ ์ฒ๋ฆฌํ๋ ReturnValueHandler ๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ํธ์ถํด์ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค.
์คํ๋ง MVC๋ @RequestBody @ResponseBody ๊ฐ ์์ผ๋ฉด RequestResponseBodyMethodProcessor (ArgumentResolver), HttpEntity ๊ฐ ์์ผ๋ฉด HttpEntityMethodProcessor (ArgumentResolver)๋ฅผ ์ฌ์ฉํ๋ค. (HttpMessageConverter ๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ํ๋ฒ ํ์ธํด๋ณด์.)
ํ์ฅ
์คํ๋ง์ ๋ค์์ ๋ชจ๋ ์ธํฐํ์ด์ค๋ก ์ ๊ณตํ๋ค. ๋ฐ๋ผ์ ํ์ํ๋ฉด ์ธ์ ๋ ์ง ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
HandlerMethodArgumentResolver
HandlerMethodReturnValueHandler
HttpMessageConverter
์คํ๋ง์ด ํ์ํ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ผ์ด ๋ง์ง๋ ์๋ค.
๊ธฐ๋ฅ ํ์ฅ์ WebMvcConfigurer ๋ฅผ ์์ ๋ฐ์์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ฉด ๋๋ค.
์ค์ ์์ฃผ ์ฌ์ฉํ์ง๋ ์์ผ๋ ์ค์ ๊ธฐ๋ฅ ํ์ฅ์ด ํ์ํ ๋ WebMvcConfigurer ๋ฅผ ๊ฒ์ํด๋ณด์.
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
{ //...}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters)
{ //... }
};
}