13.데이터 바인딩 추상화

데이터 바인딩 추상화: Converter와Formatter

이전강의에서 봤던 PropertyEditor의 단점으로 인해 Converter와Formatter가 생겨났다

PropertyEditor의 단점

  1. 쓰레드 세이프하지 않음
  2. 무조건 스트링과 오브젝트의 관계이다. 즉 스트링을 오브젝트로 하거나 오브젝트를 스트링으로 변환하거나 밖에 못함.
    getAsText() 메소드는 오브젝트를 문자열로
    setAsText() 메소드는 문자열을 오브젝트로

`바인딩은 조금 더 제너럴 해야한다.-> Converter의 등장’

Converter

아래는 앞에서 봤던 EventEditor 와 같은역할을 한다. 그리고 상태정보가 없기때문에 빈으로 등록하여 사용이 가능하다. ConverterRegistry에 등록하여 사용가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

public class EventCoverter {

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

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

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

@Override
public String convert(Event source) {
return source.getId().toString();
}
}
}

@Component를 통해 빈으로 등록하지 않고 사용하려면. 아래를 추가

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addFormatters(FormatterRegistry registry) {
//ConverterRegistry에 등록하여 사용해야한다고 했지만 ConverterRegistry는 FormatterRegistry 를
//상속받기 때문에 FormatterRegistry로도 사용가능
registry.addConverter(new EventConverter.StringToEventConverter());
}
}


1
2
3
4
5
6
7
8
9
@RestController
public class EventController {
@GetMapping("/event/{event}")
public String getEvent(@PathVariable Event event) {
print(event);
return event.getId().toString();
}

}

Formatter

PropertyEditor와 구현방식은 유사하다 implements 후 메소드 하나는 String 하나는 객체로 반환하여 사용.
얘 또한 마찬가지로 빈으로 등록되고 다른 빈을 주입받을 수 있다,

@Component
public class EventFormatter implements Formatter {

@Autowired
MessageSource messageSource;

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

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

}

@Component를 통해 빈으로 등록하지 않고 사용하려면. 아래를 추가

1
2
3
4
5
6
7
8
9
10
@Configuration
public class WebConfig implements WebMvcConfigurer {

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


ConversionService

이전까지 DataBinder(PropertyEditor이 상속)를 사용하여 데이터 변환을 했다면 이번챕터부터는 ConversionService를 사용하고 있는것이다.

addFormatters 메소드를 통해 등록되는 빈들은 Converter와Formatter들은 ConversionService에 등록되는 것이고 이를통해 실제 변환하는 작업을 한것.

ConversionService는 DefaultFormattingConversionService로 생성되는 경우가 많은데 DefaultFormattingConversionService는 FormatterRegistry/ConversionService 두 가지의 역할을 한다.

1
2
3
4
5
6
7
@Autowired
ConversionService conversionService ;

...
conversionService. xxxxx를 활용하여 등록된 빈들을 활용가능
.....

위와같이 사용가능하다.

하지만 스프링 부트에서는 addFormatters를 사용하지 않더라도 자동으로 Converter와Formatter을 conversionService 빈으로 등록해준다! (@Component 어노테이션은 붙여야함)

Share