스프링/4. 스프링 MVC-2

81. 포맷터 스프링(컨버전서비스)에 등록

sdafdq 2023. 9. 24. 01:18

원래 컨버전 서비스에는 컨버터만 등록할 수 있고 포맷터를 등록할 수는 없다.

 

하지만, 그 컨버전서비스 인터페이스를 상속받은 클래스 중에는 포맷터를 지원하는 컨버전 서비스가 있다. 거기에 등록하면 된다.

 

DefaultFormattingConversionService는 컨버전서비스에 포맷팅을 등록할 수 있고, 거기에 기본적인 기능과 정보가 추가되어 있다.

 

 

public class FormattingConversionServiceTest {
    @Test
    public void formattingConversionService(){
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();

        conversionService.addConverter(new StringIpPortConverter());
        conversionService.addConverter(new IpPortToStringConverter());
        conversionService.addConverter(new IntegerToStringConverter());
        conversionService.addConverter(new StringToIntegerConverter());

        conversionService.addFormatter(new MyNumberFormatter());

        IpPort ipPort = conversionService.convert("127.0.0.0:8080", IpPort.class);
        assertThat(ipPort).isEqualTo(new IpPort("127.0.0.0", 8080));

        String numStr = "1,000";
        Long num = conversionService.convert(numStr, Long.class);
        assertThat(num).isEqualTo(1000);

        Long numInt = 1000L;
        String numToString = conversionService.convert(numInt, String.class);
        assertThat(numToString).isEqualTo("1,000");
    }
}

DefaultFormattingConversionService를 생성하고,(이건 컨버터를 관리하던 ConversionService와 포맷터를 관리하는 FormatterRegistry 둘 다 상속 받은 거다.) addConverter와 addFormatter해서 포맷터와 컨버터를 등록시켜준다.

 

근데 사용하는 것은 둘다 ConversionService.convert() 해서 똑같다.

 

 

근데 Number 포맷팅과 관련해서는 Long타입인게 좀 불편하긴 하다.