@@ -28,32 +28,35 @@ public class CalendarServiceImpl implements CalendarService {
2828 * 월별 캘린더 요약 정보 조회
2929 */
3030
31+ // CalendarServiceImpl.java
32+
3133 @ Override
3234 @ Transactional
3335 public CalendarMonthResponse getCalendarMonthData (int year , int month , Long userId ) {
34- // 1. 해당 월의 범위 계산
3536 LocalDate startLocalDate = LocalDate .of (year , month , 1 );
3637 LocalDate endLocalDate = startLocalDate .withDayOfMonth (startLocalDate .lengthOfMonth ());
38+
39+ // 시간 범위를 00:00:00 ~ 23:59:59.999 로 명확히 설정
3740 LocalDateTime startDateTime = startLocalDate .atStartOfDay ();
38- LocalDateTime endDateTime = endLocalDate .atTime (23 , 59 , 59 );
41+ LocalDateTime endDateTime = endLocalDate .atTime (LocalTime .MAX );
42+
43+ // 1. ACTIVE 상태인 아이템만 조회하여 휴지통 데이터 배제
44+ List <Item > deadlineItems = itemRepository .findByUser_UserIdAndDeadlineBetweenAndStatusOrderByDeadlineAsc (
45+ userId , startLocalDate , endLocalDate , Item .ItemStatus .ACTIVE );
3946
40- // 2. DB에서 데이터 조회
41- List <Item > deadlineItems = itemRepository .findByUser_UserIdAndDeadlineBetweenOrderByDeadlineAsc (
42- userId , startLocalDate , endLocalDate );
43- List <Item > createdItems = itemRepository .findByUser_UserIdAndCreatedAtBetween (
44- userId , startDateTime , endDateTime );
47+ List <Item > createdItems = itemRepository .findByUser_UserIdAndCreatedAtBetweenAndStatus (
48+ userId , startDateTime , endDateTime , Item .ItemStatus .ACTIVE );
4549
46- // 3. 날짜별로 데이터 집계 (TreeMap을 사용하여 날짜순 정렬)
4750 Map <String , CalendarMonthResponse .DaySummary > summaryMap = new TreeMap <>();
4851
49- // 생성일 기준 카운팅
52+ // 생성일 카운팅
5053 for (Item item : createdItems ) {
5154 String dateKey = item .getCreatedAt ().toLocalDate ().toString ();
5255 CalendarMonthResponse .DaySummary current = summaryMap .getOrDefault (dateKey , new CalendarMonthResponse .DaySummary (0 , 0 ));
5356 summaryMap .put (dateKey , new CalendarMonthResponse .DaySummary (current .getCreatedCount () + 1 , current .getDeadlineCount ()));
5457 }
5558
56- // 마감일 기준 카운팅
59+ // 마감일 카운팅
5760 for (Item item : deadlineItems ) {
5861 String dateKey = item .getDeadline ().toString ();
5962 CalendarMonthResponse .DaySummary current = summaryMap .getOrDefault (dateKey , new CalendarMonthResponse .DaySummary (0 , 0 ));
@@ -62,43 +65,39 @@ public CalendarMonthResponse getCalendarMonthData(int year, int month, Long user
6265
6366 return new CalendarMonthResponse (year , month , summaryMap );
6467 }
65- /**
66- * 특정 날짜의 상세 일정 조회
67- */
6868
6969 @ Override
7070 @ Transactional
7171 public CalendarDayResponse getCalendarDayData (LocalDate date , Long userId ) {
72- // 1. 해당 날짜가 마감일(Deadline)인 아이템 조회
73- List <Item > deadlineItems = itemRepository .findItemsByUserIdAndDeadline (userId , date );
72+ // 1. 해당 날짜가 마감일이면서 ACTIVE인 내 아이템만 조회
73+ List <Item > deadlineItems = itemRepository .findByUser_UserIdAndDeadlineAndStatus (
74+ userId , date , Item .ItemStatus .ACTIVE );
7475
75- // 2. 해당 날짜가 생성일(CreatedAt)인 아이템 조회 (00:00:00 ~ 23:59:59)
76+ // 2. 해당 날짜가 생성일이면서 ACTIVE인 내 아이템만 조회
7677 LocalDateTime startDateTime = date .atStartOfDay ();
7778 LocalDateTime endDateTime = date .atTime (LocalTime .MAX );
78- List <Item > createdItems = itemRepository .findByUser_UserIdAndCreatedAtBetween (
79- userId , startDateTime , endDateTime );
79+ List <Item > createdItems = itemRepository .findByUser_UserIdAndCreatedAtBetweenAndStatus (
80+ userId , startDateTime , endDateTime , Item . ItemStatus . ACTIVE );
8081
81- // 3. 두 리스트를 합치고 중복 제거 (ItemId 기준) 후 DTO 변환
82- // Stream.concat을 사용하여 두 리스트를 합칩니다.
82+ // 3. 중복 제거 및 DTO 변환
8383 List <CalendarDayResponse .EventDetailDto > eventList = Stream .concat (deadlineItems .stream (), createdItems .stream ())
84- .distinct () // Item 객체의 equals/hashCode가 itemId 기준이라면 중복 제거됨
84+ .distinct ()
8585 .map (item -> CalendarDayResponse .EventDetailDto .builder ()
8686 .itemId (item .getItemId ())
8787 .title (item .getTitle ())
88- .memo (item .getMemo ()) // DTO에 정의한 필드 추가
88+ .memo (item .getMemo ())
8989 .deadline (item .getDeadline ())
9090 .createdAt (item .getCreatedAt ())
9191 .tag (item .getItemTags () != null ?
9292 item .getItemTags ().stream ()
93- .map (itemTag -> itemTag .getTag ().getTagName ()) // 태그의 이름 추출
93+ .map (it -> it .getTag ().getTagName ())
9494 .collect (Collectors .toList ())
95- : Collections .emptyList ()) // 태그가 없으면 빈 리스트 반환
95+ : Collections .emptyList ())
9696 .importance (item .isImportance ())
9797 .imageUrl (item .getImageUrl ())
9898 .build ())
9999 .collect (Collectors .toList ());
100100
101- // 4. 최종 결과 반환
102101 return CalendarDayResponse .builder ()
103102 .selectedDate (date )
104103 .eventList (eventList )
0 commit comments