๐ Spring MVC์ ArgumentResolver๋?
ArgumentResolver๋ Spring MVC์์ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ํด์ํ๊ณ ๋ฐ์ธ๋ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค์
๋๋ค. Spring MVC์ ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ์์ HandlerMethodArgumentResolver
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ํน์ ํ ํ์
์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
ArgumentResolver๋?
- ์ญํ :
- HTTP ์์ฒญ์ ๋ฐ์ดํฐ (์: ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, URL ๊ฒฝ๋ก ๋ณ์, ํค๋, ์์ฒญ ๋ณธ๋ฌธ ๋ฑ)๋ฅผ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๋ณํ.
- ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ๋ํ ๋ง์ถคํ ๋ก์ง ์ ์ฉ.
- ์ฃผ์ ์ธํฐํ์ด์ค:
HandlerMethodArgumentResolver
์ธํฐํ์ด์ค:supportsParameter(MethodParameter parameter)
: ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํ.resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)
: ์ค์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฑํ๊ณ ๋ฐํ.
Spring MVC์์์ ํ๋ฆ
- HTTP ์์ฒญ ์์ : ์ฌ์ฉ์๊ฐ HTTP ์์ฒญ์ ๋ณด๋ (์: GET, POST ๋ฑ).
- HandlerMapping: ์์ฒญ URI์ ์ผ์นํ๋ ์ปจํธ๋กค๋ฌ ๋ฐ ๋ฉ์๋๋ฅผ ์ฐพ์.
- HandlerAdapter: ํด๋น ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ์คํํ ์ ์๋๋ก ์ค๋น. ์ด ๊ณผ์ ์์ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค๋นํ๊ธฐ ์ํด ArgumentResolver๊ฐ ์ฌ์ฉ๋จ.
- ArgumentResolver ํธ์ถ:
- ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฌ.
- ๊ฐ ํ๋ผ๋ฏธํฐ์ ๋ํด ์ ์ ํ
HandlerMethodArgumentResolver
๋ฅผ ์ ํ. - ์ ํ๋ Resolver๊ฐ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฑ.
- ์ปจํธ๋กค๋ฌ ๋ฉ์๋ ์คํ: ์ค๋น๋ ํ๋ผ๋ฏธํฐ์ ํจ๊ป ๋ฉ์๋๊ฐ ์คํ๋๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ.
๊ธฐ๋ณธ ์ ๊ณต Resolver ์์
Spring์ ๋ค์๊ณผ ๊ฐ์ ArgumentResolver๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค:
RequestParamMethodArgumentResolver
:@RequestParam
์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ.PathVariableMethodArgumentResolver
:@PathVariable
์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ.ModelAttributeMethodProcessor
:@ModelAttribute
๊ฐ ๋ถ์ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌ.RequestBodyMethodArgumentResolver
:@RequestBody
์ด๋ ธํ ์ด์ ์ด ๋ถ์ ์์ฒญ ๋ณธ๋ฌธ ์ฒ๋ฆฌ.HttpEntityMethodProcessor
:HttpEntity
๋๋RequestEntity
ํ์ ์ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ.
์ฌ์ฉ์ ์ ์ ArgumentResolver
์ฌ์ฉ์ ์ ์ ArgumentResolver๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์งํํฉ๋๋ค:
@Component
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ
return parameter.getParameterType().equals(MyCustomType.class);
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
// ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก MyCustomType ์ธ์คํด์ค ์์ฑ
return new MyCustomType(webRequest.getParameter("customParam"));
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new CustomArgumentResolver());
}
}
Spring MVC ํ๋ฆ์์ ArgumentResolver์ ์์น
ArgumentResolver๋ Spring MVC์ ์์ฒญ ์ฒ๋ฆฌ ๋จ๊ณ์์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋ ํธ์ถ ์ ์ ์ฌ์ฉ๋๋ฉฐ, HTTP ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ ํ ๋ณํํฉ๋๋ค.
์ด ๋ฉ์ปค๋์ฆ ๋๋ถ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค๋ฌ์์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๊ธ