가게의 휴무일을 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"과 같은 형식으로 저장됨)