inblog logo
|
LifeLog, DevLog
    Spring

    ArgumentResolver

    컨트롤러 내 메서드 파라미터 리졸버 커스텀
    KYJTHEYJ's avatar
    KYJTHEYJ
    Jan 06, 2026
    ArgumentResolver
    Contents
    ArgumentResolver구현하기커스텀 어노테이션 만들기ArgumentResolver 구현WebConfig 등록요약

    ArgumentResolver

    컨트롤러의 메서드 파라미터에 들어오는 데이터를 자동으로 처리하고 바인딩하는 도구

    @RequestBody, Param, PathVariable 등의 어노테이션을 적기만 하면
    알아서 바인딩 해주는데, 이때 리졸버에게 값의 생성을 위임함

    구현하기

    💡

    왜 구현하는 방법을 알아야하는가?

    인증/인가를 위해 토큰에서 정보를 추출할 때
    공통 파라미터의 처리, 도메인 객체 변환에 커스텀된 무언가를 할 때

    매번 토큰 정보 추출 하는 로직을 추가한다면 → 유지보수가 힘들어질 것
    공통 파라미터도 매번 추가하는 로직을 추가하면 → 코드의 결합도 높아짐
    커스텀된 무언가가 필요할 때 → 회사의 보안 지침이나 로직 준수를 위해
    구현하는 방법을 알아야 한다

    가장 많이 쓰이는 것이 알아보니
    인증/인가를 위한 JWT 토큰을 사용자 객체로 바꿀 때 필요한 것 같다

    그냥 얼버무려 알 기에는 한 눈에 파악하기 어려우니 몇가지 절차를 알아가보자

    커스텀 어노테이션 만들기

    @Target(ElementType.PARAMETER)  // 파라미터에만 사용
    @Retention(RetentionPolicy.RUNTIME)  // 런타임까지 유지
    public @interface CurrentTime { // 생성
    
    }
    
    // @Target -> 이 어노테이션은 어디에 붙일 수 있는지?
    // @Retention -> 언제까지 이 어노테이션을 유지할지
    // @interface 와 묶어 사용됨

    ArgumentResolver 구현

    @Component
    public class CurrentTimeArgumentResolver implements HandlerMethodArgumentResolver {
        
        /**
         * 1단계: 이 Resolver를 언제 사용할지 판단
         * @CurrentTime 어노테이션이 있고, LocalDateTime 타입이면 true
         */
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            // 파라미터에 @CurrentTime 어노테이션이 있는지 확인
            boolean hasAnnotation = parameter.hasParameterAnnotation(CurrentTime.class);
            
            // 파라미터 타입이 LocalDateTime인지 확인
            boolean isLocalDateTimeType = LocalDateTime.class.equals(parameter.getParameterType());
            
            // 둘 다 true여야 이 Resolver 사용
            return hasAnnotation && isLocalDateTimeType;
        }
        
        /**
         * 2단계: 실제로 파라미터에 전달할 값 생성
         */
        @Override
        public Object resolveArgument(
                MethodParameter parameter,
                ModelAndViewContainer mavContainer,
                NativeWebRequest webRequest,
                WebDataBinderFactory binderFactory) throws Exception {
            
            // 현재 시간 반환
            return LocalDateTime.now();
        }
    }
    • supportsParameter → 이 파라미터를 처리할 것의 여부 → 반환 여부 서술

    • resolveArgument → 그럼 뭘 반환할 것인지? → 실제 객체 서술

    WebConfig 등록

    package com.example.demo.config;
    
    import com.example.demo.resolver.CurrentTimeArgumentResolver;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    import java.util.List;
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        
        private final CurrentTimeArgumentResolver currentTimeArgumentResolver;
        
        // 생성자 주입
        public WebConfig(CurrentTimeArgumentResolver currentTimeArgumentResolver) {
            this.currentTimeArgumentResolver = currentTimeArgumentResolver;
        }
        
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
            resolvers.add(currentTimeArgumentResolver);
        }
    }

    요약

    커스텀 어노테이션 생성
    (@Target, @Retention, @interface 사용)

    → ArgumentResolver 를 구현한다
    (HandlerMethodArgumentResolver implements)
    (supportsParameter → 이 파라미터의 처리 여부 서술)
    (resolveArgument → 뭘 반환할지 서술)

    → WebConfig 등록
    (WebMvcConfiguerer implements)
    (addArgumentResolvers 의 resolvers에 add)

    Share article
    Contents
    ArgumentResolver구현하기커스텀 어노테이션 만들기ArgumentResolver 구현WebConfig 등록요약

    LifeLog, DevLog - https://github.com/KYJTHEYJ

    RSS·Powered by Inblog