티스토리 뷰

728x90

일반적으로 enum 클래스는 마셜링할 때 enum 상수 이름 그대로 변경된다.

마셔링 과정에서 enum 상수를 변경할 때 toString() 메서드를 사용하고, 이 메서드가 enum 상수 이름을 리턴하기 때문이다.

 

이런 방식은 REST-API 응답을 유연하게 설계할 수 없고, REST-API 설계에 따라 코드에도 영향을 주므로 유연한 프로그래밍을 할 수 없다.

그래서 응답 값과 enum 상수 값은 따로 분리하면 좋다.

 

ex) 애플리케이션 에서는 SINGLE 이라는 enum 상수값이지만 클라이언트에게 응답할 때는 "single"이라는 문자열 값을 리턴.

public enum HotelRoomType {
    SINGLE("single"),
    DOUBLE("double"),
    TRIPLE("triple"),
    QUAD("quad");

    private final static Map<String, HotelRoomType> paramMap = Arrays.stream(HotelRoomType.values()).collect(Collectors.toMap(HotelRoomType::getParam, Function.identity()));
    private final String param;

    HotelRoomType(String param) {
        this.param = param;
    }

    @JsonValue
    public String getParam() {
        return param;
    }

    @JsonCreator
    public static HotelRoomType fromParam(String param) {
        return Optional.ofNullable(param)
                .map(paramMap::get)
                .orElseThrow(() -> new IllegalArgumentException("param is not valid"));
    }

}

다음 HotelRoomType enum 클래스는 열거형 상수가 선언되어 있고 각 열거형 상수가 마셜링 될 때 클라이언트에게 열거형 상수 이름이이 아닌 문자열로 변경할 수 있는지 확인해본다.

 

마셜링 과정에서 값을 변경하는 메서드를 지정하는 @JsonCreator 애너테이션 설정이 되어 있다.

그러므로 마셜링 과정에서 JSON 속성 값이 "single"이면 formParam 메서드가 SINGLE로 변경한다.

 

@JsonValue 애너테이션은 마셜링 과정에서 enum을 문자열 변환하는데 사용하는 toString() 메서드를 대신할 메서드를 설정하는 데 사용된다.

 

코드에서는 getParam() 메서드가 리턴하는 문자열이 JSON 속성 값으로 사용된다.

참고

https://www.yes24.com/Product/Goods/115306377

 

스프링 부트로 개발하는 MSA 컴포넌트 - 예스24

마이크로서비스 아키텍처 환경에서컴포넌트를 개발할 때 무엇이 필요한지 알아보고,이때 필요한 스프링 부트 사용법을 익힌다!마이크로서비스 아키텍처는 대규모 서비스의 ‘정답’처럼 여겨

www.yes24.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함