1. Converter
- S 타입을 T 타입으로 변환할 수 있는 매우 일반적인 변환기.
- 상태 정보 없다 / stateless / 스레프 세이프하다 >> 빈으로 등록하여 사용가능
- 빈으로 등록할 때는 ConverterRegister에 등록해서 사용한다.
- Converter 소스
package com.bpkim.demospring51;
import org.springframework.core.convert.converter.Converter;
public class EventConverter {
public static class StringToEventConverter implements Converter<String, Event>{
@Override
public Event convert(String s) {
return new Event(Integer.parseInt(s));
}
}
public static class EventToStringConverter implements Converter<Event, String>{
@Override
public String convert(Event event) {
return event.getId().toString();
}
}
}
Spring MVC 를 쓴다면 WebConfig implements WebMvcConfigurer 만들어서 등록
package com.bpkim.demospring51;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new EventConverter.StringToEventConverter());
}
}
2. Formatter
- 웹에 특화된 인터페이스
- PropertyEditor 대체제
- Object와 String 간의 변환을 담당한다.
- 문자열을 Locale에 따라 다국화하는 기능도 제공한다. (optional)
- FormatterRegistry에 등록해서 사용한다.
- Formatter 소스
: 빈으로 등록하여 사용도 가능
package com.bpkim.demospring51;
import org.springframework.format.Formatter;
import java.util.Locale;
public class EventFormatter implements Formatter<Event> {
@Override
public Event parse(String s, Locale locale) {
return new Event(Integer.parseInt(s));
}
@Override
public String print(Event event, Locale locale) {
return event.getId().toString();
}
}
Spring MVC 를 쓴다면 WebConfig implements WebMvcConfigurer 만들어서 등록
package com.bpkim.demospring51;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new EventFormatter());
}
}
>> ConversionService에 Converter와 Formatter가 등록되게 되고 ConversionService를 통해서 변환 작업이 이뤄진다.
ConversionService
- 실제 변환 작업이 이 인터페이스를 통해 스레드 세이프 하게 사용 할 수 있다.
- 스프링 MVC, 빈(value) 설정, SpEL에서 사용한다.
- DefaultFormattingConversionService
- FormatterRegistry 기능 , ConversionService 기능을 모두 사용할 수 있다.
- 여러 기본 컨버터와 포메터 등록을 해준다.
FormatterRegistry 가 Converter을 상속하기 때문에 FormatterRegistry으로 Formatter을 등록 할수있음
위에 소스 참고
** 스프링 부트 일때
- 웹 애플리케이션인 경우 DefaultFormattingConversionService를 상속하여 만든 WebConversionService를 빈으로 등록해준다.
- Formatter와 Converter 빈을 찾아서 자동 등록해준다.
>>> WebConfig 자바 파일 안만들고 Formatter, Converter를 빈 등록하여 사용 가능하다.
*** 주로 웹과 관련된 프로젝트이기 때문에 formatter 을 추천!
- Formatter 빈 등록
package com.bpkim.demospring51;
import org.springframework.format.Formatter;
import org.springframework.stereotype.Component;
import java.util.Locale;
@Component
public class EventFormatter implements Formatter<Event> {
@Override
public Event parse(String s, Locale locale) {
return new Event(Integer.parseInt(s));
}
@Override
public String print(Event event, Locale locale) {
return event.getId().toString();
}
}
- Converter 빈 등록
package com.bpkim.demospring51;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
public class EventConverter {
@Component
public static class StringToEventConverter implements Converter<String, Event>{
@Override
public Event convert(String s) {
return new Event(Integer.parseInt(s));
}
}
@Component
public static class EventToStringConverter implements Converter<Event, String>{
@Override
public String convert(Event event) {
return event.getId().toString();
}
}
}
- 등록되어 있는 converter를 모두 보기
package com.bpkim.demospring51;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.convert.ConversionService;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ConversionService conversionService;
@Override
public void run(ApplicationArguments args) throws Exception{
// converter 출력
System.out.println(conversionService);
System.out.println(conversionService.getClass().toString());
}
}
- 만든 converter도 확인이 가능하다.
'개발 > Spring' 카테고리의 다른 글
스프링 AOP - 개념 (0) | 2021.04.27 |
---|---|
SpEL(스프링 Expression Language) (0) | 2021.04.23 |
데이터 바인딩 추상화: PropertyEditor (0) | 2021.04.22 |
Validation 추상화 (0) | 2021.04.22 |
Resource 추상화 (0) | 2021.04.22 |