Skip to content

Commit 3266b78

Browse files
committed
Feat(#56): Schedule 반복 일정 도메인 분리
1 parent 11c45ac commit 3266b78

File tree

11 files changed

+117
-59
lines changed

11 files changed

+117
-59
lines changed

application/wypl-core/src/main/java/com/wypl/wyplcore/schedule/data/request/ScheduleCreateRequest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import com.fasterxml.jackson.annotation.JsonProperty;
77
import com.wypl.jpacalendardomain.schedule.data.ConvertibleSchedule;
8-
import com.wypl.jpacalendardomain.schedule.data.RepetitionCycle;
8+
import com.wypl.jpacalendardomain.schedule.domain.embedded.RepetitionCycle;
99

1010
import lombok.Builder;
1111

application/wypl-core/src/main/java/com/wypl/wyplcore/schedule/service/repetition/RepetitionStrategyFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.util.HashMap;
44
import java.util.Map;
55

6-
import com.wypl.jpacalendardomain.schedule.data.RepetitionCycle;
6+
import com.wypl.jpacalendardomain.schedule.domain.embedded.RepetitionCycle;
77
import com.wypl.wyplcore.schedule.service.repetition.strategy.DayRepetitionStrategy;
88
import com.wypl.wyplcore.schedule.service.repetition.strategy.MonthRepetitionStrategy;
99
import com.wypl.wyplcore.schedule.service.repetition.strategy.RepetitionStrategy;

application/wypl-core/src/main/java/com/wypl/wyplcore/schedule/service/repetition/strategy/WeekRepetitionStrategy.java

+16-13
Original file line numberDiff line numberDiff line change
@@ -18,40 +18,40 @@ public class WeekRepetitionStrategy implements RepetitionStrategy {
1818

1919
/**
2020
* RepetitionCycle = Week 인 경우, Schedule 반복 일정을 조회한다.
21-
* @param schedule Target Schedule
21+
*
22+
* @param schedule Target Schedule
2223
* @param searchStartDate 검색 시작일자
23-
* @param searchEndDate 검색 종료일자
24+
* @param searchEndDate 검색 종료일자
2425
* @return {List<ScheduleFindResponse>}
2526
*/
2627
@Override
2728
public List<ScheduleFindResponse> getScheduleResponses(Schedule schedule, LocalDate searchStartDate,
28-
LocalDate searchEndDate) {
29+
LocalDate searchEndDate) {
2930

3031
searchStartDate = getMaxDate(searchStartDate, schedule.getRepetitionStartDate()); // 검색 범위의 시작일
3132
searchEndDate = getMinDate(searchEndDate, schedule.getRepetitionEndDate());
3233

3334
List<ScheduleFindResponse> responses = new ArrayList<>();
3435

3536
if (!schedule.existsDayOfWeek()) { // 반복 요일을 설정하지 않았을 경우
36-
37-
LocalDate firstScheduleStartDate = getFirstScheduleStartDate(searchStartDate, schedule); // 검색 조건에 부합하는 첫 번째 일정의 시작일
37+
LocalDate firstScheduleStartDate = getFirstScheduleStartDate(searchStartDate,
38+
schedule); // 검색 조건에 부합하는 첫 번째 일정의 시작일
3839

3940
for (LocalDate date = firstScheduleStartDate; date.isBefore(searchEndDate); date = date.plusWeeks(
40-
schedule.getWeekInterval())) {
41+
schedule.getWeekInterval())) {
4142
LocalDateTime startDateTime = LocalDateTime.of(date, schedule.getStartDateTime().toLocalTime());
4243
LocalDateTime endDateTime = startDateTime.plus(schedule.getDuration());
4344
responses.add(ScheduleFindResponse.of(schedule, startDateTime, endDateTime));
4445
}
4546
return responses;
46-
4747
} else { // 반복 요일을 설정했을 경우
48-
4948
int repetitionDayOfWeek = schedule.getDayOfWeek();
5049

5150
for (int dayOfWeek = 1; dayOfWeek <= 7; dayOfWeek++) { // 요일마다 처리
5251
if (isSelectedDayOfWeek(repetitionDayOfWeek, dayOfWeek)) {
5352
LocalDate nearestDate = findNextOrSameByDayOfWeek(searchStartDate, DayOfWeek.of(dayOfWeek));
54-
for (LocalDate date = nearestDate; date.isBefore(searchEndDate.plusDays(1)); date = date.plusWeeks(schedule.getWeekInterval())) {
53+
for (LocalDate date = nearestDate; date.isBefore(searchEndDate.plusDays(1)); date = date.plusWeeks(
54+
schedule.getWeekInterval())) {
5555

5656
responses.add(ScheduleFindResponse.of(schedule, date, date));
5757
}
@@ -64,11 +64,12 @@ public List<ScheduleFindResponse> getScheduleResponses(Schedule schedule, LocalD
6464

6565
/**
6666
* searchStartDate 이후 주의 반복 주기를 고려한 첫 번째 일정의 시작일을 찾는다.
67+
*
6768
* @param searchStartDate 검색 시작 날짜
68-
* @param schedule 일정
69+
* @param schedule 일정
6970
* @return 검색된 첫 번째 일정의 시작일
7071
*/
71-
private LocalDate getFirstScheduleStartDate(LocalDate searchStartDate, Schedule schedule){
72+
private LocalDate getFirstScheduleStartDate(LocalDate searchStartDate, Schedule schedule) {
7273

7374
LocalDate scheduleStartDate = schedule.getStartDateTime().toLocalDate();
7475
LocalDate unadjustedStartDate = findNearestStartDate(searchStartDate, schedule); // WeekInterval 반영되지 않은 상태
@@ -89,8 +90,9 @@ private LocalDate getFirstScheduleStartDate(LocalDate searchStartDate, Schedule
8990

9091
/**
9192
* 검색시작일자(searchStartDate)에 부합하는 가장 가까운 일정시작요일(dayOfWeek of startDateTime of schedule)을 검색한다.
93+
*
9294
* @param searchStartDate 검색시작일자
93-
* @param schedule 일정
95+
* @param schedule 일정
9496
* @return LocalDateTime 검색 조건과 일정의 시작 및 끝나는 요일에 부합하는 가장 가까운 시작일시
9597
*/
9698
private LocalDate findNearestStartDate(LocalDate searchStartDate, Schedule schedule) {
@@ -105,8 +107,9 @@ private LocalDate findNearestStartDate(LocalDate searchStartDate, Schedule sched
105107

106108
/**
107109
* dayOfWeek 가 repetitionDayOfWeek에 포함됐는지 확인한다.
110+
*
108111
* @param repetitionDayOfWeek 일정의 반복 요일을 비트마스킹한 값
109-
* @param dayOfWeek from 1 to 7 (1: 월요일, 2: 화요일, 3: 수요일, 4: 목요일, 5: 금요일, 6: 토요일, 7: 일요일)
112+
* @param dayOfWeek from 1 to 7 (1: 월요일, 2: 화요일, 3: 수요일, 4: 목요일, 5: 금요일, 6: 토요일, 7: 일요일)
110113
* @return boolean
111114
*/
112115
private boolean isSelectedDayOfWeek(int repetitionDayOfWeek, int dayOfWeek) {

application/wypl-core/src/test/java/com/wypl/wyplcore/ScheduleFixture.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.time.LocalDate;
44
import java.time.LocalDateTime;
55

6-
import com.wypl.jpacalendardomain.schedule.data.RepetitionCycle;
6+
import com.wypl.jpacalendardomain.schedule.domain.embedded.RepetitionCycle;
77
import com.wypl.jpacalendardomain.schedule.domain.Schedule;
88
import com.wypl.jpacalendardomain.schedule.domain.ScheduleInfo;
99

Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.wypl.jpacalendardomain.calendar.data;
22

33
public enum InviteStatus {
4-
PENDING,
5-
ACCENTED
6-
}
4+
PENDING,
5+
ACCENTED
6+
}

domain/jpa-calendar-domain/src/main/java/com/wypl/jpacalendardomain/schedule/data/ConvertibleSchedule.java

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.time.LocalDate;
44
import java.time.LocalDateTime;
55

6+
import com.wypl.jpacalendardomain.schedule.domain.embedded.RepetitionCycle;
7+
68
public interface ConvertibleSchedule {
79

810
String getTitle();

domain/jpa-calendar-domain/src/main/java/com/wypl/jpacalendardomain/schedule/data/RepetitionCycle.java

-8
This file was deleted.

domain/jpa-calendar-domain/src/main/java/com/wypl/jpacalendardomain/schedule/domain/Schedule.java

+46-30
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66

77
import org.hibernate.annotations.SQLRestriction;
88

9-
import com.wypl.jpacalendardomain.schedule.data.RepetitionCycle;
9+
import com.wypl.jpacalendardomain.schedule.domain.embedded.Repetition;
10+
import com.wypl.jpacalendardomain.schedule.domain.embedded.RepetitionCycle;
1011
import com.wypl.jpacommon.JpaBaseEntity;
1112

1213
import jakarta.persistence.Column;
14+
import jakarta.persistence.Embedded;
1315
import jakarta.persistence.Entity;
14-
import jakarta.persistence.EnumType;
15-
import jakarta.persistence.Enumerated;
1616
import jakarta.persistence.FetchType;
1717
import jakarta.persistence.GeneratedValue;
1818
import jakarta.persistence.GenerationType;
@@ -53,50 +53,66 @@ public class Schedule extends JpaBaseEntity {
5353
@Column(name = "end_date_time", nullable = false)
5454
private LocalDateTime endDateTime;
5555

56-
@Column(name = "repetition_start_date")
57-
private LocalDate repetitionStartDate;
58-
59-
@Column(name = "repetition_end_date")
60-
private LocalDate repetitionEndDate;
61-
62-
@Getter
63-
@Enumerated(EnumType.STRING)
64-
private RepetitionCycle repetitionCycle; // 반복 주기 (일, 주, 달, 년)
65-
66-
@Column(name = "day_of_week")
67-
private Integer dayOfWeek; // 반복 요일: Bit Masking
68-
69-
@Column(name = "week_interval")
70-
private Integer weekInterval; // 주 반복 (1~3)
56+
@Embedded
57+
private Repetition repetition;
7158

7259
// Todo: Review Mapping
7360

7461
@Builder
75-
public Schedule(ScheduleInfo scheduleInfo, String title, String description, LocalDateTime startDateTime,
76-
LocalDateTime endDateTime, LocalDate repetitionStartDate, LocalDate repetitionEndDate,
77-
RepetitionCycle repetitionCycle, Integer dayOfWeek, Integer weekInterval) {
62+
public Schedule(
63+
ScheduleInfo scheduleInfo,
64+
final String title,
65+
final String description,
66+
final LocalDateTime startDateTime,
67+
final LocalDateTime endDateTime,
68+
final LocalDate repetitionStartDate,
69+
final LocalDate repetitionEndDate,
70+
final RepetitionCycle repetitionCycle,
71+
final Integer dayOfWeek,
72+
final Integer weekInterval) {
7873
this.scheduleInfo = scheduleInfo;
7974
this.title = title;
8075
this.description = description;
8176
this.startDateTime = startDateTime;
8277
this.endDateTime = endDateTime;
83-
this.repetitionStartDate = repetitionStartDate;
84-
this.repetitionEndDate = repetitionEndDate;
85-
this.repetitionCycle = repetitionCycle;
86-
this.dayOfWeek = dayOfWeek;
87-
this.weekInterval = weekInterval;
78+
this.repetition = Repetition.builder()
79+
.startDate(repetitionStartDate)
80+
.endDate(repetitionEndDate)
81+
.repetitionCycle(repetitionCycle)
82+
.dayOfWeek(dayOfWeek)
83+
.weekInterval(weekInterval)
84+
.build();
8885
}
8986

9087
public boolean isRepetition() {
91-
return repetitionCycle != null;
88+
return repetition.getRepetitionCycle() != null;
9289
}
9390

9491
public boolean existsDayOfWeek() {
95-
return dayOfWeek != null;
92+
return repetition.getDayOfWeek() != null;
9693
}
9794

98-
public Duration getDuration(){
95+
public Duration getDuration() {
9996
return Duration.between(this.startDateTime, this.endDateTime);
10097
}
10198

102-
}
99+
public LocalDate getRepetitionStartDate() {
100+
return repetition.getStartDate();
101+
}
102+
103+
public LocalDate getRepetitionEndDate() {
104+
return repetition.getEndDate();
105+
}
106+
107+
public RepetitionCycle getRepetitionCycle() {
108+
return repetition.getRepetitionCycle();
109+
}
110+
111+
public Integer getDayOfWeek() {
112+
return repetition.getDayOfWeek();
113+
}
114+
115+
public Integer getWeekInterval() {
116+
return repetition.getWeekInterval();
117+
}
118+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.wypl.jpacalendardomain.schedule.domain.embedded;
2+
3+
import java.time.LocalDate;
4+
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Embeddable;
7+
import jakarta.persistence.EnumType;
8+
import jakarta.persistence.Enumerated;
9+
import lombok.AccessLevel;
10+
import lombok.AllArgsConstructor;
11+
import lombok.Builder;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
15+
@AllArgsConstructor
16+
@Builder
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@Getter
19+
@Embeddable
20+
public class Repetition {
21+
@Column(name = "repetition_start_date")
22+
private LocalDate startDate;
23+
24+
@Column(name = "repetition_end_date")
25+
private LocalDate endDate;
26+
27+
@Getter
28+
@Enumerated(EnumType.STRING)
29+
private RepetitionCycle repetitionCycle; // 반복 주기 (일, 주, 달, 년)
30+
31+
@Column(name = "day_of_week")
32+
private Integer dayOfWeek; // 반복 요일: Bit Masking
33+
34+
@Column(name = "week_interval")
35+
private Integer weekInterval; // 주 반복 (1~3)
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.wypl.jpacalendardomain.schedule.domain.embedded;
2+
3+
public enum RepetitionCycle {
4+
DAY,
5+
WEEK,
6+
MONTH,
7+
YEAR
8+
}

domain/jpa-calendar-domain/src/main/java/com/wypl/jpacalendardomain/schedule/reopository/ScheduleRepositoryCustomImpl.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public List<Schedule> findByCalendarIdAndBetweenStartDateAndEndDate(
2323
) {
2424
return jpaQueryFactory.selectFrom(schedule)
2525
.where(schedule.scheduleInfo.calendar.id.eq(calendarId)
26-
.and(schedule.repetitionStartDate.loe(endDate).and(schedule.repetitionEndDate.goe(startDate))))
26+
.and(schedule.repetition.startDate.loe(endDate)
27+
.and(schedule.repetition.endDate.goe(startDate))))
2728
.fetch();
2829
}
29-
}
30+
}

0 commit comments

Comments
 (0)