ConverterFactory를 통한 일괄 변환

July 21, 2022

ConverterFactory

스프링에서는 Converter 인터페이스를 통해서 아래와 같이 데이터 타입을 자동으로 변환하여 바인딩할 수 있다.

public enum SttEngine {
  GOOGLE,
  AWS,
  CLOVA,
  KAKAO
}
@Component
public class SttEngineConverter implements Converter<String, SttEngine> {
  @Override
  public SttEngine convert(String source) {
      return SttEngine.valueOf(source.toUpperCase());
  }
}

위 방식으로 구현했을 때 한 가지 문제점은 enumConverter가 1:1 관계이며 일일히 Converter를 만들어서 등록해줘야 한다는 것이다. 이 때 인터페이스를 하나 생성하고 이를 컨버팅할 수 있는 ConverterFactory를 만들어서 일괄 처리할 수 있다.

public interface Convertible {
  String label();
}
public enum SttEngine implements Convertible {
  GOOGLE("google"),
  AWS("aws"),
  CLOVA("clova"),
  KAKAO("kakao");

  private final String label;

  SttEngine(String label) {
    this.label = label;
  }

  public String label() {
    return label;
  }
}
public class TypeConverterFactory implements ConverterFactory<String, Convertible> {
  @Override
  public <T extends Convertible> @NotNull Converter<String, T> getConverter(@NotNull Class<T> targetType) {
    return (source -> Arrays.stream(targetType.getEnumConstants())
      .filter(t -> source.equalsIgnoreCase(t.label()))
      .findAny()
      .orElseThrow(IllegalArgumentException::new));
  }
}

참고


songmk 🙁