Spring-TypeConverter

Shaun·2022년 11월 12일
1

SpringBoot

목록 보기
13/20
post-thumbnail

작업을 하다보면 문자를 숫자로 , 숫자를 무문자로 바꿔야 하는 경우가 있다. 그럴때는 컨버터 를 사용해주자.

Controller

  • http 요청 파라미터는 모두 '문자' 로 넘어온다. 그래서 원하는 타입으로 바꿔서 사용하길 원하면 추가적인 코드가 필요

  • MVC 에서 제공하는 @RequestParam의 경우 첫번째 사진처럼 따로 변경하지 않아도 문자로 들어온 타입을 Integer타입으로 바꿔준다. (pathVariable 도 마찬가지)

-> 스프링이 중간에 몰래 타입 변경을 해준것

스프링이 타입 변환 적용 예

  • @RequestParam , @PathVaraible, @Modelattribute
  • @Value로 YML정보 읽기
  • 뷰 렌더링

직접 컨버터 만들기

  • 바꾸고싶은 타입 A->B 를 S,T 자리에 넣어주고 implments 해주면 된다

  • Integer ->String

  • String ->Integer

  • 객체 -> String

  • String -> 객체

testCode

-> 여기까지 보면 내가 직접구현하나 컨버터를 사용하나 별 차이가 없다. 타입 컨버터를 등록하고 관리하는 무언가가 필요하다

ConversionService

  • 컨버터 하나하나 찾아서 타입변환은 너무 힘듬
  • 그래서 스프링에서는 컨버터를 모두 모아두고 관리하는 기능 제공 -> ConversionService

  • 이렇게 우리가 만든 컨버터를 등록하기만 하면 convert라는 공통된 메서드로 호출해서 사용 가능하다.

등록과 사용 분리

  • ConversionService에 등록할때는 각각의 컨버터들을 정확히 알아야 하지만 사용하는 입장에서는 타입컨버터들을 전혀 몰라도 됀다. 그러므로 사용자는 ConversionService 인터페이스에만 의존하면 됀다.

인터페이스 분리 원칙(Interface Segregation Principle)

  • DefaultConversionService 는 밑에 두가지 인터페이스를 구현한다

    ConversionService(컨버터 사용에 초점)
    ConverterRegistry(컨버터 등록에 초점)

  • 이렇게 함으로 컨버터를 사용하는 클라 입장에서는 ConversionService에만 의존하면 된다는 장점이 생김.

  • 이렇게 인터페이스를 분리하는것을 ISP라 한다.

스프링 Converter 등록

  • 스프링은 내부적으로 ConversionService를 사용해 개발자들이 컨버터만 등록해주면 알아서 컨버젼서비스에 등록해줌

  • 사실 이미 왠만한 컨버터들은 다 등록이 되어있는 상태라 특수한경우 (위에서 IP object -> String으로 또는 그반대 ) 에 해당하는 경우가 아니면 등록 할 필요가 없다.

  • 등록을 하면 개발자들이 등록한 컨버터가 우선순위를 가지게 됀다.

뷰 템플릿 컨버터 적용

  • 타임리프는 ${{data}} 처럼 사용하면 ConversionService를 사용해서 변환된 결과를 출력해줌

  • 그냥 ${data} 는 변수 표현식, 값 그대로 나옴

  • 우리가 만든 컨버터 처럼 알아서 문자는 숫자로 숫자는 문자로 객체도 문자로 .. 변경해준다.

폼 컨버터 적용

  • GET : th:field 가 자동으로 ConversionService 적용
  • POST : @ModelAttribute(스프링이 컨버터를 적용해주는 예중 하나) 컨버터 사용

포맷터-formatter

1.String print(T object, Locale locale)
2.T parse(String text, Locale locale)

  • 포맷터는 객체를 문자로 변경하고 , 문자를 객체로 변경하는 두 가지 기능을 모두 수행

Formatter 만들기

  • 숫자 1000 을 "1,000" 으로 만들기

  • 이러한 경우에는 자바에서 기본적으로 제공하는 NumberFormat 객체를 사용하면 됨. Locale 정보를 받아 나라별 숫자 포맷기능

Formatter - ConversionService

  • ConversionService에는 컨버터만 등록할 수 있다. 그런데 생각해보면 포맷터 또한 객체->문자 , 문자-객체로 변환하는 특별한 컨버터일 뿐 그이상 그이하도 아니다.

  • 포맷터를 지원하는 ConversionService를 사용하면 포맷터를 추가 할수 있다.

  • 내부에서 어댑터 패턴을 사용해 Formatter가 Converter처럼 동작하도록 만들어보자

  • FormattingConversionService 는 포맷터를 지원하는 ConversionService다.

  • DefaultFormattingConversionServiceFormattingConversionService에 기본적인 통화,숫자 관련 몇가지 기본 포맷터 추가 제공

  • FormattingConversionService는 conversionService관련 기능을 상속받기 떄문에 결과적으로 컨버터,포맷터 모두 등록 가능

Formatter 적용하기

  • 주석처리 이유는 기능이 겹치기 떄문, 우선순위는 컨버터 > 포맷터

스프링이 제공하는 기본 Formatter

  • 스프링에서 수많은 포맷터들을 제공한다. 그중에 대표적인 예로는 @NumberFormat , @DateTimeFormat 등등 이 있다.

  • form

  • view

=> 컨버터, 포맷터 등록 방법은 다르지만 둘다 conversionService를 통해 일관성 있게 사용 가능

주의

HttpMessageConverter

  1. HttpBody -> Object
  2. Object-> HttpBody
  3. JSON -> Object (Jackson 라이브러리사용)
  4. Object -> JSON (Jackson 라이브러리사용)

=> HttpMessageConverter 에는 conversionService와 전혀 상관 없음

ConversionService

1.@RequestParam
2.@ModelAttribute
3.@Pathvariable
4.viewTemplate

profile
호주쉐프에서 개발자까지..

0개의 댓글