Skip to content

feat: 프로젝트 목록 기능 추가 (#56)#64

Merged
YeoEunnn merged 17 commits intodevelopfrom
feat/hom-add-func-56
Jan 23, 2026
Merged

feat: 프로젝트 목록 기능 추가 (#56)#64
YeoEunnn merged 17 commits intodevelopfrom
feat/hom-add-func-56

Conversation

@AndyH0ng
Copy link
Member

📌 관련 이슈

✨ 변경 내용

  • 카드 없음 상태 구현 >> 수정이 좀 필요함
  • 카드 스켈레톤(공동 컴포넌트 도입) 구현
  • 검색 구현(디바운싱 300ms)
  • 홈페이지 구조 개선
  • 드래그 호버 시 하이라이트가 버벅거리는 버그 수정
  • 필터&정렬 키 > Popover에서 Dropdown으로 수정
  • 리스트뷰, 카드뷰를 각각 공동 컴포넌트 (src/common)에 추가 (비디오쪽에서도 같은 컴포넌트 사용)
  • 리스트뷰 구현
  • 리스트뷰 <-> 카드뷰 전환

💡 참고 사항

스크린샷, 참고 링크, 추가 설명 등 (없으면 생략 가능)
67%축소 스크린샷 ↓
image
image

@github-actions github-actions bot added component 컴포넌트 관련 변경 page 페이지 관련 변경 types 타입 정의 변경 labels Jan 19, 2026
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @AndyH0ng, 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은 프로젝트 목록 기능을 추가하여 사용자 경험을 향상시키는 데 중점을 둡니다. 프로젝트를 카드 뷰와 리스트 뷰로 볼 수 있는 기능을 도입하고, 검색 기능을 통해 원하는 프로젝트를 쉽게 찾을 수 있도록 합니다. 또한, 드래그 앤 드롭 관련 버그를 수정하고 UI 컴포넌트를 개선하여 전반적인 안정성과 사용성을 높였습니다.

Highlights

  • 카드 뷰 및 리스트 뷰 공통 컴포넌트 추가: 프로젝트 목록을 표시하기 위한 CardViewListView라는 두 가지 새로운 공통 컴포넌트가 추가되었습니다. 이 컴포넌트들은 재사용 가능하도록 설계되었습니다.
  • 프로젝트 목록 검색 기능: 프로젝트 목록에 검색 기능이 구현되었으며, 사용자 입력에 대한 성능 최적화를 위해 300ms의 디바운싱이 적용되었습니다.
  • 드래그 호버 시 하이라이트 버그 수정: FileDropzone 컴포넌트에서 드래그 호버 시 하이라이트가 깜빡이는 버그를 수정하기 위해 dragCounter를 도입하여 드래그 상태 관리를 개선했습니다.
  • 필터 및 정렬 UI 개선: 기존의 필터 및 정렬 UI가 Popover에서 Dropdown 컴포넌트로 변경되어 사용성이 향상되었습니다.
  • 홈페이지 구조 개선 및 뷰 모드 전환 기능: 홈페이지의 프로젝트 섹션 구조가 개선되었으며, 사용자가 프로젝트 목록을 카드 뷰 또는 리스트 뷰로 전환할 수 있는 기능이 추가되었습니다.
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.

@AndyH0ng
Copy link
Member Author

@claude 코드 리뷰해줘

@claude
Copy link

claude bot commented Jan 19, 2026

Claude finished @AndyH0ng's task in 1m 40s —— View job


코드 리뷰 완료 ✅

작업 목록

  • 변경된 파일 읽기 및 분석
  • 코드 품질 및 베스트 프랙티스 검토
  • 리뷰 피드백 작성

전체 평가

전반적으로 잘 구현된 PR입니다! 공통 컴포넌트 설계가 제네릭을 활용해서 재사용성이 높고, 드래그 호버 버그 수정도 dragCounter를 통해 정확하게 해결했습니다. 몇 가지 개선할 수 있는 부분을 발견했습니다.

🐛 버그 및 오타

1. CardView.tsx - 오타 (ariaLabal → ariaLabel)

src/components/common/CardView.tsx:12, 22, 29

ariaLabal?: string;  // ❌ 오타

ariaLabalariaLabel의 오타입니다. 접근성 속성이므로 정확한 네이밍이 중요합니다.

해결방법:

  • ariaLabalariaLabel로 모두 수정

Fix this →


2. ListView.tsx - 주석 처리된 코드 제거 필요

src/components/common/ListView.tsx:63-76

{/* <div className="listView__content">
  <div className="listView__title">{renderTitle(item)}</div>
  ...
</div> */}

주석 처리된 코드가 남아있습니다. 불필요한 코드는 제거하는 것이 코드 가독성에 좋습니다.

해결방법:

  • 주석 처리된 63-76 라인 삭제

Fix this →


⚠️ 타입 안전성 개선 사항

3. useProjectList.ts - 타입 불일치

src/hooks/useProjectList.ts:4, 11, 13, 20

import type { CardItems } from '@/types/project';
// ...
export function useProjectList(projects: CardItems[], options?: Options)

훅 이름은 useProjectList인데 타입은 CardItems[]를 사용합니다. 그런데 실제 사용처(HomePage.tsx:22)와 타입 정의(project.ts:11-20)를 보면 ProjectItem[]을 사용해야 할 것 같습니다.

해결방법:

  • 타입을 ProjectItem[]로 변경하거나, CardItems가 올바른 타입이라면 project.ts에 해당 타입 export 추가

4. ProjectList.tsx - 클릭 핸들러 없음

src/components/projects/ProjectList.tsx:20

<ListView
  items={items}
  getKey={(item) => item.id}
  // ... 다른 props
  // onItemClick 없음
/>

ListView는 onItemClick을 지원하지만 ProjectList에서는 전달하지 않습니다. 사용자가 리스트 항목을 클릭해서 프로젝트로 이동하는 것이 일반적인 UX입니다.

해결방법:

  • ProjectList에 onItemClick prop 추가하고 프로젝트 상세로 이동하는 로직 구현 (또는 향후 TODO로 표시)

💡 개선 제안

5. 빈 상태(Empty State) 개선

src/components/common/CardView.tsx:24-26, ListView.tsx:32-34

if (items.length === 0) {
  return <div className="cardView__empty">{empty ?? 'No items'}</div>;
}
  • 기본 텍스트가 영어 "No items"로 되어있어 한국어 앱과 맞지 않습니다
  • className에 스타일이 적용되지 않아 보입니다 (Tailwind CSS 사용)

제안:

  • 기본 텍스트를 한국어로 변경 ('항목이 없습니다')
  • className에 Tailwind 유틸리티 클래스 추가 (예: 'text-center py-8 text-gray-500')

6. ProjectsSection - 조건부 렌더링 로직 개선

src/components/home/ProjectsSection.tsx:30-33

const hasProjects = projects.length > 0;

if (!isLoading && !hasProjects) return null;

빈 상태에서 아무것도 렌더링하지 않습니다. 사용자에게 "아직 프로젝트가 없습니다" 같은 메시지를 보여주는 것이 더 나은 UX입니다.

제안:

  • Empty state UI 추가 (파일 업로드를 유도하는 메시지 등)

7. FileDropzone - dragCounter 초기화 개선

src/components/common/FileDropzone.tsx:53

const handleDragLeave = (e: React.DragEvent<HTMLButtonElement>) => {
  // ...
  dragCounter.current = Math.max(0, dragCounter.current - 1);
  if (dragCounter.current === 0) setIsDragging(false);
};

Math.max(0, ...)를 사용했지만, dragCounter가 음수가 될 상황은 없어 보입니다. 코드가 명확하긴 하지만 불필요할 수 있습니다.

제안:

  • Math.max(0, ...)를 제거하거나, 주석으로 방어적 코딩임을 명시

8. ProjectHeader - 필터/정렬 기능 미구현

src/components/projects/ProjectHeader.tsx:12-14, 60, 86

// TODO
// - 필터, 정렬 기능 추가
//  ㄴ> onClick에 상태 업데이트 추가

필터와 정렬 버튼이 있지만 실제 기능은 구현되지 않았습니다 (onClick: () => {})

제안:

  • 현재 PR에서 구현 예정이 아니라면 TODO 주석을 GitHub Issue로 전환
  • 또는 버튼을 disabled 상태로 만들어서 아직 사용 불가능함을 UI로 표시

9. 접근성(a11y) 개선

src/components/projects/ProjectCard.tsx:29-34, ProjectList.tsx:30-34

카드와 리스트 항목이 클릭 가능해 보이지만 접근성이 부족합니다:

  • 카드에 클릭 이벤트 없음
  • 키보드 네비게이션 지원 부족

제안:

  • 카드/리스트를 <button> 또는 <Link>로 감싸기
  • ListView의 keyboard handler는 잘 구현되어 있으니 CardView에도 유사한 패턴 적용 고려

✅ 잘된 점

  1. 제네릭 컴포넌트 설계: CardView<T>ListView<T>가 제네릭으로 잘 설계되어 재사용성이 높습니다
  2. dragCounter 버그 수정: 드래그 호버 버그를 counter 패턴으로 정확하게 해결했습니다
  3. 디바운싱 구현: 검색에 300ms 디바운싱을 적용해 성능 최적화가 잘 되어있습니다
  4. ListView 키보드 네비게이션: ListView.tsx:48-59에서 Enter/Space 키 처리가 잘 구현되었습니다
  5. 스켈레톤 로딩: 카드뷰/리스트뷰 각각 적절한 스켈레톤을 보여줍니다
  6. 타입 정의: TypeScript 타입이 대체로 잘 정의되어 있습니다

📝 요약

전반적으로 코드 품질이 좋습니다. 위의 이슈들 중 Critical과 Medium 항목만 수정하면 merge 가능할 것 같습니다! 🚀


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

이 PR은 프로젝트 목록 기능을 추가하고 홈페이지 구조를 개선하는 등 많은 긍정적인 변경 사항을 포함하고 있습니다. 특히 CardViewListView를 공통 컴포넌트로 분리하여 재사용성을 높인 점과, 드래그 앤 드롭 기능의 버그를 수정한 점이 인상적입니다. 전반적으로 코드 품질을 높이기 위한 좋은 시도들이 보입니다. 몇 가지 사소한 개선점과 오타 수정에 대한 의견을 남겼으니 확인 부탁드립니다.

Comment on lines 65 to 72
<div className="mt-6 flex flex-col gap-3">
{Array.from({ length: SKELETON_LIST_COUNT }).map((_, index) => (
<div
key={index}
className="h-20 rounded-2xl border border-gray-200 bg-white p-4 animate-pulse"
/>
))}
</div>
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

리스트 뷰의 스켈레톤 UI가 컴포넌트 내에 인라인으로 구현되어 있습니다. ProjectCardSkeleton처럼 ProjectListSkeleton과 같은 별도의 컴포넌트로 분리하면 코드의 재사용성과 유지보수성이 향상될 것입니다.

@YeoEunnn

This comment was marked as resolved.

@AndyH0ng
Copy link
Member Author

AndyH0ng commented Jan 20, 2026

base를 -56으로 해서 <- compare #56 이렇게 해야 하나요..? ㅜ.ㅜ

@YeoEunnn 앗 넵네 그래주셔도 될 것 같아요!

Copy link
Member Author

@AndyH0ng AndyH0ng left a comment

Choose a reason for hiding this comment

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

아이고,, 수고하셧슴니다~

@github-actions
Copy link

github-actions bot commented Jan 23, 2026

Visit the preview URL for this PR (updated for commit 835d32e):

https://ttorang--pr64-feat-hom-add-func-56-ic3d73tz.web.app

(expires Fri, 30 Jan 2026 15:33:29 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: b554669f2531ae9a6954d553a841ad9a6c4ceb6d

@AndyH0ng AndyH0ng requested a review from YeoEunnn January 23, 2026 15:34
@AndyH0ng
Copy link
Member Author

제가 연겨라 approve가 안되네요..! approve해주고 머지해주세요!

@YeoEunnn YeoEunnn merged commit 0272a77 into develop Jan 23, 2026
10 checks passed
@YeoEunnn YeoEunnn deleted the feat/hom-add-func-56 branch January 23, 2026 15:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component 컴포넌트 관련 변경 page 페이지 관련 변경 types 타입 정의 변경

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 프로젝트 목록 기능 추가

2 participants