Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

달력 조회 API를 작성 #50

Open
wants to merge 23 commits into
base: dev
Choose a base branch
from
Open

달력 조회 API를 작성 #50

wants to merge 23 commits into from

Conversation

jiwon83
Copy link
Member

@jiwon83 jiwon83 commented Nov 23, 2024

📑 개요

#38

와플 v1을 개선하며 바뀐 반복되는 일정에 대한 로직의 변화에 따라 달력 조회 기능을 새롭게 구현했습니다.

AS-IS

  • v1에서는 반복되는 일정을 반복 갯수만큼 일정 데이터로 저장하여 관리했기 때문에 조회 로직은 매우 단순했습니다.
  • 기존 반복 저장 로직에서도 다소 복잡한 분기문이 존재했습니다. v1관련코드 line 174 ~ 266

TO-BE

  • 반복 일정을 하나의 Schedule 객체로 관리하도록 변경함으로써 저장에서 발생하는 서버 부하를 줄였습니다.
  • 이에 따라, 이전보다 조회 로직이 다소 복잡해졌습니다. 따라서 하나의 서비스에서 모든 로직을 구현하지 않고 전략 패턴을 적용하여 코드를 분리, 확장성과 가독성을 향상시키는 방안을 고려했습니다.

다음 기준에 따라서 전략 패턴을 적용했습니다.

 - 달력별 다른 조회 기간 설정
 - 반복주기에 따라서 조회 조건에 맞게 가공

✅ PR 체크리스트


  • 🔀 PR 제목의 형식을 잘 작성했나요?
  • 💯 테스트는 잘 통과했나요?
  • 🏗️ 빌드는 성공했나요?
  • 🧹 불필요한 코드는 제거했나요?
  • 💭 이슈는 등록했나요?
  • 🏷️ 라벨은 등록했나요?

🚀 상세 작업 내용


📁 ETC


jiwon83 added 16 commits October 6, 2024 23:15
- 전략 + 플라이웨이트 패턴 적용 테스트 포함

Resolves: #38
- CalendarServiceUtil.java
- CalendarServiceTest.java

Resolves: #38
- CalendarServiceUtil.java
- CalendarServiceUtilTest.java

Resolves: #38
- 검색 조건이 반복 주에 속하지 않은 케이스에 대한 버그 수정을 위해 getNearestDateUsingWeekInterval 메서드 추가 구현

Resolves: #38
- 기존의 Util Class의 메서드로 존재하던 구조 대신 전략 패턴 적용해서 클래스 단위로 분리
- 이에 따른 테스트 수정

Resolves: #38
- CalendarStrategy의 ScheduleRepository 연관관계 제거
- 주석 추가

Resolves: #38
Copy link
Member

@KIMSEI1124 KIMSEI1124 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개발하시느라 고생많으셨습니다! 😄
전체적인 코드는 잘 작성하였습니다! 👍🏼

하지만 컨벤션 및 함수로 분리하면 좋을 것 같은 내용들이 있었습니다.
해당 내용들은 자세히 작성해두었고, 더 필요한 부분은 노션에다가 따로 작성해놨습니다!

고생 많으셨고 해당 내용 수정해주시면 감사합니다!

application/wypl-core/build.gradle Outdated Show resolved Hide resolved
LocalDate date = getMaxDate(searchStartDate, schedule.getRepetitionStartDate()).with(
TemporalAdjusters.nextOrSame(DayOfWeek.of(dayOfWeek)));

for(; !date.isAfter(searchEndDate); date = date.plusWeeks(schedule.getWeekInterval())) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

!date.isAfter(searchEndDate) 이런 조건식을 메서드로 분리해보면 어떨까요?


// searchStartDate를 해당 주의 월요일로 설정
LocalDateTime searchStartMonday = LocalDateTime.of(searchStartDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)), LocalTime.of(0, 0));
LocalDateTime scheduleStartMonday = LocalDateTime.of(schedule.getRepetitionStartDate().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)), LocalTime.of(0, 0));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

schedule.getRepetitionStartDate().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY) 해당 함수도 메서드로 분리하면 어떨까요?!

매개변수로 두 개만 넘기는 형식으로 하면 좋을 것 같아요.

@KIMSEI1124 KIMSEI1124 linked an issue Nov 27, 2024 that may be closed by this pull request
Copy link
Member

@KIMSEI1124 KIMSEI1124 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

몇몇 코멘트를 달아뒀습니다!
한 번 확인하시고 궁금하신 점 있으면 코멘트 부탁드립니다!


private final ScheduleRepository scheduleRepository;

private final Map<CalendarType, CalendarStrategy> calendarStrategyMap;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 개인적인 의견이지만 calendarStrategies로 수정하는게 어떨까요?! 변수명에 자료구조 형식이 드러나는 것이 좋아보이지 않습니다!

Comment on lines +43 to +44
public CalendarSchedulesResponse findCalendar(AuthMember authMember, long calendarId,
CalendarFindRequest calendarFindRequest) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public CalendarSchedulesResponse findCalendar(AuthMember authMember, long calendarId,
CalendarFindRequest calendarFindRequest) {
public CalendarSchedulesResponse findCalendar(
AuthMember authMember,
long calendarId,
CalendarFindRequest calendarFindRequest
) {

이런 형식으로 매개변수를 작성해보는건 어떨까요?!


public class CalendarServiceUtil {

public static LocalDate getMaxDate(LocalDate date1, LocalDate date2) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

음 혹시 getNewestDate는 어떨까요?? 아래 내용도 getOldestDate도 괜찮을 것 같다고 생각합니다!

해당 반환값이 Number형식이 아닌 날짜 형식이기 때문에 메서드명을 수정하시는게 어떨까 생각합니다!

Comment on lines +25 to +28
@Bean
public Map<CalendarType, CalendarStrategy> calendarStrategyMap() {
return calendarStrategyMap;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CalendarService에서 피드백을 준 내용을 토대로 수정한다면 해당 @Bean의 이름이 수정되어야 합니다!

Comment on lines +25 to +26
public WyplResponseEntity<ScheduleInfoCreateResponse> addSchedule(@Authenticated AuthMember authMember,
@RequestBody ScheduleCreateRequest scheduleCreateRequest) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 내용도 위에는 있지만!

Suggested change
public WyplResponseEntity<ScheduleInfoCreateResponse> addSchedule(@Authenticated AuthMember authMember,
@RequestBody ScheduleCreateRequest scheduleCreateRequest) {
public WyplResponseEntity<ScheduleInfoCreateResponse> addSchedule(
@Authenticated AuthMember authMember,
@RequestBody ScheduleCreateRequest scheduleCreateRequest
) {

와 같이 수정하는게 더 보기 편하다고 생각하는데 어떠신가요?

Comment on lines +58 to +59
if (gapOfWeek % weekInterval == 0)
return searchStartDate;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

단 한줄이여도 괄호 부탁드립니다. 🙏

LocalDate date = getMaxDate(searchStartDate, schedule.getRepetitionStartDate()).with(
TemporalAdjusters.nextOrSame(DayOfWeek.of(dayOfWeek)));

for (; !date.isAfter(searchEndDate); date = date.plusWeeks(schedule.getWeekInterval())) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 조건절도 isBefore로 처리가 될 것 같은데 한번만 확인 부탁드립니다!

Comment on lines +26 to +28
LocalDateTime nearestEndDateTime = LocalDateTime.of(
searchStartDate.withDayOfYear(schedule.getEndDateTime().getDayOfYear()),
schedule.getEndDateTime().toLocalTime());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

schedule.getEndDateTime().getDayOfYear()를 캡슐화해서 메서드 체이닝이 단 한번만 호출해서 데이터를 가져오도록 캡슐화를 진행하면 좋을 것 같습니다!

Comment on lines +121 to +133
public Schedule toObject() {
return Schedule.builder()
.title(this.title)
.description(this.description)
.startDateTime(this.startDateTime)
.endDateTime(this.endDateTime)
.repetitionStartDate(this.repetitionStartDate)
.repetitionEndDate(this.repetitionEndDate)
.repetitionCycle(this.repetitionCycle)
.dayOfWeek(this.dayOfWeek)
.weekInterval(this.weekInterval)
.build();
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

toObject인데 반환값은 Schedule입니다! 어떠한 역할을 하는 메서드일까요? 궁금합니다!

@@ -34,6 +34,7 @@ subprojects {
compileOnly 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

대신 넣어주셔서 감사합니다! 💯

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: 🆘 Changed Request
Development

Successfully merging this pull request may close these issues.

달력 조회 API를 작성한다.
2 participants