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);
}
장점 : 예외처리, 대문자, 소문자, 섞여도 처리 가능.
단점 : 코드가 길어지고 복잡해짐.
'SpringBoot > TOgether' 카테고리의 다른 글
| postman post시 데이터의 id값이 null이 생기는 이유 (0) | 2024.01.17 |
|---|---|
| spring boot controller 테스트1: mysql 데이터 넣기 (0) | 2024.01.16 |