(Spring 3.1 환경에서 실습하였습니다.)
스프링의 Controller
에서는 @RequestParam
, @PathVariable
을 통해 파라미터나 쿼리를 인자로 활용할 수 있다. 하지만 이는 정수형 혹은 문자열 타입으로만 제한되어 활용이 가능하다. (대문자 입력에 한하여 Enum으로 매핑해주긴 하지만 불편하다.) 따라서 입력을 Enum과 같은 타입으로 변환해주기 위해선 별도 코드가 필요하다.
스프링에서는 Converter을 이용하여 입력한 타입을 원하는 객체로 간편하게 자동으로 변환할 수 있다.
Converter은 스프링3 이후 도입된 타입 변환 API로, 이전에 사용했던 PropertyEditor이 멀티쓰레딩 미지원으로 인해 갖게 된 문제들인 (1) 매 바인딩마다 객체를 생성한다는 점 (2) 싱글톤으로 선언할 수 없어 스프링과 어울리지 않는다는 점을 극복하기 위해 등장하였다.
Converter
를 적용하는 방법을 살펴보자.
Converter
는
1. Converter
선언
2. ConversionService
에 Converter
등록
3. annotation-driven
에 의해 ConversionService
등록
과정을 거쳐야 스프링에 등록되어 활용할 수 있다. 아래 예제를 통해 살펴보자.
Converter
선언우선 컨버터를 선언하는 과정이다.
Converter<String, Color>
를 구현함으로써 Color convert(String source)
를 구현해야 한다.
@Component
public class StringToColorTypeConverter implements Converter<String, Color> {
@Override
public Color convert(String source) {
return Color.valueOf(source); // Color라는 Enum에 매핑한다.
}
}
String인자를 Color Enum으로 변환함을 알 수 있다. 참고로 @Component
를 통해 빈이 등록되어야 활용이 가능하다.
ConversionService
에 Converter
추가 ConversionService
는 여러 컨버터들을 하나의 객체로 이용할 수 있도록 돕는 역할을 한다. Converter
를 ConversionService
에 추가하는 과정을 살펴보자.
ConversionService
을 선언하고 등록하는 방법은 xml을 이용하는 방법과 자바 코드를 이용하는 방법 두 가지가 있다. 이 두 가지 방법에 대해 살펴보자.
xml 파일에 아래와 같은 내용을 추가한다.
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="questapp.com.converter.StringToColorTypeConverter"/>
</list>
</property>
</bean>
(작성한 xml 코드)
<bean>
을 이용해 스프링 빈을 등록한다. class
는 실제로 생성될 클래스를 의미하며 등록되는 FormattingConversionServiceFactoryBean
는 여러 컨버터들의 생성 및 사용을 돕는 팩터리 객체이다.id
를 통해 conversionService
로 등록함을 알 수 있다.<list>
태그 안에 있는 컨버터들을 conversionService
안에 추가할 수 있도록 한다.WebConfig.java
파일을 만들어 아래와 같이 작성하자.
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ConversionServiceFactoryBean conversionService() {
ConversionServiceFactoryBean conversionService = new ConversionServiceFactoryBean();
conversionService.setConverters(Collections.singleton(new StringToColorTypeConverter()));
return conversionService;
}
}
위 코드는 기존에 xml방식과 동일하게 스프링 컨스트에 빈을 등록한다. 하지만, 내부 동작은 조금 다르다.
@Configuration
: 해당 클래스를 설정을 위한 빈으로 등록한다.@EnableMVC
: MVC에 관한 여러 설정을 자동으로 실행하도록 한다. 이 때 사용자가 정의한 ConversionService
가 스프링 MVC에서 사용된다.annotation-driven
태그의 활용과 동일한 역할을 한다.ConversionService
의 활용<mvc:annotation-driven conversion-service="conversionService">
를 추가한다.
annotation-drvein
: 여러 어노테이션들에 대한 설정을 자동으로 해준다.conversion-service="conversionService"
: conversionService
에 대해 등록하였음을 명시한다. 없어도 자동으로 동작할 수도 있지만, 그래도 등록해주자.@EnableWebMvc
을 등록했다면 annotation-drvein
와 마찬가지로 설정 자동화 역할을 해준다.
annotation-driven
의 XML 자동 등록은 구글 링크를 참고했다. (몇몇 부분 필요없는 부분들은 지웠다.)