천천히 알아보는 코딩공부

ArgumentResolver 사용하기 본문

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의 위치

  1. 사용자가 /example?name=hana와 같은 요청을 보냅니다.
  2. DispatcherServlet이 요청을 받고, 적절한 컨트롤러 메서드를 찾습니다.
  3. 컨트롤러 메서드를 실행하기 위해, 파라미터들을 처리합니다.
  4. 이때, 각 파라미터마다 적절한 HandlerMethodArgumentResolver를 찾아서 실행합니다.
  5. Resolver가 적절한 데이터를 반환하면, 그 값을 컨트롤러 메서드의 파라미터로 넣습니다.
  6. 메서드 실행 후 리턴 값은 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() 두 메서드를 잘 이해하면 됩니다.
Comments