사용자가 입력한 값을 어플리케이션 도메인에 맞게 동적으로 변환하여 넣어주는 기능을 "Data binding" 이라고 합니다.
즉, 사용자가 입력한 "문자열"을 객체의 int, boolean, date 등의 도메인으로 변환하는 것입니다.
먼저 get 요청으로 오는 event 를 Event 객체로 받아서 그 아이디를 return 하는 메소드를 아래와 같이 구현하였습니다.
Test 를 위해 Test 클래스를 작성하겠습니다.
@WebMvcTest 는 계층형 테스트와 관련있습니다. 웹과 관련된 Bean만 등록해줍니다.
get 요청으로 보내진 1 이라는 숫자는 아직 Event 객체로 매핑될 수 없기 때문에 테스트 수행시 에러가 발생할 것입니다.
**** 이때 혹시 "no test found with test runner junit5" 이런 에러가 나는 경우
Run configuration > Test > Test runner 를 "JUnit 4" 로 바꿔주어야합니다~~
PropertyEditor
이제 PropertyEditorSupport 를 이용하여 입력값을 Object 로 매핑해주겠습니다.
먼저 PropertyEditorSupport 를 상속받은 클래스를 만들어줍니다.
여기서 getAsText, SetAsText 는 문자열을 다른 타입으로 바꿔주거나 다른타입을 문자열로 바꿔주는 기능을 제공합니다.
이렇게 만든 Editor를 이제 컨트롤러에 적용하면 됩니다.
@InitBinder를 통해서 Editor를 지정할 수 있습니다.
PropertyEditor 는 절대!!로 빈으로 등록해서 쓰레드와 공유해서 사용하면 안됩니다.
Converter
PropertyEditor는 앞서 보았듯이 문자열을 기준으로 변환을 수행합니다.
보다 generic하게 사용할 수 있는 기능이 Converter입니다.
이렇게 2가지의 conver 메소드를 구현하여 사용할 수 있습니다.
구현한 Converter는 Spring MVC 모델을 이용하는 경우에는 WebMvcConfigurer 에 설정하여 지정할 수 있습니다.
스프링이 기본적으로 등록해주지 않는 것은 이렇게 지정해서 사용할 수 있습니다.
대부분 사용자 입력값이 문자로 들어오고 그 문자열을 객체로 return 하는 경우가 많습니다.
Formatter
Formatter 는 ProviderEditor 와 유사하지만 Locale 정보를 기반으로 바꿀 수 있다는 차이점이 있습니다.
또한,Thread-safe 하므로 Bean으로 등록하여 사용해도 됩니다.
이렇게 작성해준 뒤에 Webconfig 에 formatter를 추가해주면 됩니다.
Converter, Formatter 는 ConversionService 에 등록이 되는것이고 이를 통해 사용하고 있습니다.
Converter는 ConverterRegistry 에 등록하여 사용하고
Formatter는 FormatterRegistry 에 등록하여 사용합니다.
FomatterRegistry는 ConverterRegistry 를 상속받고 있습니다.
SpringBoot에서는 DefaultFormattingConversionService를 상속하여 만든 WebConversionService를 빈으로 등록해줍니다.
이렇게 주입되는 ConversionService의 타입을 찍어보면 WebConversionService를 출력해주는 것을 볼 수 있습니다.
JPA를 사용하는 경우 이미 Converter가 등록되어 있습니다. 또한 Spring boot 에서는 Formatter, Converter가 Bean으로 등록되어 있다면 굳이 WebConfig 에 설정하지 않더라고 ConversionService에 등록되게 됩니다.
등록되어 있는 Converter, Formatter 를 보고 싶으면 conversionService 를 출력해보시면 됩니다.
'Java > Spring Framework' 카테고리의 다른 글
AOP (0) | 2021.02.07 |
---|---|
SpEL (0) | 2021.02.07 |
Validation (0) | 2021.02.04 |
Resource (0) | 2021.02.04 |
MessageSource (0) | 2021.02.03 |