Skip to content

Comments

[Feature] 홈 및 일정 페이지 일정 목록 조회#113

Open
yummjin wants to merge 9 commits intodevelopfrom
feature/97
Open

[Feature] 홈 및 일정 페이지 일정 목록 조회#113
yummjin wants to merge 9 commits intodevelopfrom
feature/97

Conversation

@yummjin
Copy link
Member

@yummjin yummjin commented Feb 20, 2026

🛠️ 변경 사항

실제로 어떤 작업을 했는지 구체적으로 작성해주세요.

  • UI 수정 (Design)
  • 기능 추가 (Feature)
  • 버그 수정 (Bug)
  • 리팩토링 (Refactor)
  • 성능 개선 (Performance)
  • 테스트 추가 (Chore)
  • 기타:

세부 변경 내용

  • 홈 및 일정 페이지에서 일정 목록 조회 API 연동
  • 일정 페이지 달력에서 일정 조회 API 연동
  • 달력 날짜 변경 시 요일에 알맞게 렌더링되도록 수정

🔍 관련 이슈

관련 이슈를 링크해주세요. ex) close #23, related #23


📸 스크린샷 / GIF (선택)

UI 변경이 있다면 첨부해주세요.

Before After

⚠️ 주의 사항 / 리뷰 포인트

리뷰어가 특히 봐줬으면 하는 부분이나 고민했던 지점을 작성해주세요.


🔄 연관 작업

후속 작업이나 연관된 PR이 있다면 링크해주세요.

@yummjin yummjin self-assigned this Feb 20, 2026
@yummjin yummjin added 🐞 Bug 발생한 버그에 대한 대응입니다. ✨ Feature 신규 기능을 추가합니다. labels Feb 20, 2026
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @yummjin, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 홈 및 일정 페이지에 일정 조회 기능을 통합하여 사용자에게 동적인 일정 정보를 제공합니다. 기존 목업 데이터를 실제 API 호출로 대체하고, 달력 컴포넌트를 개선하여 선택된 날짜에 따라 일정을 정확하게 표시하도록 업데이트되었습니다. 또한, 데이터 로딩 중 사용자 경험을 향상시키기 위해 스켈레톤 로더가 추가되었습니다.

Highlights

  • 일정 목록 조회 API 연동: 홈 및 일정 페이지에서 사용자 일정을 조회하는 API를 연동하여 실제 데이터를 기반으로 일정을 표시하도록 변경되었습니다.
  • 일정 페이지 달력 API 연동 및 렌더링 개선: 일정 페이지의 달력에 일정 조회 API를 연동하고, 날짜 변경 시 요일에 맞춰 일정이 올바르게 렌더링되도록 수정되었습니다.
  • 스켈레톤 UI 추가: 일정 목록 로딩 시 사용자 경험을 개선하기 위해 스켈레톤 UI가 추가되었습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • apps/web/src/entities/schedule/api/getMemberScheduleList.ts
    • 회원별 일정 목록을 가져오는 새로운 API 함수를 추가했습니다.
  • apps/web/src/entities/schedule/api/getScheduleCalendar.ts
    • 달력 조회 API 함수가 선택적 요청 매개변수를 받도록 수정되었고, 반환 타입이 배열로 변경되었습니다.
  • apps/web/src/entities/schedule/model/schedule.types.ts
    • 달력 관련 일정 항목 및 목록 타입을 추가하여 일정 타입을 확장했습니다.
  • apps/web/src/entities/schedule/styles/ScheduleList.css.ts
    • 일정 목록 컨테이너의 스타일을 조정하고, '일정 추가' 버튼에 대한 스타일을 추가했습니다.
  • apps/web/src/entities/schedule/ui/ScheduleList.tsx
    • 홈 페이지 전용 빈 상태를 처리하고 새로운 디자인 시스템 컴포넌트를 사용하도록 일정 목록 컴포넌트를 업데이트했습니다.
  • apps/web/src/entities/schedule/ui/ScheduleListItem.tsx
    • 유틸리티 함수를 화살표 함수로 리팩토링하고, 태그 스타일을 'gray' 타입을 지원하도록 업데이트했습니다.
  • apps/web/src/pages/home/ui/HomePage.tsx
    • 홈 페이지에 회원 일정 목록 API와 스켈레톤 로더를 통합했습니다.
  • apps/web/src/pages/schedule/ui/SchedulePage.tsx
    • 달력 컴포넌트를 교체하고, 일정 달력 API를 통합했으며, 스켈레톤 로더를 추가했습니다. 또한, 필터링을 위한 날짜 처리 로직을 업데이트했습니다.
  • apps/web/src/shared/constants/endpoint.ts
    • 회원별 일정 목록을 위한 새로운 엔드포인트를 추가했습니다.
  • apps/web/src/shared/queries/schedule.ts
    • 회원 일정 목록을 위한 새로운 쿼리 옵션을 추가하고, 달력 쿼리가 요청 매개변수를 받도록 업데이트했습니다.
  • apps/web/src/widgets/schedule-calendar/style/ScheduleCalendar.css.ts
    • 달력 헤더 스타일을 업데이트하고, 일정 타일(번개런, 정기런) 스타일을 추가했습니다.
  • apps/web/src/widgets/schedule-calendar/style/ScheduleCalendarBase.css.ts
    • 인접 월의 날짜를 숨기기 위해 달력 기본 스타일을 수정했습니다.
  • apps/web/src/widgets/schedule-calendar/ui/ScheduleCalendar.tsx
    • 달력 컴포넌트를 리팩토링하여 월 탐색을 내부적으로 처리하고, 날짜에 일정 표시기를 표시하도록 했습니다.
  • apps/web/src/widgets/schedule-filter-tab/ui/ScheduleFilterTab.tsx
    • 필터 버튼의 key 속성을 filter.value에서 filter.label로 변경했습니다.
  • apps/web/src/widgets/skeleton/styles/ScheduleListSkeleton.css.ts
    • 일정 목록 스켈레톤 로더를 위한 CSS 스타일을 추가했습니다.
  • apps/web/src/widgets/skeleton/ui/ScheduleListSkeleton.tsx
    • 일정 목록 스켈레톤 로더를 표시하는 새로운 컴포넌트를 추가했습니다.
  • apps/web/src/widgets/skeleton/ui/index.ts
    • 새로운 일정 목록 스켈레톤 컴포넌트를 내보냈습니다.
Activity
  • 일정 관리 기능을 위한 새로운 기능이 도입되었습니다.
  • 일정 목록 및 달력 보기를 위한 API 통합이 수행되었습니다.
  • 새로운 기능들을 반영하고 사용자 경험을 개선하기 위해 UI 컴포넌트가 업데이트되었습니다.
  • 데이터 가져오기 중 인지되는 성능을 향상시키기 위해 스켈레톤 로더가 추가되었습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

✅ 잘한 점

  • 홈 및 일정 페이지에서 일정 목록 조회 API 연동 및 달력에서 일정 조회 API 연동 기능이 성공적으로 구현되었습니다.
  • ScheduleListSkeleton 컴포넌트를 추가하여 로딩 상태를 사용자에게 명확하게 보여주는 점이 좋습니다.
  • ScheduleListItem에서 function 선언을 const arrow function으로 변경하여 코드 컨벤션을 준수한 점이 좋습니다.
  • ScheduleCalendarBase.css.ts에서 .react-calendar__month-view__days__day--neighboringMonth 스타일을 display: 'none'에서 visibility: 'hidden', pointerEvents: 'none'으로 변경하여 접근성과 레이아웃 안정성을 개선한 점이 좋습니다.
  • END_POINT.SCHEDULE.MEMBER_LIST 상수가 BIG_SNAKE_CASE 규칙을 잘 따르고 있습니다.

❌ 위반 사항

  • [TanStack Query 네이밍 규칙 준수] getScheduleCalendarQueryqueryKeyrequest 파라미터가 포함되어 있지 않아, 요청 파라미터가 변경될 때 캐싱이 제대로 동작하지 않거나 오래된 데이터가 표시될 수 있습니다.
  • [접근성 준수] ScheduleList 컴포넌트의 CalendarIcon이 시각적으로만 사용되는 아이콘임에도 aria-hidden="true" 속성이 없어 스크린 리더 사용자에게 불필요하게 읽힐 수 있습니다.
  • [성능] ScheduleFilterTab 컴포넌트에서 Buttonkey prop으로 filter.label을 사용하고 있습니다. filter.label은 중복될 가능성이 있어 React 리스트 렌더링 시 성능 저하나 예기치 않은 동작을 유발할 수 있습니다. filter.value는 고유하므로 더 적합합니다.

🔧 개선 제안

  • SchedulePage.tsx에서 scheduleList를 필터링하는 로직이 dayjs(item.meetingAt).isAfter(dayjs(selectedDate))로 되어 있어, selectedDate 당일의 일정은 표시되지 않습니다. selectedDate를 포함하여 당일 이후의 일정을 표시하려면 isSameOrAfter를 사용하거나, selectedDate에 해당하는 일정을 정확히 표시하려면 isSame(selectedDate, 'day')를 사용하는 것이 좋습니다. API에서 이미 날짜 필터링을 제공한다면 클라이언트 측 필터링은 불필요할 수 있습니다.
  • SchedulePage.tsxdate 상태가 초기값으로 undefined를 가지고 있어, 초기 API 호출 시 date 파라미터가 누락될 수 있습니다. selectedDate의 초기값을 기반으로 date 상태를 초기화하여 API 호출의 일관성을 유지하는 것이 좋습니다.

request?: CrewScheduleCalendarRequest
) =>
queryOptions({
queryKey: [...scheduleQueries.all, 'getScheduleCalendar', crewId],
Copy link
Contributor

Choose a reason for hiding this comment

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

high

[TanStack Query 네이밍 규칙 준수] getScheduleCalendarQueryqueryKeyrequest 파라미터가 포함되어 있지 않습니다. request 파라미터(예: yearMonth)가 변경될 때 TanStack Query가 데이터를 다시 가져오지 않을 수 있어 오래된 데이터가 표시될 위험이 있습니다. requestqueryKey에 포함하여 캐싱 및 재요청이 올바르게 동작하도록 해야 합니다.

Suggested change
queryKey: [...scheduleQueries.all, 'getScheduleCalendar', crewId],
queryKey: [...scheduleQueries.all, 'getScheduleCalendar', crewId, request],

Comment on lines +81 to +82
items={scheduleList.filter((item) =>
dayjs(item.meetingAt).isAfter(dayjs(selectedDate))
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

현재 필터링 로직 dayjs(item.meetingAt).isAfter(dayjs(selectedDate))selectedDate 당일의 일정을 제외하고 그 이후의 일정만 표시합니다. 만약 selectedDate를 포함하여 당일 이후의 일정을 표시하려면 isSameOrAfter를 사용하는 것이 좋습니다. 또는 selectedDate에 해당하는 일정을 정확히 표시하려면 isSame(selectedDate, 'day')를 고려해볼 수 있습니다. API에서 이미 날짜 필터링을 제공한다면 클라이언트 측 필터링은 불필요할 수 있습니다.

Suggested change
items={scheduleList.filter((item) =>
dayjs(item.meetingAt).isAfter(dayjs(selectedDate))
items={scheduleList.filter((item) =>
dayjs(item.meetingAt).isSameOrAfter(dayjs(selectedDate), 'day')
)}

@github-actions
Copy link

SCHEDULE: {
LIST: (crewId: number) => `crews/${crewId}/schedules`,
CALENDAR: (crewId: number) => `crews/${crewId}/schedules/calendar`,
MEMBER_LIST: 'members/me/schedules',
Copy link
Member

Choose a reason for hiding this comment

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

상수에 api의 역할을 좀더 담아서 JOINED_LIST는 어떨까요?


const { data: scheduleCalendarList = [] } = useQuery({
...scheduleQueries.getScheduleCalendarQuery(crewId, {
yearMonth: dayjs(selectedDate).format('YYYY-MM'),
Copy link
Member

Choose a reason for hiding this comment

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

const formatDate = (date: string | Date, format = 'YYYY.MM') => {
  return dayjs(date).format(format);
};

dayjs가 군데군데 쓰여서 날짜 포맷팅 유틸로 분리 및 확장해봐도 괜찮을거 같네여!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐞 Bug 발생한 버그에 대한 대응입니다. ✨ Feature 신규 기능을 추가합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] 일정 목록 조회 API 연동

2 participants