Java&Web

[Enum] Enum을 Binding해주는 Custom Converter

프로그래민 2021. 1. 13. 22:38
반응형
1
2
3
4
5
6
7
8
9
10
11
12
public enum Status {
    UNCHECKED(1),
    APPROVED(2),
    BLOCKED(3);
 
    @Getter
    private final int statusCode;
 
    Status(int statusCode) {
        this.statusCode = statusCode;
    }
}
                                                                                                             

위와 같은 Enum 클래스를 사용한다고 가정하자. 클라이언트쪽에서 서버쪽으로 요청을 보낼때 인자값으로 위의 Enum에 등록된 값을 하나 사용할려고 한다. 이때, 클라이언트쪽에서 요청을 보낼때 Enum에 등록된 UNCHECKED, APPROVED, BLOCKED로 서버에 보낸다면 인자값을 받음에 있어 문제가 없을 것이다. 하지만 만약 unchecked, approved, blocked로 온다면 서버쪽에서는 값을 받지 못할 것이다.

개발을 하다가 실제로 위와 같은 상황을 맞이해서 직접 요청을 Binding 해주는 Custom Converter를 만들어 Spring에 등록해보았다.

 

StringToStatusConverter 클래스 생성

1
2
3
4
5
6
public class StringToStatusConverter implements Converter<String,Status> {
    @Override
    public Status convert(String str) {
        return Status.valueOf(str.toUpperCase());
    }
}
                                                   

앞서 정의한 Status Enum 클래스에 대해 Binding을 해주기 위해 StringToStatusConverter 클래스를 구현하고 convert 함수내에서 대문자로 바꾸주는 로직을 구현하였다.

 

Config에 Converter 등록

1
2
3
4
5
6
7
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToStatusConverter());
    }
}
                                                                  

앞서 정의한 Converter를 WebConfig 클래스에 추가해주었다. 이러한 Converter를 등록해줌으로써 클라이언트로부터 들어오는 소문자 입력까지도 처리할 수 있도록 되었다.

 

출처
medium.com/@lifecluee/string%EC%9D%84-%EA%B3%A0%EC%A7%91%ED%95%98%EB%8A%94-controller-%EA%B0%9C%EC%84%A0%EA%B8%B0-721cba570756
www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-mvc-custom-converter.html

 

반응형