Spring/스프링 프레임워크 핵심 원리

[Spring] #16. 데이터 바인딩 추상화: Converter와 Formatter

sujin7837 2020. 12. 24. 20:32
반응형

Converter

-PropertyEditor가 가지고 있는 단점을 보완하기 위해 Converter가 생겨남

-S 타입을 T 타입으로 변환할 수 있는 매우 일반적인 변환기(문자열을 정수로 변환하는 것뿐만 아니라 다른 형태로도 변환 가능)

-상태 정보 없음==스레드 세이프 함

-ConverterRegistry에 등록해야 함

 

public class EventConverter {
    @Component
    public static class StringToEventConverter implements Converter<String, Event> {

        @Override
        public Event convert(String source) {
            return new Event(Interger.parseInt(source));
        }
    }

    @Component
    public static class EventToStringConverter implements Converter<Event, String> {
        @Override
        public String convert(Event source) {
            return source.getId().toString();
        }
    }
}
    //String을 Event로 변환하겠다는 컨버터 
    //두 개의 convert가 PropertyEditor 하나의 역할을 함 

컨버터는 상태 정보가 없으므로 빈으로 등록해서 사용이 가능합니다. 빈으로 등록해서 사용하려면 'ConverterRegistry'에 등록해서 사용해야 합니다.

 

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FomatterRegistry registry) {
        registry.addConverter(new EventConverter.StringToEventConverter());
    }
}

스프링 부트 없이 스프링 MVC를 사용하려면 web용 configuration figure를 만듭니다.

Formatter

-FormatterRegistry에 등록해야 함

Formatter에서 구현되는 메소드는 두 가지입니다.

Locale 정보를 받아서 하나는 문자를 받아서 객체로, 다른 하나는 객체를 받아서 문자열로 바꾸는 것입니다.

//EventFormatter.java

//빈으로 등록하지 않을 경우
public class EventFomatter implements Formatter<Event> {
    @Override
    public Event parse(String text, Locale locale) throws ParseException {
        return new Event(Integer.parseInt(text));
    }

    @Override
    public String print(Event object, Locale locale) {
        return object.getId().toString();
    }
}
//EventFormatter.java

//빈으로 등록해서 사용할 경우
@Component
public class EventFomatter implements Formatter<Event> {
    @Autowired
    MessageSource messageSource;

    @Override
    public Event parse(String text, Locale locale) throws ParseException {
        return new Event(Integer.parseInt(text));
    }

    @Override
    public String print(Event object, Locale locale) {
        messageSource.getMessage(resolvable: "title", locale);

        return object.getId().toString();
    }
}
//WebConfig.java

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FomatterRegistry registry) {
        registry.addConverter(new EventConverter());
    }
}

타입을 변환하는 기능을 데이터 바인더 대신에 Converter와 Formatter를 활용하는 ConversionService를 사용할 수 있게 되었습니다.

 

-스프링 부트

·웹 애플리케이션인 경우에는 DefaultFormattingConversionService를 상속하여 만든 WebConversionService를 빈으로 등록해 줌(더 많은 기능을 가지고 있음)

·Formatter와 Converter 빈을 찾아 자동으로 등록해 줌

//AppRunner.java

@Component
public class AppRunner implements ApplicationRunner {
    @Autowired
    ConversionService conversionService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(conversionService);    //등록된 컨버터들을 전부 출력해준다
        System.out.println(conversionService.getClass().toString());
    }
}
반응형