Skip to content

[Feat] WTH-246 : 출석 기록 조회 페이지 UI 구현#36

Open
nabbang6 wants to merge 7 commits intodevelopfrom
WTH-246-출석-기록-조회-페이지-UI-구현

Hidden character warning

The head ref may contain hidden characters: "WTH-246-\ucd9c\uc11d-\uae30\ub85d-\uc870\ud68c-\ud398\uc774\uc9c0-UI-\uad6c\ud604"
Open

[Feat] WTH-246 : 출석 기록 조회 페이지 UI 구현#36
nabbang6 wants to merge 7 commits intodevelopfrom
WTH-246-출석-기록-조회-페이지-UI-구현

Conversation

@nabbang6
Copy link
Copy Markdown
Collaborator

@nabbang6 nabbang6 commented Apr 2, 2026

✅ PR 유형

어떤 변경 사항이 있었나요?

  • 새로운 기능 추가
  • 버그 수정
  • 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
  • 코드 리팩토링
  • 주석 추가 및 수정
  • 문서 수정
  • 빌드 부분 혹은 패키지 매니저 수정
  • 파일 혹은 폴더명 수정
  • 파일 혹은 폴더 삭제

📌 관련 이슈번호

  • Closed #246

✅ Key Changes

  • 출석 조회 페이지 라우트 추가 (/attendance/history)
  • AttendanceHistoryContent 컴포넌트 구현
  • AttendanceRecord, AttendanceSummary, AttendanceSummaryResponse 타입 추가
  • API 연동은 mock 데이터로 대체 (TODO)

📸 스크린샷 or 실행영상

/attendance/history 에서 확인 가능합니다!

  • 출석 조회 페이지
image
  • 출석 기록이 없는 경우
image

🎸 기타 사항 or 추가 코멘트

출석 기록 조회 페이지가 새로 나와서,, ui만 추가 구현했습니당!
게시판이랑 적당히 병렬적으로 작업하는 게 편할 것 같아서,, 미리 해뒀어용

Summary by CodeRabbit

  • New Features
    • 출석 기록 조회 페이지 추가
    • 출석 카드 클릭/키보드로 기록 조회로 이동 가능
    • 총 모임 수·출석·결석 통계 카드 제공
    • 세션별 출석 상태 태그(레이블·스타일), 제목, 한글 날짜·시간 형식, 장소 정보 표시
    • 출석 항목이 없을 때의 빈 상태 안내 문구 표시

@nabbang6 nabbang6 requested review from JIN921, dalzzy and woneeeee April 2, 2026 13:26
@nabbang6 nabbang6 self-assigned this Apr 2, 2026
@nabbang6 nabbang6 added ✨ Feature 기능 개발 🎨 Html&css 마크업 & 스타일링 labels Apr 2, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

🤖 Claude 테스트 제안

모델: claude-sonnet-4-6 | 토큰: 0 입력 / 0 출력

변경된 컴포넌트에 대해 Claude가 생성한 테스트 코드입니다. 검토 후 적합한 부분만 사용하세요.

src/app/(private)/(main)/attendance/history/page.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/attendance/AttendanceContent.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/attendance/AttendanceHistoryContent.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/types/attendance.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


이 코멘트는 Claude API를 통해 자동 생성되었습니다. 반드시 검토 후 사용하세요.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

PR 테스트 결과

Jest: 통과

🎉 모든 테스트를 통과했습니다!

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 2, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1eff1b88-9042-4caf-8824-c433762d6a9a

📥 Commits

Reviewing files that changed from the base of the PR and between 6ba82e0 and d859444.

📒 Files selected for processing (1)
  • src/components/attendance/AttendanceHistoryContent.tsx
✅ Files skipped from review due to trivial changes (1)
  • src/components/attendance/AttendanceHistoryContent.tsx

📝 Walkthrough

Walkthrough

출석 기록 조회 페이지와 관련 컴포넌트·타입·상수가 추가되었고, 기존 출석 카드에 클릭·키보드로 /attendance/history로 이동하는 네비게이션이 도입되었습니다. 새 페이지는 로컬 mockSummary를 사용해 렌더링됩니다.

Changes

Cohort / File(s) Summary
페이지
src/app/(private)/(main)/attendance/history/page.tsx
출석 기록 조회용 Next.js 페이지 추가. mockSummary을 사용해 AttendanceHistoryContent에 전달.
컴포넌트 — 출석 카드
src/components/attendance/AttendanceContent.tsx
useRouter 도입 및 카드에 onClick/onKeyDown 핸들러 추가하여 /attendance/history로 라우팅하도록 변경.
컴포넌트 — 기록 목록
src/components/attendance/AttendanceHistoryContent.tsx
새 클라이언트 컴포넌트 추가. 요약 통계, 빈 상태 처리, 기록 목록 렌더링(상태 Tag, 제목, 날짜·시간, 위치).
컴포넌트 인덱스 내보내기
src/components/attendance/index.ts
AttendanceHistoryContentAttendanceHistoryContentProps를 신규 export로 추가.
타입 정의
src/types/attendance.ts
AttendanceRecord, AttendanceSummary, AttendanceSummaryResponse 타입/인터페이스 추가 및 export 확장.
상수
src/constants/attendance.ts
ATTENDANCE_STATUS_CONFIG 추가(각 AttendanceStatus에 대한 label·className 매핑).

Sequence Diagram

sequenceDiagram
    actor User
    participant AttendanceContent as AttendanceContent
    participant Router as Next Router
    participant AttendanceHistoryPage as /attendance/history (Page)
    participant AttendanceHistoryContent as AttendanceHistoryContent
    participant UI as UI Elements

    User->>AttendanceContent: 카드 클릭 또는 Enter/Space
    AttendanceContent->>Router: router.push('/attendance/history')
    Router->>AttendanceHistoryPage: 라우트 로드
    AttendanceHistoryPage->>AttendanceHistoryContent: summary prop 전달
    AttendanceHistoryContent->>AttendanceHistoryContent: attendances 존재 여부 검사
    alt attendances 존재
        AttendanceHistoryContent->>UI: 요약 카드 및 각 기록 렌더
    else 비어있음
        AttendanceHistoryContent->>UI: "출석 기록이 없습니다." 렌더
    end
    UI->>User: 화면 표시
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • dalzzy
  • woneeeee

Poem

🐰 달빛 아래 카드 톡, 발끝으로 탭해요
기록을 모아 착실히, 기억을 쌓아가요
빈 페이지도 손 흔들며 반갑게 웃고
날짜와 장소, 작은 표식 하나하나
껑충껑충 기쁜 마음으로 가져왔어요 ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ 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%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 PR의 주요 변경 사항인 출석 기록 조회 페이지 UI 구현을 명확하게 설명하고 있습니다.
Description check ✅ Passed PR 설명이 템플릿의 모든 필수 섹션을 포함하고 있으며, 변경 사항, 관련 이슈, 주요 변경 내용, 스크린샷이 모두 제시되어 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch WTH-246-출석-기록-조회-페이지-UI-구현

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.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

PR 검증 결과

TypeScript: 통과
ESLint: 통과
Prettier: 통과
Build: 통과

🎉 모든 검증을 통과했습니다!

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

구현한 기능 Preview: https://weeth-i5jwuu5mg-weethsite-4975s-projects.vercel.app

Copy link
Copy Markdown

@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: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/app/`(private)/(main)/attendance/history/page.tsx:
- Around line 4-55: Add a clear, trackable guard and ticket tag around the mock
data to prevent accidental production merge: keep the mockSummary constant but
prepend a TODO comment like "TODO(WTH-246): DO NOT MERGE - replace with API
before release", and add a runtime safety check inside AttendanceHistoryPage (or
before passing to AttendanceHistoryContent) that asserts mocks are only used in
dev or when a dedicated flag is set (e.g., check process.env.NODE_ENV ===
'development' or a env var like NEXT_PUBLIC_USE_MOCKS) and throw/log an error if
mockSummary is used in production; reference the symbols mockSummary,
AttendanceHistoryPage, and AttendanceHistoryContent when implementing the
comment and the guard.

In `@src/components/attendance/AttendanceContent.tsx`:
- Around line 54-59: The Card currently only has an onClick handler which
prevents keyboard users from activating navigation; make the Card focusable and
keyboard-activatable by adding tabIndex={0} and role="button" (or render it as a
native <button>/<a>), and implement an onKeyDown handler that listens for Enter
and Space to call router.push('/attendance/history') (same navigation logic as
the onClick). Update the Card usage in AttendanceContent.tsx so the interactive
behavior is consistent across onClick and onKeyDown and ensure any aria-label or
accessible text remains correct.

In `@src/components/attendance/AttendanceHistoryContent.tsx`:
- Around line 27-28: The JSX in AttendanceHistoryContent (the divs using
className strings) is using hardcoded spacing/size utilities (max-w-[1025px],
px-[36px], w-[49px], py-[2px], gap-[17px], pt-[15px], pb-[19px] and the
instances noted at 75-75, 110-110); replace each hardcoded value with the
corresponding design token class (e.g., max-w-*, px-*, w-*, py-*, gap-*, pt-*,
pb-* tokens) or, if no existing token maps to the needed size, open a proposal
to add named tokens and then use those token classes instead; update className
strings in AttendanceHistoryContent.tsx (the outer container and the inner flex
container and any elements using
w-[49px]/py-[2px]/gap-[17px]/pt-[15px]/pb-[19px]) to use token classes only.
- Around line 73-82: The Tag currently treats any record.status !== 'ATTEND' as
"결석", causing AttendanceStatus.PENDING to be misrendered; update the conditional
logic in AttendanceHistoryContent.tsx (the Tag rendering that references
record.status) to explicitly branch for each status (e.g., 'ATTEND', 'PENDING',
'ABSENT' or whatever AttendanceStatus enum values are) and map each to the
correct label and className (button variant and background/text classes) instead
of a binary ATTEND vs not-ATTEND check so PENDING shows the correct label and
styling.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 129ba966-2b32-45b5-979f-61265e190bcb

📥 Commits

Reviewing files that changed from the base of the PR and between 51407c2 and 03d0199.

📒 Files selected for processing (5)
  • src/app/(private)/(main)/attendance/history/page.tsx
  • src/components/attendance/AttendanceContent.tsx
  • src/components/attendance/AttendanceHistoryContent.tsx
  • src/components/attendance/index.ts
  • src/types/attendance.ts

Comment on lines +4 to +55
// TODO: API 연동 시 실제 데이터로 교체
const mockSummary: AttendanceSummary = {
total: 5,
attendanceCount: 3,
absenceCount: 2,
attendances: [
{
id: 5,
status: 'ABSENT',
title: '5주차 정기모임',
start: '2026-02-23T10:00:00.000Z',
end: '2026-02-23T12:00:00.000Z',
location: '공학관 401호',
},
{
id: 4,
status: 'ATTEND',
title: '4주차 정기모임',
start: '2026-02-16T10:00:00.000Z',
end: '2026-02-16T12:00:00.000Z',
location: '공학관 401호',
},
{
id: 3,
status: 'ABSENT',
title: '3주차 정기모임',
start: '2026-02-09T10:00:00.000Z',
end: '2026-02-09T12:00:00.000Z',
location: '공학관 401호',
},
{
id: 2,
status: 'ATTEND',
title: '2주차 정기모임',
start: '2026-02-02T10:00:00.000Z',
end: '2026-02-02T12:00:00.000Z',
location: '공학관 401호',
},
{
id: 1,
status: 'ATTEND',
title: '1주차 정기모임',
start: '2026-01-26T10:00:00.000Z',
end: '2026-01-26T12:00:00.000Z',
location: '공학관 401호',
},
],
};

export default function AttendanceHistoryPage() {
return <AttendanceHistoryContent summary={mockSummary} />;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

mock 데이터의 잔존 리스크를 줄이는 장치가 있으면 좋겠습니다.

현재는 UI 확인용으로 적절하지만, 배포 전 미교체를 방지할 수 있도록 추적 이슈/플래그(예: TODO(WTH-246): API 교체 전 병합 금지)를 함께 두는 것을 권장합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/app/`(private)/(main)/attendance/history/page.tsx around lines 4 - 55,
Add a clear, trackable guard and ticket tag around the mock data to prevent
accidental production merge: keep the mockSummary constant but prepend a TODO
comment like "TODO(WTH-246): DO NOT MERGE - replace with API before release",
and add a runtime safety check inside AttendanceHistoryPage (or before passing
to AttendanceHistoryContent) that asserts mocks are only used in dev or when a
dedicated flag is set (e.g., check process.env.NODE_ENV === 'development' or a
env var like NEXT_PUBLIC_USE_MOCKS) and throw/log an error if mockSummary is
used in production; reference the symbols mockSummary, AttendanceHistoryPage,
and AttendanceHistoryContent when implementing the comment and the guard.

Comment on lines +54 to +59
<Card
variant="onlyText"
overline="출석"
title="출석 기록"
onClick={() => router.push('/attendance/history')}
/>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

키보드 접근성 없이 클릭 내비게이션만 연결되어 있습니다.

현재 구현은 포커스 후 Enter/Space로 이동이 보장되지 않아 키보드 사용자에게 기능 접근이 막힐 수 있습니다.

🔧 제안 수정
         <Card
           variant="onlyText"
           overline="출석"
           title="출석 기록"
           onClick={() => router.push('/attendance/history')}
+          onKeyDown={(e) => {
+            if (e.key === 'Enter' || e.key === ' ') {
+              e.preventDefault();
+              router.push('/attendance/history');
+            }
+          }}
         />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Card
variant="onlyText"
overline="출석"
title="출석 기록"
onClick={() => router.push('/attendance/history')}
/>
<Card
variant="onlyText"
overline="출석"
title="출석 기록"
onClick={() => router.push('/attendance/history')}
onKeyDown={(e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
router.push('/attendance/history');
}
}}
/>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/attendance/AttendanceContent.tsx` around lines 54 - 59, The
Card currently only has an onClick handler which prevents keyboard users from
activating navigation; make the Card focusable and keyboard-activatable by
adding tabIndex={0} and role="button" (or render it as a native <button>/<a>),
and implement an onKeyDown handler that listens for Enter and Space to call
router.push('/attendance/history') (same navigation logic as the onClick).
Update the Card usage in AttendanceContent.tsx so the interactive behavior is
consistent across onClick and onKeyDown and ensure any aria-label or accessible
text remains correct.

Comment on lines +27 to +28
<div className="mx-auto flex w-full max-w-[1025px] flex-col gap-700 pt-600 pb-800">
<div className="flex flex-col items-start gap-200 self-stretch px-[36px]">
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

하드코딩된 arbitrary spacing/size 클래스는 토큰 클래스로 치환해 주세요.

max-w-[1025px], px-[36px], w-[49px], py-[2px], gap-[17px], pt-[15px], pb-[19px]는 디자인 토큰 우선 규칙과 충돌합니다. 기존 토큰으로 대체하거나, 토큰이 없다면 먼저 토큰 추가 합의를 거쳐 주세요.

As per coding guidelines: "Always use design token classes first (text-, bg-, typo-, p-, gap-*) — no hardcoded values; ask before adding new tokens".

Also applies to: 75-75, 110-110

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/attendance/AttendanceHistoryContent.tsx` around lines 27 - 28,
The JSX in AttendanceHistoryContent (the divs using className strings) is using
hardcoded spacing/size utilities (max-w-[1025px], px-[36px], w-[49px], py-[2px],
gap-[17px], pt-[15px], pb-[19px] and the instances noted at 75-75, 110-110);
replace each hardcoded value with the corresponding design token class (e.g.,
max-w-*, px-*, w-*, py-*, gap-*, pt-*, pb-* tokens) or, if no existing token
maps to the needed size, open a proposal to add named tokens and then use those
token classes instead; update className strings in AttendanceHistoryContent.tsx
(the outer container and the inner flex container and any elements using
w-[49px]/py-[2px]/gap-[17px]/pt-[15px]/pb-[19px]) to use token classes only.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

🤖 Claude 테스트 제안

모델: claude-sonnet-4-6 | 토큰: 0 입력 / 0 출력

변경된 컴포넌트에 대해 Claude가 생성한 테스트 코드입니다. 검토 후 적합한 부분만 사용하세요.

src/app/(private)/(main)/attendance/history/page.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/attendance/AttendanceContent.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/attendance/AttendanceHistoryContent.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/constants/attendance.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/types/attendance.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


이 코멘트는 Claude API를 통해 자동 생성되었습니다. 반드시 검토 후 사용하세요.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

PR 테스트 결과

Jest: 통과

🎉 모든 테스트를 통과했습니다!

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

PR 검증 결과

TypeScript: 실패
ESLint: 통과
Prettier: 통과
Build: 실패

⚠️ 일부 검증에 실패했습니다. 확인 후 수정해주세요.

Copy link
Copy Markdown

@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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/attendance/AttendanceHistoryContent.tsx`:
- Line 17: The build fails because the imported constant name
(ATTENDANCE_ATTENDANCE_STATUS_CONFIG) does not match the identifier used in the
component (ATTENDANCE_STATUS_CONFIG); update the import in
AttendanceHistoryContent.tsx to import { ATTENDANCE_STATUS_CONFIG } from
'@/constants/attendance' (or alternatively rename all usages to
ATTENDANCE_ATTENDANCE_STATUS_CONFIG) so the import symbol and the usage
(ATTENDANCE_STATUS_CONFIG) are consistent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1e0db108-512a-40ce-9cbe-577ecaaaad1f

📥 Commits

Reviewing files that changed from the base of the PR and between 03d0199 and 6ba82e0.

📒 Files selected for processing (3)
  • src/components/attendance/AttendanceContent.tsx
  • src/components/attendance/AttendanceHistoryContent.tsx
  • src/constants/attendance.ts
✅ Files skipped from review due to trivial changes (1)
  • src/constants/attendance.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/attendance/AttendanceContent.tsx

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

🤖 Claude 테스트 제안

모델: claude-sonnet-4-6 | 토큰: 0 입력 / 0 출력

변경된 컴포넌트에 대해 Claude가 생성한 테스트 코드입니다. 검토 후 적합한 부분만 사용하세요.

src/app/(private)/(main)/attendance/history/page.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/attendance/AttendanceContent.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/attendance/AttendanceHistoryContent.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/constants/attendance.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/types/attendance.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


이 코멘트는 Claude API를 통해 자동 생성되었습니다. 반드시 검토 후 사용하세요.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

PR 테스트 결과

Jest: 통과

🎉 모든 테스트를 통과했습니다!

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

PR 검증 결과

TypeScript: 통과
ESLint: 통과
Prettier: 통과
Build: 통과

🎉 모든 검증을 통과했습니다!

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

구현한 기능 Preview: https://weeth-3wtqbdgzj-weethsite-4975s-projects.vercel.app

Copy link
Copy Markdown
Member

@dalzzy dalzzy left a comment

Choose a reason for hiding this comment

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

수고하셨습니당!! 구현이 너무 빨라요 ,,,,👍🏻🩷

Comment on lines +66 to +69
attendances.map((record) => {
const startDate = new Date(record.start);
const endDate = new Date(record.end);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

렌더 안에서 new Date()와 날짜 포맷팅이 반복되고 있어서, 표시용 데이터로 한 번 변환한 뒤 렌더하면 JSX가 더 단순해질 것 같습니다!!

const attendanceItems = attendances.map((record) => {
  const startDate = new Date(record.start);
  const endDate = new Date(record.end);

  return {
    ...record,
    statusConfig: ATTENDANCE_STATUS_CONFIG[record.status],
    formattedDate: `${formatKoreanDate(startDate)} (${formatTime(startDate)}~${formatTime(endDate)})`,
  };
});

이런 식으로 분리해두면 렌더부가 조금 더 읽기 쉽게 정리할 수 있을 것 같아욤!!

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

Labels

✨ Feature 기능 개발 🎨 Html&css 마크업 & 스타일링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants