본문 바로가기
공부/Spring

[Spring]Spring Converter를 사용한 이유: Enum 타입을 소문자로 받기 위하여

by KimSuyong 2024. 8. 5.

이번 블로그 포스팅에서는 Spring MVC에서 Enum 타입을 소문자로 받기 위하여 Converter 인터페이스를 사용하는 방법에 대해서 다뤄보겠습니다.

배경


저희 팀이 현재 진행 중인 사이드 프로젝트를 간단히 설명하자면 책에 대한 후기를 남기는 웹 서비스입니다. 최근에 이 사이드 프로젝트에서 새로운 기능으로 각 책에 대한 리액션(좋아요, 싫어요 등등)을 추가할 수 있는 기능을 구현하는 게 어떻냐는 이야기가 나왔고, 이를 구현하기 위해서 각 리액션 타입을 Enum으로 정의하였습니다.

 

 

 

문제점


하지만 기능을 구현하는 데에 있어서 문제점이 있었습니다. Spring MVC에서는 기본적으로 Enum 타입을 대문자로 처리합니다.

예를 들어서 @PathVariable을 통해서 Enum 타입 값을 받을 때 URL에서 대문자로 전달해야 합니다.

 

하지만 이는 사용자 입장에서 URL에 대문자를 사용해야 하기 때문에 불편함을 초래할 수 있습니다.

이를 해결하기 위해서 URL에서도 Enum 타입을 소문자로 받을 수 있어야 했습니다.

 

 

 

해결 방법: Spring Converter 사용


Spring MVC에서 Converter를 사용하여 Enum을 소문자로 처리하는 방식을 채택했습니다.

 

구현하기 위한 코드들은 다음과 같습니다.

 

  1. Enum 타입을 정의
public enum ReactionType {
    LIKE, DISLIKE;
}

 

 

 

  1. 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입니다.");
        }
    }
}

 

 

 

  1. 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);
    }
}

 

 

 

  1. 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 타입을 소문자로 받을 수 있습니다.