Spring ‐ 스프링 타입 컨버터 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 스프링 타입 컨버터

스크린샷 2025-01-29 오후 7 48 28

[ Converter 예시 코드 작성 ]

@Slf4j
public class IntegerToStringConverter implements Converter<Integer, String> {

	@Override
	public String convert(Integer source) {
		return String.valueOf(source);
	}
}
@Slf4j
public class StringToIntegerConverter implements Converter<String, Integer> {

	@Override
	public Integer convert(String source) {
		return Integer.valueOf(source);
	}
}

Spring - Type Conversion

  • A → B, B → A 타입으로 변환하는 컨버터들을 직접 개발하면 매우 불편하다.
  • 이를 위해 스프링은 ConversionService를 제공한다. ConversionService는 컨버터를 모아두고 묶어서 편리하게 사용할 수 있는 기능을 제공한다.

📚 ConversionService

스크린샷 2025-01-29 오후 8 05 49

// 등록 -> 추가적으로 여러 컨버터들 등록 가능
DefaultConversionService conversionService = new DefaultConversionService();
conversionService.addConverter(new IntegerToStringConverter());
conversionService.addConverter(new IpPortToStringConverter());

//사용
IpPort ipPort = conversionService.convert("127.0.0.1:8080", IpPort.class);
assertThat(ipPort).isEqualTo(new IpPort("127.0.0.1", 8080));

String ipPortString = conversionService.convert(new IpPort("127.0.0.1", 8080), String.class);
assertThat(ipPortString).isEqualTo("127.0.0.1:8080");
  • 위와 같이 등록해도 실제로 스프링에 등록되지 않는다.
  • 스프링에 등록하기 위해서는 WebMvcConfigurer가 제공하는 addFormatter()를 사용해서 컨버터를 스프링에 등록해주면 된다.
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToIntegerConverter());
        registry.addConverter(new IntegerToStringConverter());
    }
}

📚 Formatter

  • Converter는 문자를 객체로, 객체를 문자로 변환하는 등의 범용적인 타입 변환 기능을 제공한다.
  • Formatter는 객체를 특정한 포맷에 맞추어 문자로 출력하거나 그 반대 기능을 할 수 있도록 한다.

스크린샷 2025-01-29 오후 8 29 36

  • Printer 인터페이스의 print() 메서드 : 객체를 문자로 변환
  • Parser 인터페이스의 parser() 메서드 : 문자를 객체로 변환
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToIntegerConverter());
        registry.addConverter(new IntegerToStringConverter());
        
        registry.addFormatter(new DateFormatter());
    }
}
  • Formatter 역시 위와 같이 WebMvcConfigurer 인터페이스에서 addFormatter() 메서드로 추가하면 된다.

❗사실 스프링에서 이미 수많은 포맷터를 이미 기본으로 제공해준다. 따라서 직접 만들어 사용할 일이 거의 없다. ❗가장 많이 사용되는 포맷터는 @NumberFormat, @DateTimeFormat이 있다.