Java/SpringBoot
ArgumentResolver 사용하기
고기고기물고기
2025. 5. 8. 06:49
✅ Spring이 기본으로 제공하는 Resolver 예시
RequestParamMethodArgumentResolver | @RequestParam |
PathVariableMethodArgumentResolver | @PathVariable |
RequestBodyMethodArgumentResolver | @RequestBody |
ModelAttributeMethodProcessor | @ModelAttribute, 폼 데이터 |
ServletRequestMethodArgumentResolver | HttpServletRequest, HttpSession 등 |
- 컨트롤러에서 쿼리 스트링을 변수에 바인딩하려면 @RequestParam 을, 가변적인 경로를 변수에 바인딩하려면 @PathVariable 을, HTTP Body를 변수에 바인딩하려면 @RequestBody 를 사용
🌱 Spring MVC의 동작 흐름 속에서 ArgumentResolver의 위치
- 사용자가 /example?name=hana와 같은 요청을 보냅니다.
- DispatcherServlet이 요청을 받고, 적절한 컨트롤러 메서드를 찾습니다.
- 컨트롤러 메서드를 실행하기 위해, 파라미터들을 처리합니다.
- 이때, 각 파라미터마다 적절한 HandlerMethodArgumentResolver를 찾아서 실행합니다.
- Resolver가 적절한 데이터를 반환하면, 그 값을 컨트롤러 메서드의 파라미터로 넣습니다.
- 메서드 실행 후 리턴 값은 ViewResolver 등을 거쳐 사용자에게 응답됩니다.
🛠️ 커스텀 ArgumentResolver 만들기
장점
중복 제거 | 공통 로직을 한 곳에 모을 수 있음 |
가독성 향상 | 컨트롤러가 간결해짐 |
관심사 분리 (SoC) | 요청 파라미터 처리 로직 분리 가능 |
테스트 편의성 | 모듈별로 테스트 가능 |
코드 일관성 유지 | 팀 전체 코드 스타일 유지 |
사용 전 Contoller
@GetMapping("/mypage")
public String myPage(HttpServletRequest request) {
User user = (User) request.getSession().getAttribute("user");
return "Hello, " + user.getName();
}
사용 후 Contoller
@GetMapping("/mypage")
public String myPage(@LoginUser User user) {
return "Hello, " + user.getName();
}
🛠️ 커스텀 ArgumentResolver 예제
1. 애너테이션 정의
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
2. Resolver 구현
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(LoginUser.class) != null;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
return request.getSession().getAttribute("user");
}
}
3. 등록 (Spring에 알려주기)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new LoginUserArgumentResolver());
}
}
4. 사용
@GetMapping("/mypage")
public String myPage(@LoginUser User user) {
return "Hello, " + user.getName();
}
🎯 정리
- HandlerMethodArgumentResolver는 컨트롤러 메서드 파라미터에 값을 넣어주는 자동 주입기입니다.
- Spring은 기본적으로 여러 Resolver를 제공합니다.
- 직접 만들면 원하는 방식대로 값을 파라미터에 주입할 수 있습니다.
- supportsParameter()와 resolveArgument() 두 메서드를 잘 이해하면 됩니다.