반응형
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());
}
}
반응형
'Spring > 스프링 프레임워크 핵심 원리' 카테고리의 다른 글
[Spring] #18. 스프링 AOP: 개념 소개 (0) | 2020.12.24 |
---|---|
[Spring] #17. SpEL(스프링 Expression Language) (0) | 2020.12.24 |
[Spring] #15. 데이터 바인딩 추상화: PropertyEditor (0) | 2020.12.24 |
[Spring] #14. Validation 추상화 (0) | 2020.12.24 |
[Spring] #13. Resource 추상화 (0) | 2020.12.24 |