개요
API 개발 도중 @PathVariable를 enum Type으로 설정 하였다.
이러다 보니 한가지 오류가 발생했는데
Enum에 없는 데이터가 넘어 오면 Exception이 발생 하였습니다.
이를 해결하기 위해 Spring Boot Converter를 사용하였습니다.
이는 @PathVariable 뿐만 아니라 @ModelAttribute, @RequestParam에서도 동작 한다고 되어 있다.
따라서 외부에서 날라오는 데이터를 바인딩 하는데 Header에 있는 데이터 뿐만 아니라 Body에 있는 데이터도 되는지 한번 확인해 봐야 할꺼 같다.(Stack Over Flow에서 비슷한 질문인데 확인 해봐 야 할거 같습니다.)
Spring Boot Document
Spring 3.0 Document에는 이렇게 정의 되어 있다.
Spring 3 introduces a core.convert package that provides a general type conversion system.
The system defines an SPI to implement type conversion logic, as well as an API to execute type conversions at runtime.
Within a Spring container, this system can be used as an alternative to PropertyEditors to convert externalized bean property value strings to required property types.
The public API may also be used anywhere in your application where type conversion is needed.
Spring 3에는 일반적인 유형 변환 시스템을 제공하는 core.convert 패키지가 도입되었습니다.
시스템은 유형 변환 로직을 구현하기 위한 SPI와 런타임에 유형 변환을 실행하기 위한 API를 정의합니다.
Spring 컨테이너 내에서 이 시스템은 외부화된 빈 속성 값 문자열을 필수 속성 유형으로 변환하기 위해 PropertyEditors의 대안으로 사용될 수 있습니다.
공용 API는 유형 변환이 필요한 응용 프로그램의 모든 위치에서 사용할 수도 있습니다.
사용방법
- 문제가 되는 Enum
public enum LangCode {
KO,
EN;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static LangCode findByCode(String name) {
return Stream.of(LangCode.values())
.filter(c -> c.name().equals(name.toUpperCase()))
.findFirst()
.orElse(null);
}
}
- Converter 만들기
// implements Converter를 작성한후 return 할 데이터를 Map Value에 작성한다.
public class EnumConverter <T extends Enum<T>> implements Converter<String, LangCode> {
@Override
public LangCode convert(String source) {
// Enum에 작성된 메서드 입니다.
// 작성된 데이터가 아니면 null을 Return 합니다.
return LangCode.findByCode(source.toUpperCase());
}
}
- Converter 등록
@Configuration
public class AppConfig implements WebMvcConfigurer {
// Configuration 에 converter를 등록한다.
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new EnumConverter());
}
}
완성
이후에 @PathValiable에 Enum에 등록된 데이터 말고 다른 데이터가 입력되도 Exception이 생기지 않고 단순히 null이 입력된다.
'BackEnd > Spring Boot' 카테고리의 다른 글
채팅 만들기_2(chatting_room) (0) | 2023.04.16 |
---|---|
채팅 만들기_1(basic) (0) | 2023.04.16 |
Enum 등록된 값 이외에 값 등록시 (0) | 2023.04.16 |
TypeHandler (0) | 2023.04.16 |
Exception Handler (0) | 2023.04.16 |