[Spring] ConversionService

이연우·2025년 8월 18일

TIL

목록 보기
79/100

🧰 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에만 의존하면 됨
    → “어떤 컨버터가 쓰였는지” 몰라도 목표 타입만 지정하면 변환 완료
  • 장점: 등록(Registry)과 사용(Service)의 분리

✂️ 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 사용

0개의 댓글