[Spring] JPA List<Enum> 형식으로 저장하기

NCOOKIE·2025년 4월 23일
0

TIL

목록 보기
19/20

가게의 휴무일을 DB에 "SUN,MON,TUE"와 같은 리스트 형식으로 저장하려고 한다.

public enum DayOfWeek {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

여러 방법들이 있지만 나는 Converter를 사용하는 방식을 적용했다. 데이터 저장 시 Enum의 ordinal대로 정렬까지 수행한다.

DayOfWeekListConverter.java

/**
 * 가게의 정기 휴무일 정보를 List<DayOfWeek> 형태로 관리하기 위해 사용하는 JPA AttributeConverter
 * <p>
 * - 자바의 List<DayOfWeek> <-> DB의 String("SUN,MON") 형태로 변환한다.
 * - 예시) { DayOfWeek.SUN, DayOfWeek.MON } -> "MON,SUN"
 */
@Converter
public class DayOfWeekListConverter implements AttributeConverter<List<DayOfWeek>, String> {

    // Entity -> DB 저장 시 호출
    // List<DayOfWeek> -> "SUN,MON"
    @Override
    public String convertToDatabaseColumn(List<DayOfWeek> attribute) {
        if (attribute == null) {
            return "";
        }

        List<DayOfWeek> sortedAttribute = attribute.stream()
                .distinct()
                .sorted(Comparator.comparingInt(DayOfWeek::ordinal))
                .toList();

        return sortedAttribute.stream().map(Enum::name).collect(Collectors.joining(","));
    }
    
    // DB -> Entity 로딩 시 호출
    // "SUN,MON" -> List<DayOfWeek>
    @Override
    public List<DayOfWeek> convertToEntityAttribute(String dbData) {
        if (dbData == null || dbData.isEmpty()) {
            return new ArrayList<>();
        }
        return Arrays.stream(dbData.split(","))
                        .map(DayOfWeek::valueOf)
                        .toList();
    }
}

Store.java

@Column(nullable = false)
@Convert(converter = DayOfWeekListConverter.class)
private List<DayOfWeek> closedDays;   // 휴무일 ("SUN,MON"과 같은 형식으로 저장됨)

참고

profile
일단 해보자

0개의 댓글