[JAVA] Enum 사용하여 DB에 값 저장하고 조회하기

2022. 11. 18. 11:33Web/JAVA

2. @Enumerated

  • Enum 의 값을 DB에 이름 그대로 저장하기 위하여 Entity 컬럼에 해당 어노테이션을 선언하여 사용한다.
  • 하지만, Enum 의 값이 변경되거나, 순서가 변경 되었을 경우 DB에 저장된 값과 매칭되지않아 문제가 발생한다.
  • 그래서 현업에서는 잘 사용되어지지 않는다.

2. @Converter

  • @Enumerated 대신 AttributeConverter을 구현한 Class에 @Converter 어노테이션을 사용하여 원하는 값을
  • DB에 저장할수있다.
  • AttributeConverter 예시
    • convertToDatabaseColumn(Menu menu) : enum을 DB에 어떤 값으로 넣을 것인지 정의
    • converToEntityAttribute(String menuName) : DB에서 읽힌 값에 따라 어떻게 enum랑 매칭 시킬 것인지 정의
@Converter
public class MetaDataSectionConverter implements AttributeConverter<MetaDataSection, String> {

    @Override
    public String convertToDatabaseColumn(MetaDataSection metaDataSection) {
        return metaDataSection.getSectionValue();
    }

    @Override
    public MetaDataSection convertToEntityAttribute(String dbData) {
        return EnumSet.allOf(MetaDataSection.class)
                .stream()
                .filter(e -> e.getSectionValue().equals(dbData))
                .findAny()
                .orElse(null);
    }
}
  • 해당 Enum
@Slf4j
public enum MetaDataSection {

    STORE_TAB_NEW_STORE_DISPLAY_CONDITIONS("StoreTab_NewStoreDisplayConditions"),
    STORE_TAB_SELECTED_STORE_DISPLAY_CONDITIONS("StoreTab_SelectedStoreDisplayConditions"),
    STORE_TAB_BEST_STORE_DISPLAY_CONDITIONS("StoreTab_BestStoreDisplayConditions"),
    EXHIBITION_ROLLING_PRODUCTS_DISPLAY_MAX_CONDITIONS("Exhibition_RollingProductsDisplayMaxConditions"),
    EXHIBITION_FIXED_PRODUCTS_DISPLAY_MAX_CONDITIONS("Exhibition_FixedProductsDisplayMaxConditions"),
    EXHIBITION_SUB_PRODUCTS_DISPLAY_MAX_CONDITIONS("Exhibition_SubProductsDisplayMaxConditions"),
    EXHIBITION_CATEGORY_PRODUCTS_DISPLAY_MAX_CONDITIONS("Exhibition_CategoryProductsDisplayMaxConditions"),
    EXHIBITION_FLAG_SHIP_PRODUCTS_DISPLAY_MAX_CONDITIONS("Exhibition_FlagShipProductsDisplayMaxConditions"),
    STORE_HOME_TREND_PICK_PRODUCTS_DISPLAY_MAX_CONDITIONS("StoreHome_TrendPickProductsDisplayMaxConditions"),
    STORE_HOME_AD_PRODUCTS_DISPLAY_MAX_CONDITIONS("StoreHome_AdProductsDisplayMaxConditions");

    private final String sectionValue;

    MetaDataSection(String sectionValue) {
        this.sectionValue = sectionValue;
    }

    public String getSectionValue() {
        return sectionValue;
    }
}
  • 최종적으로 Entity에 @Converter어노테이션을 선언하여 해당 컬럼에 컨버터를 사용하겠다고 명시해준다.

- 이렇게 하면 Enum Value 값이 DB에 저장되고 조회도 알맞게 맵핑되서 가능하게 된다.