이번 프로젝트에서 새로운 것들을 시도하면서 많은 시행 착오를 겪던 중에 개인적으로 제일 난해한 상황에 처했습니다.

enum class를 이용해 Type, Category, Status 같은 것들을 관리한다는 전략은 
@Enumerated 어노테이션과 함께 훌륭하게 작동하고 있었습니다.

발생한 문제는 다음과 같습니다.

#Unknown name value [] for enum class [DocumentType]; 
상황을 설명하자면 enum으로 지정된 컬럼에 값이 없어서 벌어지는 문제입니다.

1. enum은 코드레벨에서 안정적으로 값을 강제하기 위해 존재한다.
2. 그런데 경우에 따라 컬럼이 쓰이지 않는 경우가 발생.
3. 당연히 값이 없으니 jackson 라이브러리가 값을 뽑아(select)서 enum을 이용한 string 형태로 반환할 때 문제 발생

그래서 눈물을 머금고 세가지 선택지에 서 있었습니다.

1. enum에 쓰레기 값을 하나 만들자: EMPTY 라는 값을 하나 만들면 아주 쉽지만 원치 않는 초기값이 되어 버리는 슬픈 상황 발생.

2. enum에 어떻게든 null 또는 공란을 대입시키는 방법을 찾자.

3. 테이블을 쪼개거나 enum을 풀면...?

일단은 1번으로 해결했으며, 원하던 상황은 아닙니다.
    public enum AnalysisType {
        EMPTY("EMPTY", ""),  // 이런게 생기고 말았습니다.


조만간 2번 방안을 다시 시도해 볼 예정입니다.

3번 방안은 고려조차 않고 있습니다. 애초에 가변성이 있는 화면이라 테이블을 역정규화한 거라 테이블 분리가 어렵고, 공들여 걸어버린 enum을 푸는 건 마음이 좋지 않네요. :(


이 일의 깨달은 바는 아래와 같습니다.

1. enum을 사용하는 컬럼에는 default 값을 지정하는 편이 유리하다.
2. enum을 사용하는 컬럼은 not null 제약이 들어가는 것이 좋다.
3. 역정규화를 고려하는 테이블에서 해당 컬럼이 반드시 쓰이느냐 아니냐에 따라 enum 적용 여부를 고려하는 것이 좋다.

그 외.
Querydsl과 ModelMapper를 쓰면 많은 부분이 간소화 되더라..