PathVariable, RequestParam을Enum으로 매핑하는 방법

Hansu Park·2023년 11월 6일
0
post-thumbnail

(Spring 3.1 환경에서 실습하였습니다.)

도입

스프링의 Controller에서는 @RequestParam, @PathVariable 을 통해 파라미터나 쿼리를 인자로 활용할 수 있다. 하지만 이는 정수형 혹은 문자열 타입으로만 제한되어 활용이 가능하다. (대문자 입력에 한하여 Enum으로 매핑해주긴 하지만 불편하다.) 따라서 입력을 Enum과 같은 타입으로 변환해주기 위해선 별도 코드가 필요하다.

스프링에서는 Converter을 이용하여 입력한 타입을 원하는 객체로 간편하게 자동으로 변환할 수 있다.

Converter은 스프링3 이후 도입된 타입 변환 API로, 이전에 사용했던 PropertyEditor이 멀티쓰레딩 미지원으로 인해 갖게 된 문제들인 (1) 매 바인딩마다 객체를 생성한다는 점 (2) 싱글톤으로 선언할 수 없어 스프링과 어울리지 않는다는 점을 극복하기 위해 등장하였다.

컨버터 적용 방법

Converter를 적용하는 방법을 살펴보자.

Converter
1. Converter 선언
2. ConversionServiceConverter 등록
3. annotation-driven 에 의해 ConversionService 등록

과정을 거쳐야 스프링에 등록되어 활용할 수 있다. 아래 예제를 통해 살펴보자.

1. 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 를 통해 빈이 등록되어야 활용이 가능하다.

2. ConversionServiceConverter 추가

ConversionService는 여러 컨버터들을 하나의 객체로 이용할 수 있도록 돕는 역할을 한다. ConverterConversionService에 추가하는 과정을 살펴보자.

ConversionService을 선언하고 등록하는 방법은 xml을 이용하는 방법과 자바 코드를 이용하는 방법 두 가지가 있다. 이 두 가지 방법에 대해 살펴보자.

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에서 사용된다.
    - Spring Boot 환경에서는 이가 내장되어 있어 적지 않아야 한다.
    - 추후 소개할 annotation-driven 태그의 활용과 동일한 역할을 한다.

3. ConversionService 의 활용

XML 방식

<mvc:annotation-driven conversion-service="conversionService">를 추가한다.

  • annotation-drvein: 여러 어노테이션들에 대한 설정을 자동으로 해준다.
  • conversion-service="conversionService": conversionService에 대해 등록하였음을 명시한다. 없어도 자동으로 동작할 수도 있지만, 그래도 등록해주자.

코드 이용 방식

@EnableWebMvc을 등록했다면 annotation-drvein와 마찬가지로 설정 자동화 역할을 해준다.

고찰

  • Enum 입력에 대문자를 사용하는 경우는 이러한 과정이 없어도 자동으로 변환이 되지만, 편의성을 위해 이번 문서와 같은 과정이 필요했다.
  • 토비의 스프링 예제를 참고했으나, annotation-driven의 XML 자동 등록은 구글 링크를 참고했다. (몇몇 부분 필요없는 부분들은 지웠다.)
  • RequestBody에도 Enum을 넣을 수 있다던데 이는 무척 어려워보인다.

참고

0개의 댓글