Skip to content

Conversation

@sjk4618
Copy link
Member

@sjk4618 sjk4618 commented Sep 13, 2025

🔥Pull requests

⛳️ 작업한 브랜치

👷 작업한 내용

  • 타임테이블 전체 조회 api 필드 추가
  • 타임 테이블 상세 조회 api 필드 추가

🚨 참고 사항

@sjk4618 sjk4618 self-assigned this Sep 13, 2025
@coderabbitai
Copy link

coderabbitai bot commented Sep 13, 2025

📝 Walkthrough

Summary by CodeRabbit

  • 신기능
    • 일정 상세 응답에 시작/종료 일시가 추가되고, 일관된 날짜/시간 포맷으로 제공됩니다.
    • 타임테이블 응답에 행사명이 포함되어 맥락을 더 명확히 전달합니다.
    • 블록 단위 시작/종료 시간이 제공되어 상세 정보가 강화되었습니다.
  • 리팩터링
    • 이벤트·타임테이블·영역·카테고리·블록을 통합적으로 조회하는 흐름으로 단순화했습니다.
    • 예외를 세분화된 오류 코드로 매핑해 더 일관된 에러 응답을 제공합니다.

Walkthrough

타임테이블 응답 DTO에 필드가 추가되었고, TimetableService가 이벤트 조회를 포함하도록 흐름이 재구성되었습니다. TimetableResponse는 이벤트명 포함으로 시그니처가 변경되었고, TimetableDetailResponse는 시작/종료 일시 필드가 추가되었습니다. 서비스는 EventRetriever 주입 및 예외 매핑이 추가되었습니다.

Changes

Cohort / File(s) Summary
Timetable DTO 확장
src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableResponse.java, src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableDetailResponse.java
TimetableResponse에 eventName 필드 추가 및 of(...) 시그니처 변경. TimetableDetailResponse에 startDate, endDate 필드 추가(@jsonformat 적용) 및 of(...) 파라미터 확장.
서비스 로직 재구성
src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java
EventRetriever 주입 추가. 이벤트→타임테이블→영역/카테고리/블록 조회를 단일 흐름으로 통합하고 도메인별 NotFound 예외를 통합 예외/에러코드로 매핑. 응답 생성 시 eventName 및 블록 시작/종료 시각 반영.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor C as Client
  participant S as TimetableService
  participant ER as EventRetriever
  participant TR as TimetableRetriever
  participant AR as AreaRetriever
  participant CR as CategoryRetriever
  participant BR as BlockRetriever

  C->>S: getEventTimetable(eventId)
  rect rgb(240,248,255)
    note over S: 중앙화된 조회 및 예외 매핑
    S->>ER: findEvent(eventId)
    ER-->>S: Event
    S->>TR: findTimetableByEvent(eventId)
    TR-->>S: Timetable
    S->>AR: findAreas(timetableId)
    AR-->>S: AreaList
    S->>CR: findCategories(timetableId)
    CR-->>S: CategoryList
    S->>BR: findBlocks(timetableId)
    BR-->>S: BlockList
  end
  S-->>C: TimetableResponse(eventName, startDate, endDate, areas, blocks)

  alt 오류 발생
    S-->>C: NotfoundTimetableException(ErrorCode: NOT_FOUND_* )
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title Check ✅ Passed 제목은 변경사항의 핵심인 '타임테이블 전체 조회 API'와 '상세 조회 API'의 필드 추가를 명확하게 전달하고 있어 PR 히스토리를 훑는 동료가 주요 변경을 쉽게 파악할 수 있습니다. 다만 '타임테이블'과 '타임 테이블'의 표기 일관성 부족과 이슈 번호 '#126'이 포함된 점은 약간의 잡음으로 작용할 수 있습니다. 전반적으로 주요 목적을 잘 요약하고 있으므로 제목 검사 기준을 충족합니다.
Linked Issues Check ✅ Passed 링크된 이슈 #126의 요구사항인 '타임테이블 전체 조회 및 상세 조회 API 필드 추가'는 TimetableResponse에 eventName 추가와 TimetableDetailResponse에 startDate·endDate 추가 등으로 구현되어 있습니다. TimetableService도 이벤트명을 조회해 응답에 포함시키고 블록별 시작/종료 시간을 전달하도록 변경되어 기능적 요구를 충족합니다. 다만 팩토리 메서드와 서비스 생성자 시그니처 변경이 발생해 외부 소비자 영향이 있을 수 있으므로 이 부분을 문서화해야 합니다.
Out of Scope Changes Check ✅ Passed 변경사항은 주로 응답 DTO 확장과 이를 지원하기 위한 서비스 로직(이벤트 조회 주입·블록 시간 포함)으로 보이며 링크된 이슈의 목적과 직접적으로 연관되어 있습니다. PR에서 private helper 제거와 서비스 생성자 의존성 추가는 리팩터링 성격으로 보이나 필드 추가를 위해 필요한 변경으로 판단됩니다. 명백히 무관한 파일 변경이나 비기능적 이슈를 도입한 흔적은 발견되지 않습니다.
Description Check ✅ Passed PR 설명은 작업 브랜치와 변경 핵심(타임테이블 전체·상세 조회 API 필드 추가)을 명시하고 있어 변경사항과 관련이 있습니다. 다만 상세 변경 필드 목록, 호환성 영향 및 마이그레이션 안내 등은 부족합니다.
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/#126

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java (1)

82-88: event.getName() null 가능성 — 수정 필요

src/main/java/com/permitseoul/permitserver/domain/event/core/domain/Event.java에 name 필드에 @NotBlank/@NotNull/@column(nullable = false) 등 제약이 보이지 않습니다(현재는 final + @requiredargsconstructor만 있음). 따라서 TimetableService의 TimetableResponse.of(..., event.getName(), ...)에서 null이 그대로 노출될 수 있습니다.

조치(택1):

  • 도메인에 제약 추가: src/main/java/com/permitseoul/permitserver/domain/event/core/domain/Event.java에 @notblank 또는 @nonnull + @column(nullable = false) 추가.
  • 또는 서비스에서 null-safe 처리: src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java에서 event.getName()이 null일 경우 기본값 사용 또는 예외 처리.
🧹 Nitpick comments (7)
src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableResponse.java (2)

11-14: LocalDateTime 직렬화 타임존 고정 제안

서버/배포 환경의 기본 TZ에 따라 직렬화 값이 달라질 수 있습니다. API 일관성을 위해 @jsonformat에 timezone을 명시하는 것을 권장합니다(예: Asia/Seoul).

-        @JsonFormat(pattern = "yyyy.MM.dd HH:mm")
+        @JsonFormat(pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
         LocalDateTime startDate,
-        @JsonFormat(pattern = "yyyy.MM.dd HH:mm")
+        @JsonFormat(pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
         LocalDateTime endDate,

46-47: 불리언 응답 키 네이밍 통일 검토(isUserLiked vs isLiked)

리스트 응답의 isUserLiked와 상세 응답의 isLiked가 서로 달라 소비자 혼선을 유발할 수 있습니다. API 호환성을 고려해 즉시 변경이 어렵다면, 차기 버전에서 통일하거나 문서화에 명시하는 것을 권장합니다.

src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableDetailResponse.java (3)

16-19: LocalDateTime 직렬화 타임존 고정 제안

리스트 응답과 동일하게 TZ 명시를 권장합니다.

-        @JsonFormat(pattern = "yyyy.MM.dd HH:mm")
+        @JsonFormat(pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
         LocalDateTime startDate,
-        @JsonFormat(pattern = "yyyy.MM.dd HH:mm")
+        @JsonFormat(pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
         LocalDateTime endDate

28-29: 파라미터/필드 명 혼용(blockInfoRedirectUrl ↔ blockInfoUrl) 정리

팩토리 파라미터는 blockInfoRedirectUrl, 필드는 blockInfoUrl로 달라 가독성이 떨어집니다. 외부 계약을 바꾸지 않고 메서드 시그니처만 정리하는 것을 제안합니다.

-                                             final String blockInfoRedirectUrl,
+                                             final String blockInfoUrl,
...
-                blockInfoRedirectUrl,
+                blockInfoUrl,

Also applies to: 39-39


11-11: 불리언 응답 키 네이밍 통일 검토(isLiked vs isUserLiked)

동일 도메인 응답 간 키를 통일(예: 둘 다 isLiked 또는 userLiked)하는 편이 소비자 측면에서 예측 가능성이 높습니다. 문서에도 현 상태/향후 계획을 명시해 주세요.

src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java (2)

71-77: userId 미입력 시 불필요한 blockIds 계산 제거

userId == null이면 blockIds는 사용되지 않습니다. 경로를 분기해 불필요한 리스트 생성을 피하세요.

-        final List<Long> blockIds = blockList.stream()
-                .map(TimetableBlock::getTimetableBlockId)
-                .toList();
-        final Set<Long> likedBlockIds = (userId == null)
-                ? Set.of()
-                : new HashSet<>(timetableUserLikeRetriever.findLikedBlockIdsIn(userId, blockIds));
+        final Set<Long> likedBlockIds;
+        if (userId == null) {
+            likedBlockIds = Set.of();
+        } else {
+            final List<Long> blockIds = blockList.stream()
+                    .map(TimetableBlock::getTimetableBlockId)
+                    .toList();
+            likedBlockIds = new HashSet<>(timetableUserLikeRetriever.findLikedBlockIdsIn(userId, blockIds));
+        }

155-158: 카테고리 색상 미존재 시 에러 처리 적절

색상 누락을 조기에 검출하는 현재 방식이 합리적입니다. 운영 가시성을 위해 WARN 로그를 추가해도 좋습니다.

로그 제안:

  • 카테고리 ID, 블록 ID, 타임테이블 ID를 포함한 WARN 로그 출력
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 15a183e and 1fa9ab7.

📒 Files selected for processing (3)
  • src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableDetailResponse.java (4 hunks)
  • src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableResponse.java (2 hunks)
  • src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java (4 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java (1)
src/main/java/com/permitseoul/permitserver/domain/event/core/exception/EventNotfoundException.java (1)
  • EventNotfoundException (3-4)
🔇 Additional comments (4)
src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableResponse.java (1)

10-10: 검증 결과 — TimetableResponse.of 호출 1건 확인; 인자 개수(5개) 추가 확인 필요

src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java에서 TimetableResponse.of 호출을 발견했으며 첫 인자로 event.getName()이 전달되고 있습니다. 제공된 스니펫만으로는 호출의 전체 인자 수(5개) 여부를 확정할 수 없어 전체 호출 라인 확인 필요.

src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/dto/TimetableDetailResponse.java (1)

16-19: 상세 응답에 시작/종료 일시 추가 — 적절합니다

블록 단위의 시간 범위가 상세 응답에 포함된 점 좋습니다.

Also applies to: 29-30, 40-41

src/main/java/com/permitseoul/permitserver/domain/eventtimetable/timetable/api/service/TimetableService.java (2)

45-69: 이벤트/타임테이블/구성요소 일괄 조회 + 예외 매핑 — 깔끔합니다

도메인별 NotFound를 NotfoundTimetableException/ErrorCode로 매핑한 흐름이 명료합니다. 유지보수 용이성이 좋아졌습니다.


123-126: 상세 응답 필드 연결 정상

블록 시작/종료 시각 및 리다이렉트 URL 전달이 DTO 시그니처 변경과 일치합니다.

@sjk4618 sjk4618 merged commit 6a68ca4 into dev Sep 13, 2025
2 checks passed
@sjk4618 sjk4618 deleted the feat/#126 branch September 13, 2025 08:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 타임테이블 전체 조회 api, 타임 테이블 상세 조회 api 필드 추가

2 participants