타입 변환
Spring에서 객체의 타입을 서로 변환하는 데 사용되는 인터페이스로 Spring의 데이터 바인딩 과정에서 문자열을 특정 객체로 변환하거나 하나의 객체 타입을 다른 타입으로 변환할 때 사용한다.
💡 참고
문자를 숫자로, 숫자를 문자로 변환하는 등 Web Application을 만들다보면 Type을 변환해야 하는 경우가 많이 발생한다.
문자열을 숫자로
HttpServeltRequest를 숫자로 변환예시
@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);
}
}
요청 파라미터는 문자열로 처리된다.
다른 타입으로 변환해서 사용하고자 한다면 위와같이 검증 및 변환하는 과정이 필요하다.
@RequestParam을 숫자로 변환예시
@GetMapping("/v2/param")
public void paramV2(@RequestParam Integer example) {
// Integer 타입으로 바인딩
log.info("example = {}", example);
}
추가적인 변환 작업을 거치지 않고 Integer 타입으로 바인딩 된다.
결론
Spring 내부에서 타입을 자동으로 변환한다.
Converter Interface
Spring에서 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스로 타입 변환 로직을 캡슐화하여 코드의 재사용성을 높이고 다양한 곳에서 타입 변환이 일관되게 수행되도록 돕는다.
Spring에서 제공하는 인터페이스로 구현하여 Converter로 등록하면 된다.
Converter 구현
데이터 유형 간 변화를 담당하는 메커니즘, 주로 웹 요청 파라미터를 Java 객체로 변환하거나 그 반대로 변환할 때 사용되며 커스텀 변환 로직을 정의할 수 있다.
주의점
org.springframework.core.convert.converter를 사용해야 한다
Spring의 Converter와 같은 이름을 가진 인터페이스가 많으니 주의해야 한다.
코드 예시
다음은 String에서 Integer로 변환하는 예시이다
@Slf4j
public class StringToIntegerConverter implements Converter<String, Integer> {
@Override
public Integer convert(String source) {
log.info("source = {}", source);
// 검증
return Integer.valueOf(source);
}
}
다음은 Stirng에서 Person이란 클래스로 변환하는 예시이다.
@Getter
public class Person {
// 이름
private String name;
// 나이
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
요청 예시 : /saveperson?person=seonu:1200
public class StringToPersonConverter implements Converter<String, Person> {
// source = "wonuk:1200"
@Override
public Person convert(String source) {
// ':' 를 구분자로 나누어 배열로 만든다.
String[] parts = source.split(":");
// 첫번째 배열은 이름이다. -> wonuk
String name = parts[0];
// 두번째 배열은 개월수이다. -> 1200
int months = Integer.parseInt(parts[1]);
// 개월수 나누기 12로 나이를 구하는 로직 (12개월 단위만 고려)
int age = months / 12;
return new Person(name, age);
}
}
Spring의 다양한 Converter
Spring에서 제공하는 다양한 Converter 인터페이스가 존재하며 이들을 Spring의 데이터 바인딩, 요청/응답 처리, 속성 값 주입 등에 사용되고 ConversionService를 통해 등록 및 관리된다.
Converter
기본적인 변환을 담당하는 인터페이스이다.
단일 타입에서 단일 타입으로 변환할 때 사용한다.
ConverterFactory
클래스 계층 구조가 복잡한 경우 사용한다.
기본 타입과 다양한 서브 타입 간의 변환을 지원한다.
GenericConverter
다양한 타입 간의 유연한 변환을 지원한다.
복잡한 타입 변환 로직을 구현할 때 유리하다.
ConditionalGenericConverter
GenericConverter의 확장형으로 특정 조건에서만 타입 변환을 수행한다.
추가적으로 matches( ) 를 통해 변환 가능 여부를 판단할 수 있다.
공식문서
아래에 Type Conversion에 대한 공식문서 링크가 있다.
'스프링 프레임워크' 카테고리의 다른 글
Spring Formatter (1) | 2024.11.27 |
---|---|
ConversionService (0) | 2024.11.27 |
WebMvcConfigure (0) | 2024.11.27 |
ArgumentResolver (1) | 2024.11.27 |
HttpMessageConverter (0) | 2024.11.27 |