JPA/JPA

JPA Enum Mapping

lovineff 2021. 3. 15. 12:23

JPA 사용시 컬럼값에 Enum을 자동 매핑하기 위한 방법을 소개한다.

 

Enum에서 상속받는 interface 구현

public interface BaseEnumCode<T> {
    T getValue();
}

Enum 클래스 생성

@Getter
@AllArgsConstructor
public enum ContentSourceEnum implements BaseEnumCode<String> {
    news("뉴스", "news"),
    videoNews("포토/동영상 뉴스", "videoNews"),
    normal("일반", "normal");

    private String name;
    private String value;
}

Code 값을 Enum으로 자동 매핑해주는 클래스 생성

public abstract class AbstractBaseEnumConverter<X extends Enum<X> & BaseEnumCode<Y>, Y> implements AttributeConverter<X, Y> {
    protected abstract X[] getValueList();

    @Override
    public Y convertToDatabaseColumn(X attribute) {
        return attribute.getValue();
    }

    @Override
    public X convertToEntityAttribute(Y dbData) {
        return Arrays.stream(getValueList())
                .filter(e -> e.getValue().equals(dbData))
                .findFirst()
                .orElse(null);
    }
}

 

Entity 컬럼에 선언할 Converer 클래스 생성

public class ContentSourceEnumConverter extends AbstractBaseEnumConverter<ContentSourceEnum, String>{

    @Override
    protected ContentSourceEnum[] getValueList() {
        return ContentSourceEnum.values();
    }
}

 

Entity 컬럼 Enum 자동매핑 설정

@Convert(converter = ContentSourceEnumConverter.class)
@Column(name = "source")
private ContentSourceEnum source;