작업을 하다보면 문자를 숫자로 , 숫자를 무문자로 바꿔야 하는 경우가 있다. 그럴때는 컨버터 를 사용해주자.
-> 스프링이 중간에 몰래 타입 변경을 해준것
- @RequestParam , @PathVaraible, @Modelattribute
- @Value로 YML정보 읽기
- 뷰 렌더링
-> 여기까지 보면 내가 직접구현하나 컨버터를 사용하나 별 차이가 없다. 타입 컨버터를 등록하고 관리하는 무언가가 필요하다
DefaultConversionService 는 밑에 두가지 인터페이스를 구현한다
ConversionService(컨버터 사용에 초점)
ConverterRegistry(컨버터 등록에 초점)
이렇게 함으로 컨버터를 사용하는 클라 입장에서는 ConversionService에만 의존하면 된다는 장점이 생김.
이렇게 인터페이스를 분리하는것을 ISP라 한다.
스프링은 내부적으로 ConversionService를 사용해 개발자들이 컨버터만 등록해주면 알아서 컨버젼서비스에 등록해줌
사실 이미 왠만한 컨버터들은 다 등록이 되어있는 상태라 특수한경우 (위에서 IP object -> String으로 또는 그반대 ) 에 해당하는 경우가 아니면 등록 할 필요가 없다.
등록을 하면 개발자들이 등록한 컨버터가 우선순위를 가지게 됀다.
타임리프는 ${{data}} 처럼 사용하면 ConversionService를 사용해서 변환된 결과를 출력해줌
그냥 ${data} 는 변수 표현식, 값 그대로 나옴
우리가 만든 컨버터 처럼 알아서 문자는 숫자로 숫자는 문자로 객체도 문자로 .. 변경해준다.
1.String print(T object, Locale locale)
2.T parse(String text, Locale locale)
숫자 1000 을 "1,000" 으로 만들기
이러한 경우에는 자바에서 기본적으로 제공하는 NumberFormat 객체를 사용하면 됨. Locale 정보를 받아 나라별 숫자 포맷기능
ConversionService에는 컨버터만 등록할 수 있다. 그런데 생각해보면 포맷터 또한 객체->문자 , 문자-객체로 변환하는 특별한 컨버터일 뿐 그이상 그이하도 아니다.
포맷터를 지원하는 ConversionService를 사용하면 포맷터를 추가 할수 있다.
내부에서 어댑터 패턴을 사용해 Formatter가 Converter처럼 동작하도록 만들어보자
FormattingConversionService 는 포맷터를 지원하는 ConversionService다.
DefaultFormattingConversionService는 FormattingConversionService에 기본적인 통화,숫자 관련 몇가지 기본 포맷터 추가 제공
FormattingConversionService는 conversionService관련 기능을 상속받기 떄문에 결과적으로 컨버터,포맷터 모두 등록 가능
=> 컨버터, 포맷터 등록 방법은 다르지만 둘다 conversionService를 통해 일관성 있게 사용 가능
HttpMessageConverter
- HttpBody -> Object
- Object-> HttpBody
- JSON -> Object (Jackson 라이브러리사용)
- Object -> JSON (Jackson 라이브러리사용)
=> HttpMessageConverter 에는 conversionService와 전혀 상관 없음
ConversionService
1.@RequestParam
2.@ModelAttribute
3.@Pathvariable
4.viewTemplate