SpringBoot/TOgether

ConverterFactory 생성과 등록. String -> Enum 변환

kangchaewon 2024. 1. 17. 23:32

Spring에서 요청 매개 변수로 열거 형 사용 (tistory.com)

 

Spring에서 요청 매개 변수로 열거 형 사용

1. 소개 대부분의 일반적인 웹 애플리케이션에서는 요청 매개 변수를 사전 정의 된 값 세트로 제한해야하는 경우가 많습니다. 열거 형은이를 수행하는 좋은 방법입니다. 이 빠른 예제에서는 Sprin

memo-the-day.tistory.com

클라이언트로부터

{
            "id": 2,
            "memberId": 23,
            "title": "제목2",
            "gender": "FEMALE",
            "personNum": 2,
            "content": "내용2",
            "status": "ING",
            "view": 50,
            "category": "EAT"
        },
enum값인 gender, category, status를 string으로 가져오게 됨.
Entitiy 에는 ENUM 으로 설정했기때문에 String타입으로 가져오고 ENUM으로 변경하여 비교하는 작업이 필요.
그래서 enum타입으로 가져와서 사용할 수 있도록 하는 converter를 만들었음.
 
@SuppressWarnings({"rawtypes", "unchecked"})
public final class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {


    @Override
    public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
        return new StringToEnumConverter<>(targetType);
    }

    public static class StringToEnumConverter<T extends Enum<T>> implements Converter<String, T> {
        private final Class<T> enumType;

        public StringToEnumConverter(Class<T> enumType) {
            this.enumType = enumType;
        }

        @Override
        public T convert(String source) {
            try {
                return Enum.valueOf(enumType, source.toUpperCase());
            } catch (IllegalArgumentException e) {
                e.getMessage(); // "not exists enum value "
                return null;
            }
        }
    }
}

- ConverterFactory : 주어진 소스타입에서 대상 타입으로의 변환을 처리하는 인터페이스.

위 코드에서는 문자열 -> Enum으로 변환을 함.

- @SuppressWarnings : raw타입 사용에 대한 결고를 무시함. Converter인터페이스가 raw타입을 사용하기 때문에, 이를 무시하기 위해 추가됨. -> 더 자세한 공부 필요

 

- getConverter메서드 오버라이드 : 반환할 대상 Enum 타입을 받아서 해당 타입에 대한 Converter를 반환. 문자열을 특정 Enum으로 변환하여 반환하는 객체 생성

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverterFactory(new StringToEnumConverterFactory());
    }
}

- StringToEnumConverterFactory클래스를 사용하기 위해서는 해당 팩토리를 ConversionService에 등록해야 함.

이를 통해 Spring이 해당 팩토리를 사용하여 문자열을 Enum으로 변환할 수 있음.

- addFormatters 메서드를 통해 등록. -> Spring은 문자열을 Enum으로 변환할 때 등록된 이ㅣ 팩토리를 사용.

 // 팩토리 인스턴스 생성
 StringToEnumConverterFactory factory = new StringToEnumConverterFactory();
  @GetMapping("/category")
    public ResponseEntity<?> findPostsByEnumCategory(@RequestParam Category category) {
        
        // 컨버터 생성
        StringToEnumConverterFactory.StringToEnumConverter<Category> converter =
                (StringToEnumConverterFactory.StringToEnumConverter<Category>) factory.getConverter(Category.class);
        Category categoryEnum = converter.convert(String.valueOf(category));

        List<Post> entities = service.retrievePostsByCategory(categoryEnum);
        List<PostRequestDTO> dtos = entities.stream().map(PostRequestDTO::new).collect(Collectors.toList());
        PostResponseDTO<PostRequestDTO> response = PostResponseDTO.<PostRequestDTO>builder().
                data(dtos)
                .build();
        return ResponseEntity.ok().body(response);

        List<Post> entities = service.retrievePostsByCategory(category);

    }

장점 : 예외처리, 대문자, 소문자, 섞여도 처리 가능. 

단점 : 코드가 길어지고 복잡해짐.