Skip to content

[feat] 웹 홈 및 대학별 동아리 탐색 개선#324

Open
ff1451 wants to merge 19 commits into
developfrom
323-feat-웹-홈-및-대학별-동아리-탐색-개선

Hidden character warning

The head ref may contain hidden characters: "323-feat-\uc6f9-\ud648-\ubc0f-\ub300\ud559\ubcc4-\ub3d9\uc544\ub9ac-\ud0d0\uc0c9-\uac1c\uc120"
Open

[feat] 웹 홈 및 대학별 동아리 탐색 개선#324
ff1451 wants to merge 19 commits into
developfrom
323-feat-웹-홈-및-대학별-동아리-탐색-개선

Conversation

@ff1451
Copy link
Copy Markdown
Collaborator

@ff1451 ff1451 commented May 27, 2026

✨ 요약

-  최근  동아리 섹션 노출 조건과 지역 필터 URL 동기화를 개선했습니다.
- 대학별 동아리 목록의 브레드크럼/스크롤 초기화와 university.clubCount 표시를 반영했습니다.
-  헤더와 동아리 사이드바 여백을 조정했습니다.



😎 해결한 이슈



Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 페이지 진입 시 스크롤 위치 초기화로 향상된 네비게이션 경험 제공
    • 최근 본 동아리 섹션의 조건부 표시 개선
  • 스타일

    • 사이드바 및 헤더의 패딩/여백 조정으로 레이아웃 최적화
    • 카테고리 필터 인터페이스 재설계로 가로 스크롤 가능하게 개선
    • URL 기반 지역 선택 처리로 필터 관리 개선

Review Change Stack

ff1451 and others added 19 commits April 1, 2026 23:01
* 205 feat 이미지 전처리 기능 구현 (#206)

* feat: 전처리 로직 및 WebWorker 구현

* feat: 전처리 적용 및 preview 동시성 제어 로직 추가

* refactor: 리뷰 반영

* [hotfix] 하단바 너비 수정 (#208)

* hotfix: 하단바 너비 수정

* chore: 불필요한 값 제거

* refactor: 고정 gap 제거

* Reapply "[feat] 광고 배너 추가 (#200)"

This reverts commit c51ec85.

* [feat] 하단바 리디자인 (#213)

* chore: asset 추가

* feat: 하단바 리디자인 반영 및 레이아웃 수정

* [refactor] 광고 카드 레이아웃 밀림 수정 (#215)

* refactor: 광고 개수 측정 시기 변경 및 기본값 제거

* feat: 스켈레톤 UI 추가

* feat: 인앱 알림 페이지 및 토스트 구현 (#217)

* feat: 알림 API 및 스트림 기반 추가

* feat: 인앱 알림 레이어 추가

* feat: 알림 페이지 및 헤더 진입 구현

* fix: 알림 스트림 401 재시도 조건 정리

* fix: 알림 목록 이동 차단 제거

* refactor: 알림 공용 훅 위치 정리

* fix: 알림 재연결 캐시 동기화 추가

* fix: 알림 목록 토스트 큐 누적 방지

* fix: 알림 읽음 카운트 감소 조건 보강

* [refactor] 도메인별 TanStack Query 훅 정리 (#219)

* chore: pwa용 이미지 제거

* refactor: auth 도메인 쿼리와 뮤테이션 정리

* refactor: council과 schedule 조회 훅 정리

* refactor: chat과 notification 캐시 처리 정리

* refactor: club 조회와 지원 플로우 정리

* refactor: manager 도메인 캐시 처리 정리

* refactor: studyTime 도메인 쿼리와 뮤테이션 정리

* refactor: 광고와 업로드 도메인 훅 정리

* [refactor] mutaton query 및 hook 추가 수정 (#221)

* refactor: auth와 user myInfo 훅 정리

* refactor: club과 schedule 조회 훅 정리

* refactor: chat과 notification 훅 구조 정리

* refactor: club 지원 뮤테이션 훅 정리

* refactor: manager 뮤테이션 훅 구조 정리

* refactor: mutation 훅 cache 정리

* refactor: 컨벤션 통일

* refactor: isRead 조건 정리

* fix: 채팅 스크롤 문제 수정

* refactor: 불필요한 코드 제거

* [fix] 모바일 환경 입력창과 키보드 간의 간격이 큰 문제 수정 (#223)

* chore: 가공용 safeArea 변수 선언

* refactor: 고정 패딩 값 수정 및 safeArea 적용 변경

* feat: 키보드 활성화 감지 및 safeArea 적용 여부 기능 추가

* refactor: 매직넘버 상수화 및 가로모드 처리

* [fix] 키보드 활성화 시 화면 흔들림 문제 수정 (#225)

* refactor: 채팅 viewport 훅 네이밍 정리

* refactor: viewport 높이 잠금 훅 적용 시점 조정

* [fix] 키보드 활성화 시 채팅 화면 전체가 흔들리는 문제 수정 (#227)

* refactor: 채팅 viewport 훅 네이밍 정리

* refactor: viewport 높이 잠금 훅 적용 시점 조정

* fix: 채팅 화면 스크롤 잠금으로 키보드 흔들림 완화

* fix: 입력 포커스 중 viewport offset 고정 (#229)

* fix: 문서 루트 스크롤 잠금으로 빈 공간 잔류 방지 (#232)

* [fix] 키보드 활성화 시 채팅 화면 상단 고정이 깨지고 빈 공간이 남는 문제 수정 (#234)

* fix: 채팅 화면 상단 고정 깨짐과 빈 공간 잔류 수정

* refactor: 라우트 조건 수정

* fix: 문서 스크롤 위치 감지 보강

* refactor: 입력 요소 판별 유틸과 스크롤 주석 정리

* [fix] 키보드 활성화 시 채팅 화면에서 문서 스크롤이 발생하는 문제 수정 (#236)

* fix: 채팅 문서 스크롤 제스처 차단

* fix: 입력 요소 터치 동작 예외 처리

* [fix] 키보드 활성화 시 채팅방이 마지막 메시지 위치를 유지하지 못하는 문제 수정 (#238)

* fix: 키보드 활성화 시 채팅 하단 정렬 유지

* refactor: 채팅 리사이즈 관찰 안정화

* fix: mypage 연계 약관 페이지 뒤로가기 수정 (#240)

* refactor: alias import 경로 정리

* fix: query 설정과 suspense 분기 정리

* refactor: 관리자 화면 스타일 유틸 정리

* fix: 이미지 전처리 예외 처리 보강

* fix: 헤더와 회비 화면 동작 정리

* fix: 공통 유틸 안정성 개선

* fix: 이미지 전처리 실패 처리를 보정

* fix: 모집 공고 저장 후 설정 반영 순서 조정

* fix: 부원 직책 변경 실패 처리를 보강

* fix: 약관 링크 접근성을 개선

* fix: 공통 쿼리와 유틸 안정성을 보완

* [feat] 동적 버전 정보 표시 구현 (#211)

* feat: 동적 버전 정보 표시 구현

* refactor: 버전 정보 미 존재시 v 표시 제거

* [feat] 메인화면 동아리 카드 디자인 수정 반영 (#242)

* feat: 메인화면 동아리 카드 디자인 수정

* chore: 하단바 아이콘 수정

* refactor: 코드래빗 리뷰 반영

* refactor: and 연산자로 변경

* apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화 (#244)

* refactor: apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화

* refactor: body 직렬화 가드를 plain object/array로 한정

* fix: body 읽기 중 AbortError가 ParseError로 오분류되는 문제 수정

* [refactor] 에러 처리 유틸 및 utils 구조 정리 (#246)

* refactor: 에러 처리 유틸 및 공통 토스트 흐름 정리

* refactor: utils 폴더 구조를 역할별로 정리

* refactor: 코드래빗 리뷰 반영

* refactor: 코드래빗 리뷰 반영

* Update src/pages/Home/components/HomeClubSection.tsx

* fix: 인증 세션 복구 흐름 정리

* fix: 홈 동아리 카드 레이아웃 정리

* [feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리 (#249)

* refactor: 하단 오버레이 처리 공통화

* feat: 총동아리 페이지와 헤더 리디자인 반영

* fix: 채팅 하단 여백과 외부 링크 속성 수정

* refactor: 총동아리 헤더 설정 정리

* fix: 총동아리 상세 접근성과 스타일 보완

* [feat] 마이페이지 관리자 카드 분리 및 채팅 미확인 배지 반영 (#251)

* feat: 하단 채팅 배지 표시 및 조회 조건 보완

* refactor: 관리자 정보 카드 컴포넌트 분리

* feat: 채팅 페이지 리디자인 (#252)

* feat: 채팅 페이지 리디자인

* fix:tailwind 문법 수정

* fix: 코드 수정

* fix: 폰트 색상 및 위치 수정

* fix: 채팅방 사람수 정렬

* fix: 오타 수정

* chore: conflict 해결 중 누락된 부분 수정

* [refactor] 광고 렌더링 조건 수정 (#254)

* refactor: 광고 렌더링 조건 수정

* docs: 문서명 변경

---------

Co-authored-by: 박성주 <145267904+ParkSungju01@users.noreply.github.com>
@ff1451 ff1451 added the ✨ Feature 기능 개발 label May 27, 2026
@ff1451 ff1451 self-assigned this May 27, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 27, 2026

Walkthrough

PR #324는 홈 페이지와 대학별 동아리 탐색 흐름을 개선합니다. UniversitySummary 타입에 clubCount 필드를 추가하여 응답 모델을 확장하고, 중복되는 ClubDetailUniversitySummary를 제거합니다. useResetScroll 훅을 새로 도입하여 페이지 진입 시 스크롤을 초기화하고, RecentClubListByIds 컴포넌트를 추가하여 최근 본 동아리 렌더링을 분리합니다. 홈 페이지는 URL 파라미터(region, section) 기반으로 selectedRegion을 파생시키고, handleRegionChange로 지역 선택 시 URL을 동기화하며, 스크롤 이펙트를 추가합니다. UniversityClubList에서는 university.clubCount 필드를 활용하도록 변경하고, getHomeUniversitySectionPath 유틸로 breadcrumb 홈 링크를 생성합니다. 마지막으로 헤더와 사이드바의 여백을 조정합니다.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 홈 및 대학별 동아리 탐색 개선이라는 핵심 변경사항을 명확하게 반영하고 있습니다.
Linked Issues check ✅ Passed 모든 링크된 이슈 #323의 요구사항이 코드 변경으로 충족됩니다: URL 동기화, 스크롤 초기화, clubCount 반영, 여백 조정, 최근본동아리 노출조건 개선.
Out of Scope Changes check ✅ Passed UniversitySummary에 clubCount 추가, RecentClubListByIds 분리, useResetScroll 훅 추가 등 모든 변경사항이 이슈 #323의 목표범위 내입니다.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 323-feat-웹-홈-및-대학별-동아리-탐색-개선

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
Copy Markdown
Contributor

@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

🧹 Nitpick comments (2)
apps/web/src/pages/UniversityClubList/index.tsx (1)

140-140: ⚡ Quick win

타이포그래피는 semantic utility로 맞춰주세요.

text-[16px] 대신 프로젝트의 semantic typography 유틸(text-body1 등)로 맞추는 게 일관성에 좋습니다.

As per coding guidelines, "Prioritize semantic typography utilities (e.g., text-h1, text-body1) over generic utilities".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/UniversityClubList/index.tsx` at line 140, Replace the
atomic font-size utility on the paragraph in UniversityClubList (the <p> with
className containing "text-text-400 text-[16px] leading-7") with the project's
semantic typography utility (e.g., swap "text-[16px]" for "text-body1"); also
verify whether "leading-7" is redundant with the chosen semantic utility and
remove or adjust it so the final className uses the semantic typography token
plus color/weight utilities only.
apps/web/src/pages/Home/index.tsx (1)

1-4: ⚡ Quick win

동적 Tailwind 클래스는 cn()으로 통일하고 import 순서를 정렬해주세요.

현재 템플릿 문자열 기반 병합이 섞여 있어 클래스 충돌 처리/일관성이 떨어집니다. @konect/utils/cn으로 통일하고 external import를 알파벳 순으로 맞춰주세요.

제안 diff
-import { useEffect, useRef, useState, type ChangeEvent } from 'react';
-import { useDebouncedCallback } from '`@konect/utils/use-debounced-callback`';
+import { cn } from '`@konect/utils/cn`';
+import { useDebouncedCallback } from '`@konect/utils/use-debounced-callback`';
 import { useSuspenseQuery } from '`@tanstack/react-query`';
+import { useEffect, useRef, useState, type ChangeEvent } from 'react';
 import { Link, useSearchParams } from 'react-router-dom';
@@
-          <div
-            className={`grid w-full transition-[grid-template-rows,opacity,margin-top] duration-300 ease-out ${
-              isSearching ? 'mt-0 grid-rows-[0fr] opacity-0' : 'mt-10 grid-rows-[1fr] opacity-100 sm:mt-24'
-            }`}
-          >
+          <div
+            className={cn(
+              'grid w-full transition-[grid-template-rows,opacity,margin-top] duration-300 ease-out',
+              isSearching ? 'mt-0 grid-rows-[0fr] opacity-0' : 'mt-10 grid-rows-[1fr] opacity-100 sm:mt-24'
+            )}
+          >
@@
-            <section
-              className={`min-h-0 ${isSearching ? 'overflow-hidden' : 'overflow-visible'}`}
-              aria-hidden={isSearching}
-            >
+            <section className={cn('min-h-0', isSearching ? 'overflow-hidden' : 'overflow-visible')} aria-hidden={isSearching}>
@@
-                    className={`shrink-0 rounded-[26px] border px-3 font-medium transition-colors sm:px-5 ${
-                      isSelected
-                        ? 'border-primary-900 bg-primary-900 text-indigo-5'
-                        : 'border-text-300 text-text-300 hover:border-primary-500 hover:text-primary-700 bg-transparent'
-                    }`}
+                    className={cn(
+                      'shrink-0 rounded-[26px] border px-3 font-medium transition-colors sm:px-5',
+                      isSelected
+                        ? 'border-primary-900 bg-primary-900 text-indigo-5'
+                        : 'border-text-300 bg-transparent text-text-300 hover:border-primary-500 hover:text-primary-700'
+                    )}

As per coding guidelines "Use @konect/utils/cn utility for Tailwind class merging with clsx + tailwind-merge" and "Organize imports in order: builtin -> external -> internal (@/**) -> parent -> sibling -> index, sorted alphabetically within each group".

Also applies to: 124-126, 129-129, 151-155

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/Home/index.tsx` around lines 1 - 4, Replace
template-string or manual concatenation Tailwind class merging with the shared
cn utility from `@konect/utils/cn`: update imports to add cn and refactor all
className usages that currently use template literals or manual joins (search
for uses near identifiers like useDebouncedCallback, useSuspenseQuery and
components in this file) to call cn(...) so tailwind-merge + clsx semantics are
applied (also fix occurrences mentioned in the comment). Additionally reorder
the import block to follow the project order (builtin -> external -> internal ->
parent -> sibling -> index) and sort external imports alphabetically so imports
such as useDebouncedCallback, useSuspenseQuery, Link, useSearchParams and the
new cn import are in the correct alphabetical order within the external group.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/pages/Home/index.tsx`:
- Around line 122-131: The section controlled by hasRecentClubs/isSearching
currently only uses aria-hidden, which doesn't stop keyboard focus; update the
Home/index.tsx JSX so that when isSearching is true the section is either
unmounted (render it only when !isSearching) or marked inert in addition to
aria-hidden (add the inert attribute to the section element when isSearching and
ensure an inert/polyfill is included if needed), so keyboard focus cannot enter
its internal links; target the JSX block using hasRecentClubs and the section
element around the isSearching conditional to make this change.

---

Nitpick comments:
In `@apps/web/src/pages/Home/index.tsx`:
- Around line 1-4: Replace template-string or manual concatenation Tailwind
class merging with the shared cn utility from `@konect/utils/cn`: update imports
to add cn and refactor all className usages that currently use template literals
or manual joins (search for uses near identifiers like useDebouncedCallback,
useSuspenseQuery and components in this file) to call cn(...) so tailwind-merge
+ clsx semantics are applied (also fix occurrences mentioned in the comment).
Additionally reorder the import block to follow the project order (builtin ->
external -> internal -> parent -> sibling -> index) and sort external imports
alphabetically so imports such as useDebouncedCallback, useSuspenseQuery, Link,
useSearchParams and the new cn import are in the correct alphabetical order
within the external group.

In `@apps/web/src/pages/UniversityClubList/index.tsx`:
- Line 140: Replace the atomic font-size utility on the paragraph in
UniversityClubList (the <p> with className containing "text-text-400 text-[16px]
leading-7") with the project's semantic typography utility (e.g., swap
"text-[16px]" for "text-body1"); also verify whether "leading-7" is redundant
with the chosen semantic utility and remove or adjust it so the final className
uses the semantic typography token plus color/weight utilities only.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 38fe725c-687d-4ce7-8532-e255f17a0f7c

📥 Commits

Reviewing files that changed from the base of the PR and between b0fd664 and 47347c2.

📒 Files selected for processing (9)
  • apps/web/src/apis/clubDetail/entity.ts
  • apps/web/src/apis/universityClub/entity.ts
  • apps/web/src/components/RecentClubList/index.tsx
  • apps/web/src/components/UniversityClubSidebar/index.tsx
  • apps/web/src/layout/Header/index.tsx
  • apps/web/src/pages/ClubDetail/index.tsx
  • apps/web/src/pages/Home/index.tsx
  • apps/web/src/pages/UniversityClubList/index.tsx
  • apps/web/src/utils/hooks/useResetScroll.ts

Comment on lines +122 to +131
{hasRecentClubs ? (
<div
className={`grid w-full transition-[grid-template-rows,opacity,margin-top] duration-300 ease-out ${
isSearching ? 'mt-0 grid-rows-[0fr] opacity-0' : 'mt-10 grid-rows-[1fr] opacity-100 sm:mt-24'
}`}
>
<section
className={`min-h-0 ${isSearching ? 'overflow-hidden' : 'overflow-visible'}`}
aria-hidden={isSearching}
>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

aria-hidden만으로는 숨김 상태 포커스가 차단되지 않습니다.

Line 130에서 aria-hidden만 적용하면 내부 링크가 키보드 포커스로 진입할 수 있습니다. 검색 중(isSearching)에는 섹션을 언마운트하거나 inert를 함께 적용해 포커스를 막아주세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/Home/index.tsx` around lines 122 - 131, The section
controlled by hasRecentClubs/isSearching currently only uses aria-hidden, which
doesn't stop keyboard focus; update the Home/index.tsx JSX so that when
isSearching is true the section is either unmounted (render it only when
!isSearching) or marked inert in addition to aria-hidden (add the inert
attribute to the section element when isSearching and ensure an inert/polyfill
is included if needed), so keyboard focus cannot enter its internal links;
target the JSX block using hasRecentClubs and the section element around the
isSearching conditional to make this change.

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

Labels

✨ Feature 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 웹 홈 및 대학별 동아리 탐색 개선

1 participant