Converter spring

tokkaiiii·2025년 5월 4일

spring-mvc

목록 보기
16/27

1. WebMvcConfigurer에 Converter 등록

: addFormatters 메소드 파라미터로 FormatterRegistry 타입을 받는다. 이때, 구현체로 WebConversionService를 받는다.
사용자가 명시적으로 Converter를 등록하면 소스와 타겟 타입이 동일하게 지정된 스프링의 기본 Converter보다 우선적으로 적용

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToUrlConverter());
        registry.addConverter(new StringToUserConditionalConverter());
        registry.addConverterFactory(new StringToEnumConverterFactory());
    }
}

2. AbstractNamedValueMethodArgumentResolver 에서 resolveArgument 메소드 실행

파라미터를 값을 얻는다

 Object arg = this.resolveName(resolvedName.toString(), nestedParameter, webRequest);
// resolveName 메소드 일부
if (arg == null) {
      String[] paramValues = request.getParameterValues(name);
      if (paramValues == null) {
        paramValues = request.getParameterValues(name + "[]");
      }

      if (paramValues != null) {
        arg = paramValues.length == 1 ? paramValues[0] : paramValues;
      }
    }

    return arg;

현재 arg는 String 이지만 타입 변환이 필요하다면 컨버터를 통한 변환이 발생해야 한다

 if (binderFactory != null && (arg != null || !hasDefaultValue)) {
 // 필요하면 타입변환을 하라
        arg = convertIfNecessary(parameter, webRequest, binderFactory, namedValueInfo, arg);
        if (arg == null) {
          if (namedValueInfo.defaultValue != null) {
            arg = this.resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue);
            arg = convertIfNecessary(parameter, webRequest, binderFactory, namedValueInfo, arg);
          } else if (namedValueInfo.required && !nestedParameter.isOptional()) {
            this.handleMissingValueAfterConversion(resolvedName.toString(), nestedParameter, webRequest);
          }
        }
      }
profile
풀스택 자바 개발자입니다

0개의 댓글