EnumValidate

213kky·2024년 2월 29일

문제상황

프로젝트 중 Enum을 검증 해야 했다.

원래는 아래와 같이 dto안에 Enum 자체를 받아 검증을 하려 했었다.

## DTO

@Getter
public class ProjectRequest {

    private String title;
    private String content;
    private Catagory category;
    private List<String> images;
    private List<Long> skillIds;
    private Meeting meeting;
    private Boolean isRecruiting;
}

## Enum 

public enum Meeting {
    온라인,
    오프라인
}

## Enum 

public enum ProjectCategory {
    TOY_PROJECT("토이 프로젝트"),
    PORTFOLIO_PROJECT("포트폴리오 프로젝트"),
    ETC("기타");

    private String value;

    ProjectCategory(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

{
  "title": "Example 2222e1",
  "content": "Example Content",
  "category": "PROJECT",  
  "images": ["image1.jpg", "image2.jpg"],
    "skillIds": [1,2,3],
    "meeting": "온라인"
}

위와 같이 Enum 자료형으로 값을 받도록 할 때, Enum에 선언되지 않은 값으로 요청을 보내면 HttpMessageNotReadableException이 발생하며

요약하자면 String "PROJECT":not one of the values accepted for Enum class = 입력으로 들어온 PROJECT는 enum값이 아니라 Exception이 발생된다.

하지만 해당 Exception은 parse error에도 예외가 발생해 예외처리 할 때 예외 메세지를 처리하는데 어렵다는 문제가 있다.


해결

들어온 값이 Enum에 포함되는지 검증하는 방법은 별도로 존재하지 않는다.
따라서 별도의 어노테이션을 만들어 검증하는 방법을 선택하였다.

String + CustomValidator 조합으로 해결하였는데

Annotation으로 Enum 검증하기 해당글을 참고하여 아래와 같이 수정하여 문제를 해결하였다.

@Getter
public class ProjectRequest {

    private String title;
    private String content;

    @ValidateEnum(enumClass = ProjectCategory.class, message = "category에 없는 값입니다.")
    private ProjectCategory category;

    private List<String> images;
    private List<Long> skillIds;

    @ValidateEnum(enumClass = Meeting.class, message = "meeting에 없는 값입니다.")
    private String meeting;

    private Boolean isRecruiting;
}


참고
https://velog.io/@hellozin/Annotation%EC%9C%BC%EB%A1%9C-Enum-%EA%B2%80%EC%A6%9D%ED%95%98%EA%B8%B0

profile
since 2022

0개의 댓글