혹시 일주일 단위의 영업시간을 저장 및 표시하는 기능을 제공하고자 합니다.
관련되어 여러가지 방법을 고민 중인데 뚜렷한 방법이 떠오르지 않아 고민하다 질문을 남깁니다.
요구사항
-
먼저 업체와 근무일 엔티티를 만듭니다.
public class Market { public Guid MarketId { get; set; } public ICollcection<WorkingDay> WorkingDays { get; set; } = []; } public class WorkingDay { public DayOfWeek DayOfWeek { get; set; } // System.DayOfWeek 를 활용 public bool IsOpen { get; set; } }
-
각 요일별 업무시간을 설정하되, 단순히 Open → Close 만 설정하는 것이 아니라,
동일한 요일 내에 여러 시간을 설정하여 표시할 수 있게 합니다.-
예시:
- 09:00 ~ 11:59: 오전 영업
- 12:00 ~ 12:59: 점심시간
- 13:00 ~ 18:00: 오후 영업
-
코드:
public record WorkingDay { public DayOfWeek DayOfWeek { get; set; } // System.DayOfWeek 를 활용 public bool IsOpen { get; set; } public TimeOnly Start { get; set; } public TimeOnly End { get; set; } public string Description { get; set; } }
public class Market { public Guid MarketId { get; set; } public ICollcection<WorkingDay> WorkingDays { get; set; } = []; public void AddWorkingDay(DayOfWeek dayOfWeek, bool isOpen, TimeOnly start, TimeOnly end, string description) { var workingDay = new WorkingDay { DayOfWeek = dayOfWeek, IsOpen = isOpen, Start = start, End = end, Description = description }; this.WorkingDays.Add(workingDay); } }
-
-
동일한 요일 내에 시간적으로 겹치는(Intersect) 경우가 발생할 경우 예외를 발생시킵니다.
- 예시:
- 09:00 ~ 12:00: 오전 영업
- 12:00 ~ 13:00: 점심시간
- 13:00 ~ 18:00: 오후 영업
- 예외 상황
오전 영업 12:00
과점심시간 12:00
이 겹침점심시간 13:00
과오후 영업 13:00
이 겹침
- 코드:
public class Market { public Guid MarketId { get; set; } public ICollcection<WorkingDay> WorkingDays { get; set; } = []; public void AddWorkingDay(DayOfWeek dayOfWeek, bool isOpen, TimeOnly start, TimeOnly end, string description) { // Validate intersect var intersects = this.WorkingDays .Where(x => x.DayOfWeek == dayOfWeek) .Where(x => ...); // <<==== 이 부분이 고민이 됩니다. if (intersects.Any()) { throw new Exception("동일한 요일 내에 중복되는 시간이 포함되어있습니다"); } var workingDay = new WorkingDay { DayOfWeek = dayOfWeek, IsOpen = isOpen, Start = start, End = end, Description = description }; this.WorkingDays.Add(workingDay); } }
- 예시:
질문 사항
이러한 동일한 일자 내의 Time 간의 Intersect 를 우아하게 처리할 수 있는 노하우가 있을까 궁금합니다.
Reference
닷넷의 BCL 라이브러리 내에서 정리가 어려운 부분도 있을 것 같아서 여러가지를 찾아보기는 했는데,
정확히 이렇다할 활용 법이 떠오르지 않아 일단 레퍼런스로 남겨봅니다.