🧰 ConversionService란?
- 여러 Converter를 모아 등록·관리하고 필요할 때 찾아 써 주는
스프링의 타입 변환 허브
📚 핵심 인터페이스 메서드
canConvert(sourceType, targetType) ➜ 변환 가능 여부 확인convert(source, targetType) ➜ 실제 변환 수행🧱 DefaultConversionService란?
- 스프링이 제공하는 표준 구현체
- 기본 컨버터들을 갖추고 확장(등록)도 쉬움
📚 기본 개념
ConversionService 구현체로 동작ConverterRegistry를 통해 다양한 Converter를 등록해 사용🧾 ConverterRegistry
addConverter(...) 등으로 커스텀 컨버터를 등록ConversionService가 타입·제네릭 정보를 기준으로 자동 선택해 사용🧪 코드 예시 및 해설
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());
}
}
DefaultConversionService dcs = new DefaultConversionService();
dcs.addConverter(new StringToPersonConverter()); // 1) 컨버터 등록
Person p = dcs.convert("wonuk:1200", Person.class); // 2) 변환 요청
ConversionService에만 의존하면 됨✂️ ISP(인터페이스 분리 원칙)란?
- 클라이언트가 쓰지 않는 메서드에 의존하지 않도록 인터페이스를 분리하는 원칙

DefaultConversionService는
ConverterRegistry (컨버터 추가/관리)ConversionService (canConvert/convert)분리 효과
💡 스프링 내부 사용 포인트
ConversionService를 활용해 타입 변환을 처리@RequestParam, @PathVariable, @ModelAttribute에서 자동 변환🧠 요약 정리
| 구분 | 핵심 역할 | 키 메서드/포인트 | 예시/비고 |
|---|---|---|---|
| ConversionService | 컨버터 검색·사용 허브 | canConvert, convert | 클라이언트는 이 인터페이스만 의존 |
| DefaultConversionService | 표준 구현체, 기본 컨버터 + 확장 용이 | addConverter(Registry와 결합) | 커스텀 컨버터 등록 후 즉시 사용 |
| ConverterRegistry | 컨버터 등록·관리 | addConverter | 등록과 사용의 책임 분리 |
| 코드 흐름 | 등록 → 변환 호출 | dcs.addConverter(...) → dcs.convert(...) | 컨버터 종류 몰라도 변환 OK |
| ISP 적용 | 인터페이스 분리로 결합도↓ | Registry(등록) ↔ Service(사용) | 변경 영향 최소화 |
| 스프링 적용처 | 요청/응답 바인딩 자동 변환 | @RequestParam, @PathVariable, @ModelAttribute | 내부적으로 ConversionService 사용 |