1. 소개

대부분의 일반적인 웹 애플리케이션에서는 요청 매개변수를 미리 정의된 값 세트로 제한해야 하는 경우가 많습니다. Enum은 이를 수행하는 좋은 방법입니다.

이 빠른 사용방법(예제)에서는 Spring MVC에서 웹 요청 매개 변수로 enum을 사용하는 방법을 보여줍니다.

2. Enum을 요청 매개변수로 사용

먼저 예제에 대한 Enum을 정의해 보겠습니다.

public enum Modes {
    ALPHA, BETA;
}

그런 다음 이 Enum을 Spring 컨트롤러에서 RequestParameter 로 사용할 수 있습니다 .

@GetMapping("/mode2str")
public String getStringToMode(@RequestParam("mode") Modes mode) {
    // ...
}

또는 PathVariable 로 사용할 수 있습니다 .

@GetMapping("/findbymode/{mode}")
public String findByEnum(@PathVariable("mode") Modes mode) {
    // ...
}

/mode2str?mode=ALPHA 와 같은 웹 요청을 할 때 요청 매개변수는 String 객체입니다. Spring은 StringToEnumConverterFactory 클래스 를 사용하여 이 String 객체를 Enum 객체로 변환하려고 시도할 수 있습니다 .

백엔드 변환은 Enum.valueOf 메서드를 사용합니다. 따라서 입력 이름 문자열은 선언된 Enum 값 중 하나와 정확히 일치해야 합니다 .

/mode2str?mode=unknown  과 같이 enum 값 중 하나와 일치하지 않는 문자열 값으로 웹 요청을 만들면 Spring은 지정된 enum 유형으로 변환하지 못합니다. 이 경우 ConversionFailedException 이 발생합니다 .

3. 커스텀 컨버터

Java에서는 Enum 값을 상수이므로 대문자로 정의하는 것이 좋습니다. 그러나 요청 URL에서 소문자를 지원하기를 원할 수 있습니다.

이 경우 사용자 지정 변환기를 만들어야 합니다.

public class StringToEnumConverter implements Converter<String, Modes> {
    @Override
    public Modes convert(String source) {
        return Modes.valueOf(source.toUpperCase());
    }
}

사용자 지정 변환기를 사용하려면 Spring 구성에 등록 해야 합니다 .

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToEnumConverter());
    }
}

4. 예외 처리

StringToEnumConverter  의 Enum.valueOf 메서드는 모드 열거 형 일치하는 상수가 없는 경우 IllegalArgumentException을 발생시킵니다 . 요구 사항에 따라 다양한 방식으로 사용자 지정 변환기에서 이 예외를 처리할 수 있습니다.

예를 들어, 변환기가 일치하지 않는 String 에 대해 null을 반환하도록 할 수 있습니다 .

public class StringToEnumConverter implements Converter<String, Modes> {
    @Override
    public Modes convert(String source) {
        try {
            return Modes.valueOf(source.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
}

그러나 사용자 지정 변환기에서 로컬로 예외를 처리하지 않으면 Spring은 호출 컨트롤러 메서드에 ConversionFailedException 예외를 발생시킵니다. 이 예외를 처리하는 방법에는 여러 가지가 있습니다 .

예를 들어 전역 예외 처리기 클래스를 사용할 수 있습니다.

@ControllerAdvice
public class GlobalControllerExceptionHandler {
    @ExceptionHandler(ConversionFailedException.class)
    public ResponseEntity<String> handleConflict(RuntimeException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

5. 결론

이 짧은 기사에서 우리는 몇 가지 코드 예제와 함께 Spring에서 요청 매개변수로 Enum을 사용하는 방법을 배웠습니다.

또한 입력 문자열을 Enum 상수에 매핑할 수 있는 사용자 지정 변환기 예제를 제공했습니다.

마지막으로 알 수 없는 입력 문자열을 만났을 때 Spring이 던진 예외를 처리하는 방법에 대해 논의했습니다.

항상 그렇듯이 이 기사의 소스 코드는 GitHub에서 사용할 수 있습니다 .

res – REST with Spring (eBook) (everywhere)