프로젝트 중 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