코딩하는 털보

Spring Framework - 6 본문

IT Study/Spring Framework

Spring Framework - 6

이정인 2020. 12. 18. 18:57

데이터 바인딩

프로퍼티 값을 타겟 객체에 설정하는 기능.
즉, 사용자 입력값(문자열)을 객체가 가지고 있는 int, Date, Boolean 또는 도메인 타입 등으로 변환해 넣어주는 기능이다.

PropertyEditor

DataBinder가 변환 작업에 사용하는 인터페이스.

문자열을 객체로 변환하는 Editor 만들기

public class EventEditor extends PropertyEditorSupport {

    @Override
    public String setAsText(String text) throws IllegalArgumentException {
        setValue(new Event(Integer.parseInt(text)));
    }
}

PropertyEditorSupport는 PropertyEditor의 구현체이다.
참고로 PropertyEditor는 쓰레드 세이프 하지 않기 때문에 절대로 싱글톤 빈으로 등록하지 않는다.
그리고 Object / String 간 변환만 지원한다.
사용할 때는 @InitBinder로 사용할 PropertyEditor를 등록할 수 있다.

    @InitBinder
    public void init(WebDataBinder webDataBinder) {
        webDataBinder.registerCustomEditor(Event.class, new EventEditor());
    }

Converter와 Formatter

Converter

Source 타입을 Target 타입으로 변환, 상태 정보가 없기 때문에(stateless) 쓰레드 세이프하다.

public class StringToEventConverter implements Converter<String, Event> {

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

WebMvcConfigurer 에서 설정, ConverterRegistry에 등록하여 사용한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToEventConverter());
    }
}
Formatter

보다 Web에 특화된 인터페이스
String과 Object 변환, Locale에 따른 i18n 기능.

@Component
public class EventFormatter implements Formatter<Event> {
    @Override
    public Event parse(String text, Locale locale) throws ParseException {
        return new Event(Integer.parseInt(text));
    }

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

WebMvcConfigurer 에서 설정, FormatterRegistry에 등록하여 사용한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new EventFormatter());
    }
}
ConversionService

Converter/Formatter는 DataBinder 대신에 ConversionService에서 쓰레드 세이프하게 실제 변환 작업이 수행된다.
스프링 MVC, 빈(value) 설정, SpEL에서 사용한다.
DefaultFormattingConversionService
: ConversionService와 FormatterRegistry를 구현하고 그 외 여러 기본 컨버터와 포매터가 등록되어 있다.

conversionService를 toString()으로 확인하면 등록된 모든 Converter, Formatter를 확인할 수 있다.

참고로 스프링 부트에서는 DefaultFormattingConversionService를 상속받는 WebConversionService가 빈으로 등록되고
WebMvcConfigurer 설정 없이 Formatter와 Converter 빈을 찾아서 자동으로 등록해준다.

Comments