@RequestBody로 받는 Enum 타입 값들은 @JsonCreater를 사용해 받을 수 있었다!
@JsonCreator
public static PostStatus create(String requestValue) {
return Stream.of(values())
.filter(v -> v.key.equalsIgnoreCase(requestValue))
.findFirst()
.orElseThrow(() -> new BadRequestException(INVALID_POST_STATUS));
}
그렇다면 @RequestParam으로 받아야 하는 Enum 값들은 어떻게 받아야 할까?
@RequestParam은 주로 쿼리스트링이나 폼 데이터와 관련이 있다.
@RequestParam을 사용하는 경우에는 URL에서 전달되는 값이기 때문에 JSON 형식이 아니라 단순한 문자열이나 숫자 등의 형태가 될 것이다! @JsonCreator는 JSON 데이터를 객체로 변환할 때 사용되는데, URL 파라미터는 JSON 형식이 아니므로 적용되지 않는다.
따라서 @RequestParam을 사용하는 경우에는 @JsonCreator 대신 간단한 변환 메서드나 다른 방법을 사용하여 값을 변환해야 한다. 일반적으로 @RequestParam을 사용할 때는 컨트롤러 메서드에서 직접 변환하는 로직을 작성하거나, Converter를 등록하여 사용하는 것이 일반적인 접근 방법이라고 한다!
나는 @RequestParam으로 Enum값을 받을 때마다 변환하는 로직을 사용하기 보다는 Converter를 등록하여 사용하는 것이 좋다고 판단하였다!
따라서 다음과 같이 Converter와, WebConfig를 구현하였다.
PostStatusConverter
public class PostStatusConverter implements Converter<String, PostStatus> {
@Override
public PostStatus convert(String source) {
if (!StringUtils.hasText(source)) return null;
return PostStatus.create(source);
}
}
WebConfig
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new PostStatusConverter());
}
}
여기서 궁금했던 점이 있다!
@RequestBody로 들어오는 Enum 타입에 @JsonCreater와 Converter 둘다 거치게 된다면 이중 변환 돼서 Exception이 터지지 않을까?
이 질문에 대한 답변은 다음과 같다!
@RequestParam과 @RequestBody를 함께 사용하는 경우,
- @RequestParam은 등록한 컨버터를 통해 문자열을 변환
- @RequestBody는 Jackson이 제공하는 기능에 따라 JSON을 객체로 변환
→ 서로 동시에 적용되지 않으며, 서로 다른 매커니즘을 통해 작동한다고 함!
(@RequestBody를 통해 들어온 JSON 데이터는 스프링의 HttpMessageConverter들에 의해 객체로 변환, 이때 주로 Jackson 라이브러리를 사용하여 JSON 데이터를 Java 객체로 매핑하게 되며, @JsonCreator 어노테이션은 Jackson에 의해 사용되어 JSON 데이터를 객체로 변환할 때 호출된다!)
'Spring Boot' 카테고리의 다른 글
Spring Boot Batch (0) | 2024.04.15 |
---|---|
JUnit과 Mockito 기반의 Spring 단위 테스트 코드 작성 방법 (1) | 2023.08.20 |
단위 테스트(Unit Test)와 통합 테스트 (0) | 2023.08.20 |
API 예외 처리 (0) | 2023.07.12 |
서블릿 필터, 스프링 인터셉터 (0) | 2023.07.10 |