[Spring] Argument Resolver๋ฅผ ์ด์ฉํ ์ ์ฐ์ฑ ์๋ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ
์๋น์ค๋ฅผ ์ด์ํ๋ค๋ณด๋ฉด ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ด ๋๋ง๋ค Controller ๋ถ๋ถ์์ ์ด๋ฅผ ์ ์ฒ๋ฆฌํ๊ฒ ๋๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด ๊ฐ Controller์ ์ ์ฒ๋ฆฌ ํด์ผ ํ๋ ์ฝ๋๋ฅผ ํจ์ํ ํ๊ฑฐ๋ Utils ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ ์์กด์ฑ ์ฃผ์ ํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๊ทธ๋๋ง ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ Utils๋ฅผ ์ฌ์ฉํด๋ ๋งค๋ฒ ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ ๋ถํธํจ์ด ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ์ค๋ณต๋๊ณ , ์ด๊ฒ์ด ์ปค์ง๋ฉด ์ญ์ ์ฝ๋๊ฐ ๋์กํด์ง๊ฒ ๋ฉ๋๋ค.
Spring์์๋ ์ด๋ฌํ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ตฌํ๋ ์ธํฐํ์ด์ค๊ฐ ์๋๋ฐ, ๊ทธ๊ฒ์ด ๋ฐ๋ก Argument Resolver์ ๋๋ค.
Spring Argument Resolver
API ์๋ํฌ์ธํธ๋ก๋ถํฐ ๋ค์ด์จ ๋ฐ์ดํฐ(ํ๋ผ๋ฏธํฐ)๋ฅผ ๊ฐ๊ณตํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฝ๋ ๋ฑ์ ๋ก์ง์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ Spring Argument Resolver๋ HandlerMethodArgumentResolver๋ฅผ ์์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ ์๋ก์ด Resolver๋ฅผ ๋ง๋ค๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์คํ์, Resolver ๋ฆฌ์คํธ์ ์ถ๊ฐํจ์ผ๋ก์จ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด Resolver๋ ์ด๋ป๊ฒ ๋์ํ๋ ๊ฒ์ผ๊น์?
Spring MVC๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
- ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์์ฒญํ๋ฉด DispatcherServlet์ด ์ด๋ฅผ ๋ฐ์
- DispatcherServlet์ ํด๋น ์์ฒญ์ ๋ง๋ URI๋ฅผ HandlerMapping์์ ๊ฒ์
- ์ด ๋, RequestMapping์ผ๋ก ๊ตฌํํ API๋ฅผ ์ฐพ๊ฒ ๋๋๋ฐ, ์ด๋ค์ RequestMappingHandlerAdapter๊ฐ ๋ชจ๋ ๊ฐ์ง๊ณ ์์.
- ์ํ๋ Mapping์ ์ฐพ์ ๊ฒฝ์ฐ, ์ฒซ ๋ฒ์งธ๋ก Intercepter๋ฅผ ์ฒ๋ฆฌ
- Argument Resolver ์ฒ๋ฆฌ
- Message Converter ์ฒ๋ฆฌ
- Controller Method Invoke
๋ณดํต ์ ๋ Filter์ Intercepter๋ฅผ API ์์ฒญ ์ค๊ฐ์ ๋ง์ด ์ฌ์ฉํ๋ ํธ์ ๋๋ค. ํนํ ๊ถํ์ ์๊ตฌํ๊ฑฐ๋, ์ธ์ฆ์ด ํ์ํ ๊ตฌ๊ฐ์์๋ Filter๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด ๋ Filter๋ DispatcherServlet ์์ฒญ์ด ์๊ธฐ ์ ์ ํธ์ถ๋๊ณ (Servlet์ ๋ผ์ดํ ์ฌ์ดํด ์ฐธ๊ณ ) Intercepter์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ API๋ฅผ ์ฐพ์ ๋ค์ ํธ์ถ์ด ๋๊ธฐ ๋๋ฌธ์ ๊ฐ ๊ตฌํ์ฒด๋ค์ด ์ด๋ป๊ฒ ํธ์ถ๋๋์ง ์๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๊ณ ์ ํ๋ Argument Resolver๋ Intercepter ์์ฒญ ๋ค์ ์ด๋ฃจ์ด์ง๋๋ค. ์ฌ์ค ์ด ๋ถ๋ถ์ ํ์ธํด๋ณด๋ฉด, ๊ตณ์ด Argument Resolver๋ฅผ ์ฌ์ฉํ์ง ์์๋ Intercepter๋ฅผ ๋ณ๋๋ก ๊ตฌํํด ์ฒ๋ฆฌํด๋ ํฐ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ค์ํ ์๊ตฌ ์ฌํญ์ด ์กด์ฌํ๋ค๋ฉด ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ Resolver๋ฅผ ์ฌ์ฉํ์ ๋ ๊ฐ ๋ก์ง์ ์ํ๋ ๊ตฌ๊ฐ ๋ณ๋ก ๋๋ ์ ์๋ค๋ ๊ฒ์ ๋ฉ๋ฆฌํธ๊ฐ ์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค๋ ์๊ฐ์ด๋๋ค์.
How to use
๊ทธ๋ ๋ค๋ฉด ์ค์ Spring Framework์์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ์์๋ก ์ด๋ค ๋ฌธ์์ด์ ๊ฐ์ ์ฃผ์ด๋ ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์ ๋ณด๋ฅผ ํ๋ฉด์ ๋์ฐ๋ API๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ ํ๋ผ๋ฏธํฐ ๊ตฌ๋ถ์ ์ํ ์ด๋ ธํ ์ด์ ์ ํ ๊ฐ ๋ง๋ค์ด์ค๋๋ค. ์ด ์ด๋ ธํ ์ด์ ์ API ์๋ํฌ์ธํธ์์ ํน์ ๋ฐ์ดํฐ์์ ๊ฐ๋ฆฌํค๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
API๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๋ ๋ฌธ์์ด์ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋๋ก ํฉ๋๋ค.
์ด์ ํน์ ์๊ท๋จผํธ ํ์ ์ ๋ํ Resolver๋ฅผ ์์ฑํด์ค๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ํด ์์์ ์ด๋ ธํ ์ด์ ์ ๋ง๋ค์์ผ๋ฏ๋ก HandlerMethodArgumentResolver๋ฅผ ์์๋ฐ์ ํ supportParameter ์ฝ๋ฐฑ ํจ์์์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ด๋ ธํ ์ด์ ์ธ์ง๋ฅผ ๋ฐํํ๋๋ก ํจ์๋ฅผ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก resolveArgument ํจ์์์ ํด๋น ํ๋ผ๋ฏธํฐ๊ฐ ์ด๋ป๊ฒ ๋ฐํ๋๋์ง๋ฅผ ๊ตฌํํด์ฃผ๋ฉด ๋์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ค ๋ฐ์ดํฐ ๊ฐ์ด ๋ค์ด์๋ ๋ธ๋ผ์ฐ์ ์ ๋ณด๋ง์ ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ Request ํ๋ผ๋ฏธํฐ์์ getHeader๋ฅผ ์ด์ฉํด ํค๋ ๊ฐ์ ๋ฐํํ๋๋ก ํฉ๋๋ค.
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์์ ์ ์ํ Resolver๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ์ธ ํด๋์ค์ WebMvcConfigurationSupport ํด๋์ค๋ฅผ ์์ํ๊ณ , addArgumentResolver ํจ์๋ฅผ ์ฌ์ ์ํ์ฌ ํด๋น ํ๋ผ๋ฏธํฐ์ ์๋ argumentResolver ๋ฆฌ์คํธ์ ์์์ ๋ง๋ Resolver๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
Test
์ด์ ๋ธ๋ผ์ฐ์ ์์ API๋ฅผ ํธ์ถํ๋ฉด ์์ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ์ ์ ๋ณด๊ฐ ๋ํ๋จ์ ์ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
๊ธ์ฐ๊ธฐ ์ ๋ถํฐ ์ด๋ค ์์๋ฅผ ํ์ฉํ ๊น๋ฅผ ๋ง์ด ๊ณ ๋ฏผํด๋ดค์ง๋ง ์ฝ๊ฒ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ํด๋ณผ๋งํ ์์ ๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒ ์์ฌ์ ๋ ํฌ์คํธ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ค์ ๋ก ArgumentResolver๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ๋, ๋น์ด ํ์ํ ๋ฐ์ดํฐ๋ง์ ์๋ฒ์ ์ฃผ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค๋ง ๊ทธ๋ ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ํ ๊ฐ์ง๊ฐ ์๋๋ฐ, ๊ทธ ๋ถ๋ถ ์ค์ ํ๋๋ ๋ฐ๋ก ์ํธํ ๋ ๋ฐ์ดํฐ์ ๋๋ค.
๋ง์ฝ, ํด๋ผ์ด์ธํธ์์ ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๋จผ์ ์ด๋ฅผ ๋ณตํธํ ํด์ผํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ View ๋จ์์ ์ด๋ฅผ ๋ณตํธํ ํ๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์ ๋ ธ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ณ , ๊ทธ๋ ๊ฒ ๋๋ฉด ์๋ฒ์ ์ทจ์ฝ์ ์ด ์๊ธฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฅผ ๋ณตํธํํ๋ ๊ณผ์ ์ ์๋ฒ์์ ํ๋ ๊ฒ์ด ์ข๊ฒ ์ฃ .
๋ง์ฝ ๊ฐ API๋ง๋ค ์ด๋ฐ ์์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ฉด, ๋ณธ๋ Controller๋ง๋ค ๋ณตํธํ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ๋ฃ์ด์ผ ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ์ฌ๊ฐํ๊ฒ ์ง์ ๋ถํด์ง๊ณ , ์ค๋ณต ์ฝ๋๊ฐ ๋ง์์ง๋ฉด์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์์ฐ์ค๋ ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ฒ๋ฆฌ๋ฅผ ์ ์ฐํ๊ธฐ ์ํด Argument Resolver๊ฐ ์กด์ฌํ๋ฉฐ ์ด๋ฅผ ์ ํ์ฉํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.