From ff4176457d590ed8f4bf7b1e6a551d175918296b Mon Sep 17 00:00:00 2001 From: seulgi99 Date: Wed, 21 Aug 2024 20:37:04 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EB=82=B4=20=ED=95=A0=EC=9D=BC=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20API=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/StudentStudyDetailController.java | 9 +++++++ .../StudentStudyDetailService.java | 4 +++ .../study/dto/response/StudyTodoResponse.java | 27 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java b/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java index 1f8eeed52..d0f083f4c 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java @@ -2,8 +2,10 @@ import com.gdschongik.gdsc.domain.study.application.StudentStudyDetailService; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentDashboardResponse; +import com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -26,4 +28,11 @@ public ResponseEntity getSubmittableAssignments( AssignmentDashboardResponse response = studentStudyDetailService.getSubmittableAssignments(studyId); return ResponseEntity.ok(response); } + + @Operation(summary = "내 할일 리스트 조회", description = "해당 스터디의 내 할일 리스트를 조회합니다") + @GetMapping("/todo") + public ResponseEntity> getStudyTodoList(@RequestParam(name = "studyId") Long studyId) { + List response = studentStudyDetailService.getStudyTodoList(studyId); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java index 36fac587c..b350af450 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java @@ -7,6 +7,7 @@ import com.gdschongik.gdsc.domain.study.domain.StudyHistory; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentDashboardResponse; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentSubmittableDto; +import com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse; import com.gdschongik.gdsc.global.exception.CustomException; import com.gdschongik.gdsc.global.exception.ErrorCode; import com.gdschongik.gdsc.global.util.MemberUtil; @@ -40,4 +41,7 @@ public AssignmentDashboardResponse getSubmittableAssignments(Long studyId) { return AssignmentDashboardResponse.of(studyHistory.getRepositoryLink(), isAnySubmitted, submittableAssignments); } + + @Transactional(readOnly = true) + public List getStudyTodoList(Long studyId) {} } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java new file mode 100644 index 000000000..d2ea7e7fa --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java @@ -0,0 +1,27 @@ +package com.gdschongik.gdsc.domain.study.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Getter; + +public record StudyTodoResponse( + Long studyDetailId, + @Schema(description = "현 주차수") Long week, + @Schema(description = "할일 타입") StudyTodoType todoType, + @Schema(description = "마감 시각") LocalDateTime deadLine, + // @Schema(description = "출석 상태 (출석타입일 때만 사용)") AttendanceStatusResponse attendanceStatus, + @Schema(description = "과제 제목 (과제타입일 때만 사용)") String assignmentTitle + // @Schema(description = "과제 제출 상태 (과제타입일 때만 사용)") AssignmentSubmissionStatusResponse + // assignmentSubmissionStatus + ) { + + @Getter + @AllArgsConstructor + public enum StudyTodoType { + ATTENDANCE("출석"), + ASSIGNMENT("과제"); + + private final String value; + } +} From f0e56f859994754832b06563857dad73a226c249 Mon Sep 17 00:00:00 2001 From: seulgi99 Date: Thu, 22 Aug 2024 23:18:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=EB=82=B4=ED=95=A0=EC=9D=BC=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20API=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study/application/StudentStudyDetailService.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java index b350af450..19a886500 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java @@ -2,8 +2,10 @@ import com.gdschongik.gdsc.domain.member.domain.Member; import com.gdschongik.gdsc.domain.study.dao.AssignmentHistoryRepository; +import com.gdschongik.gdsc.domain.study.dao.StudyDetailRepository; import com.gdschongik.gdsc.domain.study.dao.StudyHistoryRepository; import com.gdschongik.gdsc.domain.study.domain.AssignmentHistory; +import com.gdschongik.gdsc.domain.study.domain.StudyDetail; import com.gdschongik.gdsc.domain.study.domain.StudyHistory; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentDashboardResponse; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentSubmittableDto; @@ -23,6 +25,7 @@ public class StudentStudyDetailService { private final MemberUtil memberUtil; private final StudyHistoryRepository studyHistoryRepository; private final AssignmentHistoryRepository assignmentHistoryRepository; + private final StudyDetailRepository studyDetailRepository; @Transactional(readOnly = true) public AssignmentDashboardResponse getSubmittableAssignments(Long studyId) { @@ -43,5 +46,11 @@ public AssignmentDashboardResponse getSubmittableAssignments(Long studyId) { } @Transactional(readOnly = true) - public List getStudyTodoList(Long studyId) {} + public List getStudyTodoList(Long studyId) { + Member member = memberUtil.getCurrentMember(); + final List studyDetails = studyDetailRepository.findAllByStudyIdOrderByWeekAsc(studyId); + final List assignmentHistories = + assignmentHistoryRepository.findAssignmentHistoriesByMenteeAndStudy(member, studyId); + return ; + } } From 8034607bed9e7cd29e76de0473537a7085bce0ec Mon Sep 17 00:00:00 2001 From: seulgi99 Date: Fri, 23 Aug 2024 00:20:08 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EB=82=B4=ED=95=A0=EC=9D=BC=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/StudentStudyDetailController.java | 2 +- .../StudentStudyDetailService.java | 23 +++++++++++--- .../gdsc/domain/study/domain/StudyDetail.java | 24 ++++++++++++--- .../domain/study/domain/vo/Assignment.java | 4 +++ .../gdsc/domain/study/domain/vo/Session.java | 5 ++++ .../study/dto/response/StudyTodoResponse.java | 30 ++++++++++++++++++- 6 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java b/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java index 769afa8f3..c153140b1 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java @@ -2,8 +2,8 @@ import com.gdschongik.gdsc.domain.study.application.StudentStudyDetailService; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentDashboardResponse; -import com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse; import com.gdschongik.gdsc.domain.study.dto.response.StudyStudentSessionResponse; +import com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java index e064d28a9..85a3ae2f2 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java @@ -12,12 +12,14 @@ import com.gdschongik.gdsc.domain.study.domain.StudyHistory; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentDashboardResponse; import com.gdschongik.gdsc.domain.study.dto.response.AssignmentSubmittableDto; -import com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse; import com.gdschongik.gdsc.domain.study.dto.response.StudyStudentSessionResponse; +import com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse; import com.gdschongik.gdsc.global.exception.CustomException; import com.gdschongik.gdsc.global.exception.ErrorCode; import com.gdschongik.gdsc.global.util.MemberUtil; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -58,11 +60,24 @@ public List getStudyTodoList(Long studyId) { final List studyDetails = studyDetailRepository.findAllByStudyIdOrderByWeekAsc(studyId); final List assignmentHistories = assignmentHistoryRepository.findAssignmentHistoriesByStudentAndStudy(member, studyId); + final List attendances = attendanceRepository.findByMemberAndStudyId(member, studyId); - List response = studyDetails.stream().filter(s) - // 출석체크 정보 + LocalDate now = LocalDate.of(2024, 9, 4); + List response = new ArrayList<>(); + // 출석체크 정보 (개설 상태이고, 오늘이 출석체크날짜인 것) + studyDetails.stream() + .filter(studyDetail -> studyDetail.getSession().isOpened() + && studyDetail.getAttendanceDay().equals(now)) + .forEach(studyDetail -> response.add(StudyTodoResponse.createAttendanceType( + studyDetail, now, isAttended(attendances, studyDetail)))); - return; + // 과제 정보 (오늘이 과제 제출 기간에 포함된 과제 정보) + studyDetails.stream() + .filter(studyDetail -> studyDetail.getAssignment().isOpened() + && studyDetail.getAssignment().isDeadlineRemaining()) + .forEach(studyDetail -> response.add(StudyTodoResponse.createAssignmentType( + studyDetail, getSubmittedAssignment(assignmentHistories, studyDetail)))); + return response; } public List getStudySessions(Long studyId) { diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetail.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetail.java index 020ee5dea..b968eb5c2 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetail.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetail.java @@ -8,6 +8,7 @@ import com.gdschongik.gdsc.domain.study.domain.vo.Session; import com.gdschongik.gdsc.global.exception.CustomException; import jakarta.persistence.*; +import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -96,10 +97,25 @@ public boolean isAssignmentDeadlineRemaining() { // 스터디 시작일자 + 현재 주차 * 7 + (스터디 요일 - 스터디 기간 시작 요일) public LocalDate getAttendanceDay() { - return study.getStartDate() - .plusDays(week * 7 - + study.getDayOfWeek().getValue() - - study.getStartDate().getDayOfWeek().getValue()); + // 스터디 시작일자 + LocalDate startDate = study.getStartDate(); + + // 스터디 요일 + DayOfWeek studyDayOfWeek = study.getDayOfWeek(); + + // 스터디 기간 시작 요일 + DayOfWeek startDayOfWeek = startDate.getDayOfWeek(); + + // 스터디 요일이 스터디 기간 시작 요일보다 앞서면, 다음 주로 넘어가게 처리 + Long daysDifference = Long.valueOf(studyDayOfWeek.getValue() - startDayOfWeek.getValue()); + if (daysDifference < 0) { + daysDifference += 7; + } + + // 현재 주차에 따른 일수 계산 + Long daysToAdd = (week - 1) * 7 + daysDifference; + + return startDate.plusDays(daysToAdd); } public void updateSession( diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java index 1563714df..03734a22f 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java @@ -91,6 +91,10 @@ public boolean isNone() { return status == NONE; } + public boolean isOpened() { + return status == OPEN; + } + public boolean isDeadlineRemaining() { LocalDateTime now = LocalDateTime.now(); return now.isBefore(deadline); diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java index 1b26ff63b..f998bb4aa 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java @@ -55,4 +55,9 @@ public static Session generateSession( .status(status) .build(); } + + // 데이터 전달 로직 + public boolean isOpened() { + return status == StudyStatus.OPEN; + } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java index 12a5737e6..131833e2a 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java @@ -1,6 +1,12 @@ package com.gdschongik.gdsc.domain.study.dto.response; +import static com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse.StudyTodoType.ASSIGNMENT; +import static com.gdschongik.gdsc.domain.study.dto.response.StudyTodoResponse.StudyTodoType.ATTENDANCE; + +import com.gdschongik.gdsc.domain.study.domain.AssignmentHistory; +import com.gdschongik.gdsc.domain.study.domain.StudyDetail; import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDate; import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,7 +16,7 @@ public record StudyTodoResponse( @Schema(description = "현 주차수") Long week, @Schema(description = "할일 타입") StudyTodoType todoType, @Schema(description = "마감 시각") LocalDateTime deadLine, - @Schema(description = "출석 상태 (출석타입일 때만 사용)") AttendanceStatusResponse attendanceStatus, + @Schema(description = "출석 상태 (출석타입일 때만 사용)") AttendanceStatusResponse attendanceStatus, @Schema(description = "과제 제목 (과제타입일 때만 사용)") String assignmentTitle, @Schema(description = "과제 제출 상태 (과제타입일 때만 사용)") AssignmentSubmissionStatusResponse assignmentSubmissionStatus) { @@ -22,4 +28,26 @@ public enum StudyTodoType { private final String value; } + + public static StudyTodoResponse createAttendanceType(StudyDetail studyDetail, LocalDate now, boolean isAttended) { + return new StudyTodoResponse( + studyDetail.getId(), + studyDetail.getWeek(), + ATTENDANCE, + studyDetail.getAttendanceDay().atTime(23, 59, 59), + AttendanceStatusResponse.of(studyDetail, now, isAttended), + null, + null); + } + + public static StudyTodoResponse createAssignmentType(StudyDetail studyDetail, AssignmentHistory assignmentHistory) { + return new StudyTodoResponse( + studyDetail.getId(), + studyDetail.getWeek(), + ASSIGNMENT, + studyDetail.getAssignment().getDeadline(), + null, + studyDetail.getAssignment().getTitle(), + AssignmentSubmissionStatusResponse.from(assignmentHistory)); + } } From 740bc84e7150bbb4ee423bf9b5eb235190a2f291 Mon Sep 17 00:00:00 2001 From: seulgi99 Date: Fri, 23 Aug 2024 23:45:50 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudentStudyDetailService.java | 6 +++--- .../domain/study/domain/vo/Assignment.java | 4 ---- .../gdsc/domain/study/domain/vo/Session.java | 2 +- .../study/dto/response/StudyTodoResponse.java | 20 +++++++++---------- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java index 6f9178fe8..652b397fc 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyDetailService.java @@ -64,18 +64,18 @@ public List getStudyTodoList(Long studyId) { assignmentHistoryRepository.findAssignmentHistoriesByStudentAndStudy(member, studyId); final List attendances = attendanceRepository.findByMemberAndStudyId(member, studyId); - LocalDate now = LocalDate.of(2024, 9, 4); + LocalDate now = LocalDate.now(); List response = new ArrayList<>(); // 출석체크 정보 (개설 상태이고, 오늘이 출석체크날짜인 것) studyDetails.stream() - .filter(studyDetail -> studyDetail.getSession().isOpened() + .filter(studyDetail -> studyDetail.getSession().isOpen() && studyDetail.getAttendanceDay().equals(now)) .forEach(studyDetail -> response.add(StudyTodoResponse.createAttendanceType( studyDetail, now, isAttended(attendances, studyDetail)))); // 과제 정보 (오늘이 과제 제출 기간에 포함된 과제 정보) studyDetails.stream() - .filter(studyDetail -> studyDetail.getAssignment().isOpened() + .filter(studyDetail -> studyDetail.getAssignment().isOpen() && studyDetail.getAssignment().isDeadlineRemaining()) .forEach(studyDetail -> response.add(StudyTodoResponse.createAssignmentType( studyDetail, getSubmittedAssignment(assignmentHistories, studyDetail)))); diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java index ae61166be..1d5a5c278 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Assignment.java @@ -89,10 +89,6 @@ public boolean isNone() { return status == NONE; } - public boolean isOpened() { - return status == OPEN; - } - public boolean isDeadlineRemaining() { LocalDateTime now = LocalDateTime.now(); return now.isBefore(deadline); diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java index f998bb4aa..07a2282c0 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/vo/Session.java @@ -57,7 +57,7 @@ public static Session generateSession( } // 데이터 전달 로직 - public boolean isOpened() { + public boolean isOpen() { return status == StudyStatus.OPEN; } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java index 131833e2a..7399b6181 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/StudyTodoResponse.java @@ -8,8 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import java.time.LocalDateTime; -import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.RequiredArgsConstructor; public record StudyTodoResponse( Long studyDetailId, @@ -20,15 +20,6 @@ public record StudyTodoResponse( @Schema(description = "과제 제목 (과제타입일 때만 사용)") String assignmentTitle, @Schema(description = "과제 제출 상태 (과제타입일 때만 사용)") AssignmentSubmissionStatusResponse assignmentSubmissionStatus) { - @Getter - @AllArgsConstructor - public enum StudyTodoType { - ATTENDANCE("출석"), - ASSIGNMENT("과제"); - - private final String value; - } - public static StudyTodoResponse createAttendanceType(StudyDetail studyDetail, LocalDate now, boolean isAttended) { return new StudyTodoResponse( studyDetail.getId(), @@ -50,4 +41,13 @@ public static StudyTodoResponse createAssignmentType(StudyDetail studyDetail, As studyDetail.getAssignment().getTitle(), AssignmentSubmissionStatusResponse.from(assignmentHistory)); } + + @Getter + @RequiredArgsConstructor + public enum StudyTodoType { + ATTENDANCE("출석"), + ASSIGNMENT("과제"); + + private final String value; + } }