[SpringBoot] 스프링 TypeConverter

해니·2023년 12월 18일
0

SpringBoot

목록 보기
7/24
post-thumbnail


스프링 타입 컨버터란?

  • HTTP 요청 파라미터는 모두 문자열로 처리되기 때문에, 요청 파라미터를 다른 제너릭 타입으로 변환하기 위해서는 변환하는 과정을 거쳐야 한다.
    • @RequestParam, @ModelAttribute, @PathVariable 같은 어노테이션이 해당 과정을 대신해주기도 한다.

컨버터 인터페이스

  • 스프링 타입 컨버터는 Converter라는 인터페이스를 구현해서 사용할 수 있다.
  • Converter<S,T> 형태에서 S는 입력값의 형태를, T에는 변환하길 원하는 형태를 의미한다.

public class StringToIntegerConverter implements Converter<String,Integer> {
 
    @Override
    public Integer convert(String source) {
        return Integer.valueOf(source);
    }
}
  • Converter를 구현하는 클래스를 만든 후 제네릭으로 원하는 자료형들을 넣어주면 매개변수와 반환 타입이 설정된 convert 메서드를 오버라이딩 할 수 있다.



ConversionService

  • TypeConverter를 매번 직접 찾아서 형 변환에 사용하는 것은 불편하기 때문에, 스프링은 모든 컨버터들을 관리해주고, 클라이언트가 원하는 자료형을 입력만 하면 알아서 컨버터를 찾아서 적용해주는ConverionService를 제공한다.

@Test
void conversionService() {

  // conversionService 생성
  DefaultConversionService conversionService = new DefaultConversionService();
  // conversionService에 converter 등록 
  conversionService.addConverter(new StringToIntegerConverter());
	
  assertThat(conversionService.convert("10", Integer.class)).isEqualTo(10);

}
  • DefaultConversionService는 인터페이스인 ConversionService의 구현체이다.
  • convert 메서드에 입력값과 원하는 반환 타입만 지정해주면, conversionService는 등록한 컨버터중에 해당 작업을 진행할 수 있는 컨버터를 자동으로 찾아준다.



스프링에 Converter 등록하기

@Configuration
public class WebConfig implements WebMvcConfigurer {
 
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToIntegerConverter());
    }
 
 }
  • WebConfig 클래스를 만든 후 WebMvcConfigurer 인터페이스를 구현한다.
  • WebMvcConfigurer는 MVC와 관련된 각종 커스터마이징 및 설정을 가능하게 해준다.
  • String이 컨트롤러로 들어오면 @RequestParam,@ModelAttribute, @PathVariable 에서 Integer형으로 받을 시, 등록해둔 컨버터가 동작한다.

Converter vs Formatter

  • Converter는 입출력 타입에 제한이 없는 범용적인 타입 변환 기능을 제공한다.
  • Formatter는 객체를 특정한 포맷에 맞추어 문자로 출력하거나 또는 그 반대의 역할을 하는 것에 특화되었다.
    ex) 10000 -> 10,000으로 변환하거나 LocalDateTime 객체 값인 2021-08-11 T 21:33:30를 2021.08.11 21:33:30으로 변환한다.
  • converterformatter보다 우선순위가 높으므로, 비슷한 기능을 하는 converter가 있을 경우 formatter가 정상적으로 동작하지 않는다.

💡 스프링은 이미 수많은 타입 컨버터를 구현해놓았고, conversionService를 내장하고 있기 때문에, 특별한 경우( ex> String을 입력 후 내가 만든 커스텀 객체로 변환할 때)를 제외하고는 스프링 내장 컨버터가 알아서 변환해준다.






출처
[Spring] 스프링 타입 컨버터 정리
[SpringBoot] 스프링 TypeConverter 정리
[Spring Boot] : ComversionServcie 사용해 보기

profile
💻 ⚾️ 🐻

0개의 댓글