데이터 바인딩 추상화
기술적인 관점: 프로퍼티 값을 타깃 객체에 선정하는 기능
사용자 관점: 사용자가 입력한 값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능.
- 입력값은 대부분 문자열이다.
- 그 값을 int, log, Boolean 등 심지어 Event, Book 같은 도메인 타입으로도 변환해서 넣어주는 기능이다.
EventEditor
- Event 도메인을 생성한다.
- EventController에서 @PathVariable로 Event를 파라미터로 받아온다.
- test에서 mock객체를 이용하여 url에 event/1로 요청을 보낸다.
- editor를 매칭 하지 못한다는 에러가 발생하는 것을 알 수 있다
- event/1에서 1을 event로 매핑해야 하지만 이 매핑은 Editor가 필요하다.
Editor
- PropertyEditorSupport를 상속받아 Editor를 설정할 수 있다.
- get요청으로 날아온 1을 Event의 id로 변환해줘야 한다.
- setAsText에서 매개변수인 text가 get요청으로 날아오는 1이다.
- 이것을 Integer로 바꾸고 Event 생성자에 넣어주면 된다.
- Editor를 Controller에서 @InitBinder를 통해 추가할 수 있다.
- 테스트를 돌려보면 통과한 것을 알 수 있다.
- 즉 1을 Editor에서 Integer로 변환하여 이벤트를 생성자에 넣고 setValue를 하였기 때문이다.
PropertyEditor의 한계
- 이 에디터의 get, set Value 한 Value 들은 PropertyEditor가 가지고 있는 값으로 다른 Thread에 공유된다.
- Thread-safe 하지 않으므로 혹여나 빈으로 등록할 때는 Thread Scope 빈으로 만들어야 한다.
- Object와 String 간의 변환만 할 수 있어, 사용 범위가 제한적이다.
이러한 Editor의 단점을 보완한 Converter와 Formatter가 있다.
Converter
- S 타입을 T 타입으로 변환할 수 있는 매우 일반적인 변환기
- 상태 정보가 없어 Stateless 하기 때문에 Thread-safe 하다. (빈으로 등록해도 된다)
- ConverterRegistry에 등록하여 사용한다.
- EventConverter를 만들고 그 안에 정적 클래스로 StringToEvent , EvnetToString을 Converter를 상속받아 만든다.
- 그 후 StringToEventConverter에서 Editor에서와 똑같이 Interger로 변환 후 Event를 생성하고 리턴한다.
- Converter는 WebMvcConfigurer를 통해 등록이 가능하다.
- 오버라이드 된 메서드의 파라미터를 보면 FomatterRegistry이다.
- FomatterRegistry는 ConverterRegistry를 상속받아 만들어졌기 때문에 addConverter를 할 수 있다.
- 그 후 위의 테스트를 진행시키면 아래와 같이 잘 통과되는 것을 알 수 있다.
Formatter
- Object와 String 간의 변환을 담당한다.
- 문자열을 Locale에 따라 다국화하는 기능도 제공한다.(optical)
- FomatterRegistry에 등록하여 사용한다.
- Thread-Safe 하므로 빈으로 등록 가능
다국화 기능이 있으므로 웹에 더 특화되어 있다.
- Converter는 Generics 타입 변환이므로 따로 구현했지만 Fomatter는 String-Object 변환이므로 하나만 구현하면 된다.
- 파라미터를 보면 Locale이 있어 다국화 기능을 사용할 수 있음을 알 수 있다.
이 또한 WebMvcConfigurer를 이용하여 추가해주어야 한다. 그러면 아래와 같이 테스트가 통과된다.
PropertyEditor와 Converter, Formatter
- 데이터 바인딩 작업을 PropertyEditor는 DataBinder가 담당한다.
- Converter와 Formatter는 ConversionService가 실제로 변환을 담당한다.
ConverterService
- 위의 예제와 같이 실제 변환 작업은 이 인터페이스를 통해서 Tread-Safe 하게 사용할 수 있다.
- 스프링 MVC, 빈 설정, SpEL에서 사용한다.
스프링 부트에서의 Converter, Fomatter
- Converter나 Formatter가 Bean으로 등록되어 있다면 자동으로 ConversionService에 등록해준다
- Converter에 @Component를 붙여 빈으로 등록한다.
- 그러면 따로 WebConfig에 추가할 필요가 없다.
Test코드에서 @WebMvcTest에 따로 명시해주어야 한다.@WebMvcTest는 웹에 관한 빈들만 처리해주기 때문에 따로 추가해주지 않으면 에러가 나타난다.
@WebMvcTest에서 컨버터는 따로 추가하지 않아도 빈으로 등록해주며 포매터는 해주지 않습니다.
그러므로 컨버터는 따로 추가할 필요가 없습니다.
- 포매터도 마찬가지로 빈으로 등록하고 테스트에서 추가해주면 된다.
- 컨버터, 포매터 모두 스프링 부트에서 빈으로 등록하면 따로 추가할 필요 없이 적용되는 것을 알 수 있다.
'스프링 > 스프링 핵심 기술' 카테고리의 다른 글
스프링 AOP (0) | 2019.12.17 |
---|---|
SpEL(Spring Expression Language) (0) | 2019.12.17 |
Validation 추상화 (0) | 2019.12.16 |
ResourceLoader, Resource 추상화 (0) | 2019.12.16 |
7. IoC 컨테이너: ApplicationEventPublisher (0) | 2019.12.14 |