Spring에서 객체의 타입을 서로 변환하는 데 사용되는 인터페이스로 Spring의 데이터 바인딩 과정에서 문자열을 특정 객체로 변환하거나 하나의 객체 타입을 다른 타입으로 변환할 때 사용한다.
@Slf4j
@RestController
public class TypeConverterController {
@GetMapping("/param")
public void param(HttpServletRequest request) {
// 조회시 : String
String stringExample = request.getParameter("example");
// Integer로 Type 변환
Integer integerExample = Integer.valueOf(stringExample);
log.info("integerExample = {}", integerExample);
}
}
@GetMapping("/v2/param")
public void paramV2(@RequestParam Integer example) {
// Integer 타입으로 바인딩
log.info("example = {}", example);
}
추가적인 변환 작업을 거치지 않고 Integer 타입으로 바인딩된다.
String) 10이다.@RequestParam을 사용하면 문자 10을 Integer 타입의 숫자 10으로 변환된다.@ModelAttribute, @PathVariable 에서도 타입 변환을 확인할 수 있다.Spring에서 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스로 타입 변환 로직을 캡슐화하여 코드의 재사용성을 높이고 다양한 곳에서 타입 변환이 일관되게 수행되도록 돕는다.
localhost:8080/type-converter?person=wonuk:120Person 객체로 변환public class Person {
private String name;
private String age;
}
wonuk:120 → TypeConverter → name: wonuk , age : 10

데이터 유형 간 변환을 담당하는 메커니즘, 주로 웹 요청 파라미터를 Java 객체로 변환하거나 그 반대로 변환할 때 사용되며 커스텀 변환 로직을 정의할 수 있다.
주의점
- org.springframework.core.convert.converter
- Spring의 Converter와 같은 이름을 가진 Interface가 많으니 주의해야 한다.

TypeConverter 사용
TypeConverter 를 생성하여 직접 사용하면 컨트롤러에서 변환하는 방식과 큰 차이가 없다.PersonToStringConverter converter = new PersonToStringConverter();
String source = "wonuk:1200";
converter.convert(source);
String, Integer, Enum등 자주 사용되는 타입에 대한 컨버터를 제공하고 사용할 수 있도록 등록되어 있다.Spring에서 제공하는 다양한 Converter 인터페이스가 존재하며 이들은 Spring의 데이터 바인딩, 요청/응답 처리, 속성 값 주입 등에 사용되고 ConversionService를 통해 등록 및 관리된다.
Converter Converter<Source, Type>ConverterFactoryGenericConverterConditionalGenericConverter GenericConverter 의 확장형으로 특정 조건에서만 타입 변환을 수행한다.matches() 를 통해 변환 가능 여부를 판단할 수 있다.Spring은 Converter를 모아서 편리하게 관리하고 사용할 수 있게 해주는 기능을 제공한다. 이것이 Conversion Service 이다.

canConvert()convert()Spring의 표준 ConversionService로 기본 제공 Converter와 확장 가능성을 통해 다양한 타입 변환을 유연하게 처리할 수 있도록 지원한다.
ConversionService를 구현한 구현체Converter를 등록하고 관리하는 기능을 제공한다.import static org.assertj.core.api.Assertions.*;
public class ConversionServiceTest {
@Test
void defaultConversionService() {
// given
DefaultConversionService dcs = new DefaultConversionService();
dcs.addConverter(new StringToPersonConverter());
Person wonuk = new Person("wonuk", 100);
// when
Person stringToPerson = dcs.convert("wonuk:1200", Person.class);
// then
assertThat(stringToPerson.getName()).isEqualTo(wonuk.getName());
assertThat(stringToPerson.getAge()).isEqualTo(wonuk.getAge());
}
}
ConversionService 내부에서 숨겨진채 제공된다.ConversionService가 컨버터를 찾는다.ConversionService 인터페이스만 의존하면 된다.클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리하는 원칙
인터페이스 분리 원칙(ISP)

DefaultConversionServiceConversionRegistry : 컨버터 등록ConversionService **: **컨버터 사용ConversionRegistry 가 변경되어도 ConversionService와 연관이 없다.Spring은 내부적으로 ConversionService를 사용해 타입을 변환한다. 대표적으로 @RequestParam , @PathVariable, @ModelAttribute 등이 해당 기능을 사용한다.