Spring Framework에서 Type Converter는 문자열(String)과 Java 객체 간의 타입 변환을 지원하는 인터페이스입니다. 주로 사용자 입력 데이터나 설정 값을 애플리케이션에서 사용 가능한 객체로 변환할 때 사용됩니다.
Type Converter의 역할:
String → Integer) LocalDate → String) Spring MVC는 폼 데이터를 컨트롤러의 매개변수로 전달하거나, 객체를 응답으로 반환할 때 이 기능을 활용합니다.
Spring은 ConversionService를 통해 기본적인 타입 변환을 제공합니다.
기본적으로 지원되는 변환에는 다음과 같은 것들이 포함됩니다:
String → 기본 자료형 (int, double, boolean 등) String → Wrapper 클래스 (Integer, Long 등) String → Enum String → Date (포맷 필요) Spring에서 Converter 인터페이스를 사용해 커스텀 타입 변환기를 구현할 수 있습니다.
Converter 인터페이스 구조:
public interface Converter<S, T> {
T convert(S source);
}
String 타입을 LocalDate로 변환하는 Converter를 구현해 보겠습니다.
Custom Converter:
import org.springframework.core.convert.converter.Converter;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateConverter implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String source) {
return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
}
Converter 등록:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToLocalDateConverter());
}
}
StringToLocalDateConverter를 등록하면 컨트롤러에서 String 입력을 자동으로 LocalDate로 변환합니다.
@PostMapping("/events")
public String createEvent(@RequestParam("date") LocalDate date) {
System.out.println("Event Date: " + date); // 변환된 LocalDate 객체
return "Event created!";
}
요청 예시:
POST /events?date=2024-11-21
Spring은 객체를 문자열로 변환할 때에도 같은 ConversionService를 사용합니다.
Spring Boot는 자동으로 ConversionService를 구성하며, 커스텀 Converter를 쉽게 등록할 수 있도록 설정을 제공합니다.
Spring Boot에서 Converter 등록:
@Bean
public Converter<String, LocalDate> stringToLocalDateConverter() {
return source -> LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
Converter:
String → LocalDate) Formatter:
public class LocalDateFormatter implements Formatter<LocalDate> {
@Override
public LocalDate parse(String text, Locale locale) throws ParseException {
return LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
@Override
public String print(LocalDate object, Locale locale) {
return object.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
}