🔄 Converter 구현이란?
Converter는 데이터 유형 간 변환을 담당하는 메커니즘- 웹 요청 파라미터를 Java 객체로 변환하거나 그 반대로 변환할 때 사용
- 개발자가 커스텀 변환 로직을 정의할 수 있음
⚠️ 주의점
Converter라는 이름의 인터페이스는 여러 곳에서 제공됨org.springframework.core.convert.converter.Converter🧪 코드 예시
1) String → Integer
@Slf4j
public class StringToIntegerConverter implements Converter<String, Integer> {
@Override
public Integer convert(String source) {
log.info("source = {}", source);
return Integer.valueOf(source); // 문자열 → 숫자 변환
}
}
2) Integer → String
@Slf4j
public class IntegerToStringConverter implements Converter<Integer, String> {
@Override
public String convert(Integer source) {
log.info("source = {}", source);
return String.valueOf(source); // 숫자 → 문자열 변환
}
}
3) String → Person (커스텀 객체 변환)
@Getter
public class Person {
private String name;
private int age; // 나이(년 단위)
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class StringToPersonConverter implements Converter<String, Person> {
@Override
public Person convert(String source) {
// "wonuk:1200"
String[] parts = source.split(":");
String name = parts[0]; // wonuk
int months = Integer.parseInt(parts[1]); // 1200
int age = months / 12; // 1200개월 → 100살
return new Person(name, age);
}
}
4) Person → String
public class PersonToStringConverter implements Converter<Person, String> {
@Override
public String convert(Person source) {
String name = source.getName();
int months = source.getAge() * 12;
return name + ":" + months; // "wonuk:1200"
}
}
🛠️ TypeConverter 사용
converter.convert(source)로 변환할 수 있음PersonToStringConverter converter = new PersonToStringConverter();
String source = "wonuk:1200";
converter.convert(source);
→ 컨트롤러 안에서 변환하는 것과 큰 차이가 없어 보일 수 있지만,
스프링은 Converter를 자동으로 등록/관리해 주기 때문에 훨씬 편리함
→ 기본적으로 자주 쓰이는 타입(String, Integer, Enum 등)에 대한 Converter는 이미 제공됨
🧰 Spring의 다양한 Converter 인터페이스
Spring에서 제공하는 다양한Converter인터페이스가 존재하며
이들은Spring의 데이터 바인딩, 요청/응답 처리, 속성 값 주입 등에 사용되고
ConversionService를 통해 등록 및 관리됨
1. Converter<S, T>
String → Integer2. ConverterFactory<S, R>
3. GenericConverter
4. ConditionalGenericConverter
GenericConverter 확장형matches() 메서드로 변환 가능 여부를 조건부 판단📖 공식 문서: Spring Type Conversion
🧠 요약 정리
| 구분 | 설명 | 예시 |
|---|---|---|
| Converter | 기본 변환 인터페이스 단일 타입 → 단일 타입 변환 | String → Integer, Integer → String |
| Converter 구현 예시 | 개발자가 커스텀 타입 변환 로직 구현 | String → Person,Person → String |
| TypeConverter 사용 | converter.convert(source) 호출로 변환 수행 | "wonuk:1200" → Person(name=wonuk, age=100) |
| ConverterFactory | 복잡한 클래스 계층 구조 변환 지원 | Number → 서브 클래스들 |
| GenericConverter | 다양한 타입 간 유연한 변환 지원 | Map<String, Object> → CustomObject |
| ConditionalGenericConverter | 조건부 변환 지원 (matches() 사용) | 특정 상황에서만 변환 허용 |
| Spring 기본 제공 Converter | String ↔ Integer, String ↔ Enum 등 자주 쓰이는 변환 내장 | 추가 등록 없이 바로 사용 가능 |