이번 블로그 포스팅에서는 Spring MVC에서 Enum 타입을 소문자로 받기 위하여 Converter 인터페이스를 사용하는 방법에 대해서 다뤄보겠습니다.
배경
저희 팀이 현재 진행 중인 사이드 프로젝트를 간단히 설명하자면 책에 대한 후기를 남기는 웹 서비스입니다. 최근에 이 사이드 프로젝트에서 새로운 기능으로 각 책에 대한 리액션(좋아요, 싫어요 등등)을 추가할 수 있는 기능을 구현하는 게 어떻냐는 이야기가 나왔고, 이를 구현하기 위해서 각 리액션 타입을 Enum으로 정의하였습니다.
문제점
하지만 기능을 구현하는 데에 있어서 문제점이 있었습니다. Spring MVC에서는 기본적으로 Enum 타입을 대문자로 처리합니다.
예를 들어서 @PathVariable을 통해서 Enum 타입 값을 받을 때 URL에서 대문자로 전달해야 합니다.
하지만 이는 사용자 입장에서 URL에 대문자를 사용해야 하기 때문에 불편함을 초래할 수 있습니다.
이를 해결하기 위해서 URL에서도 Enum 타입을 소문자로 받을 수 있어야 했습니다.
해결 방법: Spring Converter 사용
Spring MVC에서 Converter를 사용하여 Enum을 소문자로 처리하는 방식을 채택했습니다.
구현하기 위한 코드들은 다음과 같습니다.
- Enum 타입을 정의
public enum ReactionType {
LIKE, DISLIKE;
}
- Converter를 구현
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
@Component
public class StringToReactionTypeConverter implements Converter<String, ReactionType> {
@Override
public ReactionType convert(String source) {
try {
return ReactionType.valueOf(source.toUpperCase());
} catch (IllegalArgumentException e) {
throw new NotFoundException("리액션 등록 실패","유효하지 않은 ReactionType입니다.");
}
}
}
- WebMvcConfigurer 설정
(2) 에서 구현한 Converter를 Spring MVC 설정으로 등록해주어야 합니다.
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final StringToReactionTypeConverter stringToReactionTypeConverter;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(stringToReactionTypeConverter);
}
}
- Controller에서 사용
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/reaction")
public class ReactionController {
@PostMapping("/{reactionType}")
public String reactToBook(@PathVariable ReactionType reactionType) {
return "Reaction: " + reactionType;
}
}
위의 코드 과정을 거친다면 /api/reaction/like처럼 요청에서 ReactionType을 소문자로 보내도 Converter에 의해 ReactionType.LIKE로 변환됩니다.
Spring Converter를 사용하면 Enum 타입을 소문자로 받을 수 있습니다.
'공부 > Spring' 카테고리의 다른 글
| [JUnit] 여러 매개변수를 테스트해야 한다면? @ParameterizedTest (0) | 2024.08.25 |
|---|---|
| [Spring] Spring Security 없이 카카오 로그인 구현하기 (0) | 2024.07.28 |