Skip to content

Commit 682b43b

Browse files
최승원최승원
authored andcommitted
fix: 캘린더 마감일 조회 기능 수정
1 parent ee1f1a9 commit 682b43b

File tree

2 files changed

+34
-29
lines changed

2 files changed

+34
-29
lines changed

src/main/java/com/gdg/linking/domain/calendar/CalendarServiceImpl.java

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

src/main/java/com/gdg/linking/domain/item/ItemRepository.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ public interface ItemRepository extends JpaRepository<Item, Long>{
2626
"order by i.createdAt desc")
2727
List<Item> findByUser_UserIdAndStatusOrderByCreatedAtDesc(Long userId, Item.ItemStatus status);
2828

29-
// 마감 임박 (오늘 ~ 7일 뒤, ACTIVE 상태만)
30-
List<Item> findByUser_UserIdAndDeadlineBetweenAndStatusOrderByDeadlineAsc(
31-
Long userId, LocalDate start, LocalDate end, Item.ItemStatus status);
32-
3329
// 중요 표시이면서 ACTIVE 상태인 것만 조회
3430
List<Item> findByUser_UserIdAndImportanceTrueAndStatus(Long userId, Item.ItemStatus status);
3531

@@ -79,6 +75,16 @@ long countByUser_UserIdAndStatusAndCreatedAtBefore(
7975
List<Item> findByUser_UserIdAndDeadlineBetweenOrderByDeadlineAsc(
8076
Long userId, LocalDate start, LocalDate end);
8177

78+
// 캘린더 일별 조회를 위해 사용자의 특정 마감일 + ACTIVE 아이템 조회
79+
List<Item> findByUser_UserIdAndDeadlineAndStatus(Long userId, LocalDate deadline, Item.ItemStatus status);
80+
81+
// 캘린더 일별 조회를 위해 사용자의 특정 생성일 범위 + ACTIVE 아이템 조회
82+
List<Item> findByUser_UserIdAndCreatedAtBetweenAndStatus(Long userId, LocalDateTime start, LocalDateTime end, Item.ItemStatus status);
83+
84+
// 월별 조회를 위한 범위 조회 (Status 추가)
85+
List<Item> findByUser_UserIdAndDeadlineBetweenAndStatusOrderByDeadlineAsc(
86+
Long userId, LocalDate start, LocalDate end, Item.ItemStatus status);
87+
8288

8389
@Query("SELECT DISTINCT i FROM Item i " +
8490
"WHERE i.user.userId = :userId " +

0 commit comments

Comments
 (0)