[JAVA] Enum 사용하여 DB에 값 저장하고 조회하기
2022. 11. 18. 11:33ㆍWeb/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에 저장되고 조회도 알맞게 맵핑되서 가능하게 된다.
'Web > JAVA' 카테고리의 다른 글
[JPA] Querydsl에서 (group_concat) MySql 특수함수 사용하기 (0) | 2022.11.18 |
---|---|
[JPA] Hibernate5 네이밍 룰 변경해서 적용하기(Camel -> Snake) (0) | 2022.11.18 |
[Java] Jackson을 활용한 데이터 변환(Json to Java Object) (0) | 2022.08.31 |
[JAVA] 자주 사용하는 Lombok 어노테이션 (0) | 2022.08.10 |
[JAVA] DTO, VO 그리고 Entity의 차이 (0) | 2022.08.10 |