Skip to content

feat: 동아리 정보 등록 페이지 추가#322

Open
ParkSungju01 wants to merge 2 commits into
developfrom
317-feat-동아리-등록수정-페이지-추가

Hidden character warning

The head ref may contain hidden characters: "317-feat-\ub3d9\uc544\ub9ac-\ub4f1\ub85d\uc218\uc815-\ud398\uc774\uc9c0-\ucd94\uac00"
Open

feat: 동아리 정보 등록 페이지 추가#322
ParkSungju01 wants to merge 2 commits into
developfrom
317-feat-동아리-등록수정-페이지-추가

Conversation

@ParkSungju01
Copy link
Copy Markdown
Contributor

@ParkSungju01 ParkSungju01 commented May 26, 2026

✨ 요약

동아리 정보 등록 진입점 페이지 추가  연결



😎 해결한 이슈




image

Summary by CodeRabbit

릴리스 노트

  • New Features
    • 동아리 등록 기능을 추가했습니다.
    • 동아리 등록 페이지에서 "동아리 정보 수정", "신규 동아리 등록", "학교 동아리 목록 등록" 중 선택할 수 있는 UI를 제공합니다.
    • 헤더의 "동아리 등록하기" 버튼을 통해 동아리 등록 페이지로 이동할 수 있습니다.

Review Change Stack

@ParkSungju01 ParkSungju01 linked an issue May 26, 2026 that may be closed by this pull request
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 26, 2026

Warning

Review limit reached

@ParkSungju01, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 48 minutes and 42 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 6770d997-4448-43e3-bed9-3bffaa5db84c

📥 Commits

Reviewing files that changed from the base of the PR and between 43e2993 and 1bd93c7.

📒 Files selected for processing (2)
  • apps/web/src/App.tsx
  • apps/web/src/pages/RegisterClub/index.tsx

Walkthrough

이 PR은 동아리 등록 기능의 진입점을 구현합니다. /clubs/register 경로를 추가하고, Header의 "동아리 등록하기" 버튼을 이 경로로 연결한 후, 세 가지 등록 옵션(정보 수정, 신규 등록, 목록 등록)을 선택할 수 있는 RegisterClub 페이지 컴포넌트를 제공합니다.

Suggested labels

✨ Feature

Suggested reviewers

  • ff1451
🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Linked Issues check ❓ Inconclusive PR 변경사항이 이슈 #317의 목표인 동아리 등록/수정 페이지 진입점 구현을 충족하지만, 실제 등록/수정 기능의 완전한 구현은 미흡합니다. 등록/수정 기능 페이지가 아직 구현되지 않았다면 이슈 #317을 완전히 해결하지 못합니다. 전체 기능 완성도 확인이 필요합니다.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 풀 리퀘스트의 주요 변경사항(동아리 정보 등록 페이지 추가)을 명확하고 간결하게 설명합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항(RegisterClub 페이지 추가, 라우팅 설정, Header 네비게이션)이 진입점 페이지 구현이라는 범위 내에 있습니다.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ 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 317-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: 4

🧹 Nitpick comments (4)
apps/web/src/App.tsx (1)

7-7: ⚡ Quick win

내부 모듈 import에 path alias @/* 사용을 권장합니다.

상대 경로 대신 @/pages/RegisterClub을 사용하는 것이 프로젝트 컨벤션에 부합합니다. As per coding guidelines: "Use path alias @/* for internal app imports (preferred over relative paths)".

♻️ 제안하는 수정
-import RegisterClub from './pages/RegisterClub';
+import RegisterClub from '`@/pages/RegisterClub`';
🤖 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/App.tsx` at line 7, Change the internal import of the
RegisterClub component to use the project's path alias instead of a relative
path: replace the current import of RegisterClub in App.tsx with the alias form
(import RegisterClub from '`@/pages/RegisterClub`') so it follows the project's
convention for internal modules.
apps/web/src/pages/RegisterClub/index.tsx (3)

20-20: ⚡ Quick win

Design token 사용: 임의의 색상 값 대신 디자인 토큰을 사용하세요.

bg-[#ffffff] 대신 bg-white 또는 @konect/design-tokens의 적절한 토큰을 사용해야 합니다. As per coding guidelines: "Use CSS export from @konect/design-tokens for design tokens, prioritized over inline values".

♻️ 제안하는 수정
-        <div className="border-text-100 flex h-92.75 w-82.75 flex-col items-center gap-10 rounded-[20px] border bg-[`#ffffff`] px-7.5 py-10">
+        <div className="border-text-100 flex h-92.75 w-82.75 flex-col items-center gap-10 rounded-[20px] border bg-white px-7.5 py-10">

Also applies to: 30-30, 40-40

🤖 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/RegisterClub/index.tsx` at line 20, The component
currently uses a hard-coded hex background (bg-[`#ffffff`]) in the div's
className; replace that with the proper design token (e.g., bg-white or the CSS
class exported from `@konect/design-tokens`) and update the import/use accordingly
in RegisterClub (look for the div with className containing bg-[`#ffffff`] and the
two other similar instances flagged). Ensure you remove the inline hex values
and use the token-based CSS class from `@konect/design-tokens` consistently across
those elements.

9-9: ⚡ Quick win

시맨틱 타이포그래피 유틸리티 사용을 권장합니다.

text-[24px], text-[20px] 같은 일반 유틸리티 대신 text-h1, text-h2, text-body1 같은 시맨틱 유틸리티를 사용하는 것이 디자인 시스템 일관성에 더 좋습니다. As per coding guidelines: "Prioritize semantic typography utilities (e.g., text-h1, text-body1) over generic utilities".

Also applies to: 15-15, 23-23, 33-33, 43-43

🤖 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/RegisterClub/index.tsx` at line 9, The JSX uses raw size
utilities like "text-[24px]" in the RegisterClub component's button/header div
(className containing "text-[24px]") and at the other mentioned locations (lines
15, 23, 33, 43); replace those generic typography utilities with the
design-system semantic utilities (e.g., text-h1, text-h2, text-body1) to match
the coding guideline—locate each JSX element in RegisterClub that contains
text-[...] and swap to the appropriate semantic token while keeping other
classes (colors, spacing, rounding) intact.

20-49: ⚡ Quick win

코드 중복: 반복되는 카드 구조를 컴포넌트로 추출하는 것을 권장합니다.

세 개의 카드가 거의 동일한 구조로 중복되어 있습니다. 이미지, 제목, 설명, 대상을 props로 받는 재사용 가능한 컴포넌트로 추출하면 유지보수성이 향상됩니다.

♻️ 제안하는 리팩토링
interface OptionCardProps {
  image: string;
  imageAlt: string;
  title: string;
  description: string;
  target: string;
  onClick: () => void;
}

function OptionCard({ image, imageAlt, title, description, target, onClick }: OptionCardProps) {
  return (
    <button
      type="button"
      className="border-text-100 hover:border-primary-500 flex h-92.75 w-82.75 flex-col items-center gap-10 rounded-[20px] border bg-white px-7.5 py-10 transition-colors"
      onClick={onClick}
    >
      <img src={image} alt={imageAlt} />
      <div className="flex flex-col items-center">
        <h1 className="text-text-700 text-[24px] font-semibold">{title}</h1>
        <span className="text-text-600 mt-10 text-center text-[14px] leading-4">
          {description}
        </span>
        <span className="text-text-600 pt-5 text-[14px]">{target}</span>
      </div>
    </button>
  );
}
🤖 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/RegisterClub/index.tsx` around lines 20 - 49, The three
repeated card divs in RegisterClub should be extracted into a reusable
component; create an OptionCard component (props: image, imageAlt, title,
description, target, onClick) and replace each duplicated block with <OptionCard
... /> usages (pass EditClub/NewClub/Register for image and the corresponding
title/description/target and click handler), keeping the same classes and
behavior (e.g., convert the outer div to a button with the existing class string
and hover/transition styles) so markup and styling remain identical but
duplicated JSX is removed.
🤖 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/App.tsx`:
- Around line 19-20: Route order causes "/clubs/register" to match the dynamic
route "/clubs/:clubId" and render ClubDetail; move the specific Route with
path="/clubs/register" (element={<RegisterClub />}) so it appears before the
dynamic Route with path="/clubs/:clubId" (element={<ClubDetail />}) in App.tsx
to ensure RegisterClub is matched first.

In `@apps/web/src/pages/RegisterClub/index.tsx`:
- Line 21: The <img> elements (e.g., the JSX instance rendering EditClub in
RegisterClub component) lack alt attributes; update each <img> (including the
occurrences around lines 31 and 41) to include an appropriate alt string — use
an empty alt (alt="") if the image is purely decorative or a descriptive text if
it conveys information — so screen readers receive proper alternative text.
- Around line 20-49: The three option cards (the divs containing images
EditClub, NewClub, Register and headings "동아리 정보 수정", "신규 동아리 등록", "학교 동아리 목록
등록") are static and need click/navigation behavior; update each card to be
interactive by either wrapping the card in a Link/button or adding an onClick
handler that calls your router navigate function (e.g., react-router's navigate
or Next.js router) to go to the appropriate route (edit, new, bulk register),
ensure the element uses keyboard-accessible semantics (button or anchor) and add
pointer/cursor and hover styles so users know they are clickable.
- Line 9: There is a typo in the JSX className string in RegisterClub component:
replace the Tailwind class "itmes-center" with the correct "items-center" so the
flexbox vertical centering is applied; locate the div with className containing
"itmes-center bg-primary-100 border-primary-400 ..." and update that token to
"items-center".

---

Nitpick comments:
In `@apps/web/src/App.tsx`:
- Line 7: Change the internal import of the RegisterClub component to use the
project's path alias instead of a relative path: replace the current import of
RegisterClub in App.tsx with the alias form (import RegisterClub from
'`@/pages/RegisterClub`') so it follows the project's convention for internal
modules.

In `@apps/web/src/pages/RegisterClub/index.tsx`:
- Line 20: The component currently uses a hard-coded hex background
(bg-[`#ffffff`]) in the div's className; replace that with the proper design token
(e.g., bg-white or the CSS class exported from `@konect/design-tokens`) and update
the import/use accordingly in RegisterClub (look for the div with className
containing bg-[`#ffffff`] and the two other similar instances flagged). Ensure you
remove the inline hex values and use the token-based CSS class from
`@konect/design-tokens` consistently across those elements.
- Line 9: The JSX uses raw size utilities like "text-[24px]" in the RegisterClub
component's button/header div (className containing "text-[24px]") and at the
other mentioned locations (lines 15, 23, 33, 43); replace those generic
typography utilities with the design-system semantic utilities (e.g., text-h1,
text-h2, text-body1) to match the coding guideline—locate each JSX element in
RegisterClub that contains text-[...] and swap to the appropriate semantic token
while keeping other classes (colors, spacing, rounding) intact.
- Around line 20-49: The three repeated card divs in RegisterClub should be
extracted into a reusable component; create an OptionCard component (props:
image, imageAlt, title, description, target, onClick) and replace each
duplicated block with <OptionCard ... /> usages (pass EditClub/NewClub/Register
for image and the corresponding title/description/target and click handler),
keeping the same classes and behavior (e.g., convert the outer div to a button
with the existing class string and hover/transition styles) so markup and
styling remain identical but duplicated JSX is removed.
🪄 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: 02d97a35-51cd-4444-be8c-529238d39f3e

📥 Commits

Reviewing files that changed from the base of the PR and between b0fd664 and 43e2993.

⛔ Files ignored due to path filters (4)
  • apps/web/src/assets/edit-club-detail.png is excluded by !**/*.png, !apps/*/src/assets/** and included by **
  • apps/web/src/assets/ellipse.svg is excluded by !**/*.svg, !apps/*/src/assets/** and included by **
  • apps/web/src/assets/new-club.png is excluded by !**/*.png, !apps/*/src/assets/** and included by **
  • apps/web/src/assets/register-club.png is excluded by !**/*.png, !apps/*/src/assets/** and included by **
📒 Files selected for processing (3)
  • apps/web/src/App.tsx
  • apps/web/src/layout/Header/index.tsx
  • apps/web/src/pages/RegisterClub/index.tsx

Comment thread apps/web/src/App.tsx Outdated
Comment thread apps/web/src/pages/RegisterClub/index.tsx Outdated
Comment on lines +20 to +49
<div className="border-text-100 flex h-92.75 w-82.75 flex-col items-center gap-10 rounded-[20px] border bg-[#ffffff] px-7.5 py-10">
<img src={EditClub} />
<div className="flex flex-col items-center">
<h1 className="text-text-700 text-[24px] font-semibold">동아리 정보 수정</h1>
<span className="text-text-600 mt-10 w-65 text-center text-[14px] leading-4">
이미 KONECT에 등록된 동아리의 소개, 사진, 상세정보를 추가하거나 수정할 수 있어요
</span>
<span className="text-text-600 pt-5 text-[14px]">대상 : 동아리 회장, 임원진</span>
</div>
</div>
<div className="border-text-100 flex h-92.75 w-82.75 flex-col items-center gap-10 rounded-[20px] border bg-[#ffffff] px-7.5 py-10">
<img src={NewClub} />
<div className="flex flex-col items-center">
<h1 className="text-text-700 text-[24px] font-semibold">신규 동아리 등록</h1>
<span className="text-text-600 mt-10 w-60 text-center text-[14px] leading-4">
아직 KONECT에 등록되지 않은 동아리의 기본 정보와 소개 정보를 제출할 수 있어요.
</span>
<span className="text-text-600 pt-5 text-[14px]">대상 : 미등록된 동아리의 관계자</span>
</div>
</div>
<div className="border-text-100 flex h-92.75 w-82.75 flex-col items-center gap-10 rounded-[20px] border bg-[#ffffff] px-7.5 py-10">
<img src={Register} />
<div className="flex flex-col items-center">
<h1 className="text-text-700 text-[24px] font-semibold">학교 동아리 목록 등록</h1>
<span className="text-text-600 mt-10 w-69.5 text-center text-[14px] leading-4">
총동 / 학생회 담당자가 학교 단위의 동아리 목록과 기본 정보를 한 번에 전달할 수 있어요.
</span>
<span className="text-text-600 pt-5 text-[14px]">대상 : 총동아리 연합회 / 학생회 담당자</span>
</div>
</div>
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 | 🏗️ Heavy lift

카드에 상호작용 기능이 없습니다.

사용자가 선택할 수 있는 옵션으로 제시되었지만, 클릭 핸들러나 네비게이션이 구현되지 않아 실제로 선택할 수 없습니다. 각 카드에 onClick 핸들러를 추가하거나 링크로 감싸서 다음 단계로 이동할 수 있도록 해야 합니다.

예시: 버튼으로 감싸기
<button
  type="button"
  className="border-text-100 hover:border-primary-500 flex h-92.75 w-82.75 flex-col items-center gap-10 rounded-[20px] border bg-white px-7.5 py-10 transition-colors"
  onClick={() => navigate('/clubs/edit')}
>
  {/* 카드 내용 */}
</button>
🤖 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/RegisterClub/index.tsx` around lines 20 - 49, The three
option cards (the divs containing images EditClub, NewClub, Register and
headings "동아리 정보 수정", "신규 동아리 등록", "학교 동아리 목록 등록") are static and need
click/navigation behavior; update each card to be interactive by either wrapping
the card in a Link/button or adding an onClick handler that calls your router
navigate function (e.g., react-router's navigate or Next.js router) to go to the
appropriate route (edit, new, bulk register), ensure the element uses
keyboard-accessible semantics (button or anchor) and add pointer/cursor and
hover styles so users know they are clickable.

Comment thread apps/web/src/pages/RegisterClub/index.tsx Outdated
@ParkSungju01 ParkSungju01 requested a review from ff1451 May 26, 2026 14:01
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] 동아리 등록/수정 페이지 추가

1 participant