Skip to content

Comments

[release] v1.0.3#405

Merged
seongwon030 merged 51 commits intomainfrom
develop-fe
May 15, 2025
Merged

[release] v1.0.3#405
seongwon030 merged 51 commits intomainfrom
develop-fe

Conversation

@seongwon030
Copy link
Member

@seongwon030 seongwon030 commented May 14, 2025

#️⃣연관된 이슈

ex) #이슈번호, #이슈번호

📝작업 내용

이번 PR에서 작업한 내용을 간략히 설명해주세요(이미지/동영상 첨부 가능)

중점적으로 리뷰받고 싶은 부분(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?

논의하고 싶은 부분(선택)

논의하고 싶은 부분이 있다면 작성해주세요.

🫡 참고사항

Summary by CodeRabbit

  • 신규 기능

    • 클럽 정보 수정 페이지에서 인스타그램, 유튜브, X(트위터) 소셜 미디어 링크 입력 및 검증 기능이 추가되었습니다.
    • 입력 필드에 에러 표시 및 안내 메시지가 제공됩니다.
    • 클럽 상세 정보에 소셜 미디어 링크 아이콘이 표시됩니다.
    • Sentry 기반 오류 추적 및 성능 모니터링이 도입되었습니다.
  • 버그 수정

    • 배너 슬라이드 애니메이션이 컴포넌트 초기화 전에는 동작하지 않도록 개선되었습니다.
  • 스타일

    • 입력 필드 및 안내 문구, SNS 입력 영역의 스타일이 추가 및 개선되었습니다.
    • 클럽 상세 페이지 SNS 링크 아이콘 스타일이 추가되었습니다.
  • 테스트

    • 소셜 미디어 링크 검증 로직에 대한 테스트가 추가되었습니다.
  • 기타

    • 내부 컴포넌트 import 경로 및 코드 포맷이 일부 정리되었습니다.
    • .gitignore에 Sentry 관련 파일이 추가되었습니다.

seongwon030 and others added 27 commits May 7, 2025 10:57
- ClubCard와 ClubProfile 컴포넌트에서 빈 태그 필터링 로직 추가
- tag.trim()을 사용하여 빈 문자열 및 공백만 있는 태그 제거
- 각 태그에 고유한 key 값 부여 (division, category, tag 구분)
- 모바일 환경에서 배너가 왼쪽으로 치우치는 문제 수정
- 초기 렌더링 시 slideWidth 계산 전 transform 적용 방지
- isReady 상태 추가로 초기화 완료 후 슬라이드 시작
- 리사이즈 시 상태 초기화 로직 개선
- useRef를 사용하여 중복 추적 방지 및 시작 시간 관리
- 컴포넌트 언마운트 시 체류시간 추적 추가
- 페이지 방문 이벤트 메시지 포맷 통일
…ender-FE-106

[fix] 모바일 환경에서 배너 슬라이더 초기 렌더링 문제 해결
- InputField 컴포넌트에 isError 및 helperText prop 추가
- 에러 시 시각적 피드백 및 하단 에러 메시지 표시
- SnsConfig 기반 반복 렌더링으로 SNS 입력 필드 추가
- socialLinks 및 snsErrors 상태 관리 로직 적용
- validateSocialLink로 입력값 유효성 검증
- SNS 링크를 updateClub 요청에 포함
…rguments-FE-112

[feature] 동아리명은 믹스패널에 arguments로 전달
…t-FE-111

[feature] 관리자 페이지 동아리 SNS 링크 등록 기능 추가
[feature] 사용자 에러 추적을 위한 Sentry 적용
@seongwon030 seongwon030 requested a review from oesnuj May 14, 2025 09:30
@seongwon030 seongwon030 self-assigned this May 14, 2025
@seongwon030 seongwon030 added the 💻 FE Frontend label May 14, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented May 14, 2025

"""

Walkthrough

이 변경사항은 Sentry 통합, SNS 링크 입력 및 검증 기능 추가, 입력 필드의 에러 처리 개선, 페이지 뷰 트래킹 개선, 배너 슬라이드 애니메이션 초기화 로직 개선 등을 포함합니다. 또한 관련 상수, 타입, 스타일, 유틸리티 함수 및 테스트 코드가 추가·수정되었습니다.

Changes

파일/경로 그룹 변경 요약
frontend/.gitignore, frontend/package.json, frontend/src/index.tsx Sentry 통합을 위해 Sentry 관련 환경설정 파일을 .gitignore에 추가하고, Sentry 패키지 의존성 및 초기화 코드 추가
frontend/src/components/common/InputField/InputField.styles.ts, frontend/src/components/common/InputField/InputField.tsx 입력 필드에 에러 상태 시 스타일 변경 및 헬퍼 텍스트 표시 기능 추가, 관련 props 및 styled component 확장
frontend/src/constants/snsConfig.ts, frontend/src/types/club.ts SNS 플랫폼별 설정 상수(SNS_CONFIG) 및 ClubDetail 타입에 SNS 링크 속성 추가, SNSPlatform 타입 정의
frontend/src/utils/validateSocialLink.ts, frontend/src/utils/validateSocialLink.test.ts SNS 링크 유효성 검사 함수 및 해당 테스트 코드 추가
frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx, frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.styles.ts 동아리 SNS 링크 입력 및 검증 기능 추가, 관련 상태 및 검증 로직, 스타일 컴포넌트 추가
frontend/src/hooks/useTrackPageView.ts, frontend/src/pages/ClubDetailPage/ClubDetailPage.tsx 페이지 뷰 트래킹 훅에 clubName 파라미터 추가, 호출부 수정으로 트래킹 이벤트에 클럽명 포함
frontend/src/pages/MainPage/components/Banner/Banner.tsx 배너 슬라이드 애니메이션이 슬라이드 폭 측정 후에만 동작하도록 isReady 상태 및 관련 초기화 로직 추가
frontend/src/pages/AdminPage/tabs/PhotoEditTab/PhotoEditTab.tsx, frontend/src/pages/AdminPage/tabs/PhotoEditTab/components/ImageUpload/ImageUpload.tsx 이미지 업로드/미리보기 컴포넌트 import 경로 변경 및 코드 포맷팅 개선(로직 변경 없음)
frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx 캘린더, 마크다운 에디터 컴포넌트 import 경로 변경(로직 변경 없음)
frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/components/SelectTags/SelectTags.tsx JSX 문법 오류 수정(닫는 꺾쇠 추가)
frontend/src/pages/ClubDetailPage/components/ClubProfile/ClubProfile.tsx, frontend/src/pages/MainPage/components/ClubCard/ClubCard.tsx 클럽 태그 렌더링 시 빈 문자열 필터링 및 고유 키 부여 개선
frontend/src/components/common/Button/Button.tsx Button 컴포넌트의 onClick 핸들러 선택적 변경 및 type 속성 추가
frontend/src/pages/AdminPage/auth/LoginTab/LoginTab.styles.ts, frontend/src/pages/AdminPage/auth/LoginTab/LoginTab.tsx 로그인 폼을 form 태그로 감싸고 onSubmit 핸들러 추가, 버튼 타입 변경 및 마크업 정리
frontend/src/pages/ClubDetailPage/components/InfoBox/InfoBox.tsx, frontend/src/pages/ClubDetailPage/components/InfoBox/InfoBox.styles.ts InfoBox 컴포넌트가 React 노드 렌더링 지원하도록 변경 및 SNS 링크 아이콘 영역 추가, 스타일 일부 조정
frontend/src/pages/ClubDetailPage/components/SnsLinkIcons/SnsLinkIcons.tsx, frontend/src/pages/ClubDetailPage/components/SnsLinkIcons/SnsLinkIcons.styles.ts SNS 링크 아이콘 렌더링 컴포넌트 및 스타일 추가

Sequence Diagram(s)

sequenceDiagram
  participant Admin as AdminPage(ClubInfoEditTab)
  participant User as User
  participant Input as InputField
  participant Util as validateSocialLink
  participant API as UpdateClub API

  User->>Input: SNS 링크 입력
  Input->>Admin: onChange 이벤트
  Admin->>Util: validateSocialLink(플랫폼, 값)
  Util-->>Admin: 에러 메시지 or ""
  Admin->>Input: isError, helperText prop 전달
  User->>Admin: 저장 버튼 클릭
  Admin->>Util: 모든 SNS 링크 재검증
  Admin->>API: 유효하면 업데이트 요청
Loading

Possibly related PRs

  • Moadong/moadong#381: Banner 컴포넌트에 isReady 상태를 도입하여 슬라이드 애니메이션 초기화 시점 제어
  • Moadong/moadong#400: SNS 링크 입력 및 검증, 관련 컴포넌트/유틸리티/타입/스타일 추가 등 직접적으로 관련된 기능 구현
  • Moadong/moadong#404: Sentry 연동을 위한 .gitignore, 패키지, 초기화 코드 추가 등 직접적으로 관련된 변경

Suggested labels

✨ Feature, 🛠Fix

Suggested reviewers

  • oesnuj
    """

Note

⚡️ AI Code Reviews for VS Code, Cursor, Windsurf

CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
Learn more here.


Note

⚡️ Faster reviews with caching

CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure Review - Disable Cache at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the Data Retention setting under your Organization Settings.
Enjoy the performance boost—your workflow just got faster.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c914817 and 0cff80b.

⛔ Files ignored due to path filters (3)
  • frontend/src/assets/images/icons/sns/instagram_icon.png is excluded by !**/*.png
  • frontend/src/assets/images/icons/sns/x_icon.svg is excluded by !**/*.svg
  • frontend/src/assets/images/icons/sns/youtube_icon.svg is excluded by !**/*.svg
📒 Files selected for processing (8)
  • frontend/src/components/common/Button/Button.tsx (2 hunks)
  • frontend/src/constants/snsConfig.ts (1 hunks)
  • frontend/src/pages/AdminPage/auth/LoginTab/LoginTab.styles.ts (1 hunks)
  • frontend/src/pages/AdminPage/auth/LoginTab/LoginTab.tsx (4 hunks)
  • frontend/src/pages/ClubDetailPage/components/InfoBox/InfoBox.styles.ts (2 hunks)
  • frontend/src/pages/ClubDetailPage/components/InfoBox/InfoBox.tsx (3 hunks)
  • frontend/src/pages/ClubDetailPage/components/SnsLinkIcons/SnsLinkIcons.styles.ts (1 hunks)
  • frontend/src/pages/ClubDetailPage/components/SnsLinkIcons/SnsLinkIcons.tsx (1 hunks)
✅ Files skipped from review due to trivial changes (4)
  • frontend/src/pages/AdminPage/auth/LoginTab/LoginTab.styles.ts
  • frontend/src/pages/ClubDetailPage/components/SnsLinkIcons/SnsLinkIcons.tsx
  • frontend/src/pages/ClubDetailPage/components/InfoBox/InfoBox.styles.ts
  • frontend/src/pages/ClubDetailPage/components/SnsLinkIcons/SnsLinkIcons.styles.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/constants/snsConfig.ts
🔇 Additional comments (8)
frontend/src/components/common/Button/Button.tsx (2)

7-8: 타입 및 이벤트 핸들러 개선사항이 적용되었습니다.

ButtonProps 인터페이스에 type 속성이 추가되고 onClick 핸들러가 선택적으로 변경되었습니다. 이러한 변경은 재사용성을 높이고 다양한 상황에서 버튼 컴포넌트를 더 유연하게 사용할 수 있게 합니다.


48-51: 타입 속성이 올바르게 구현되었습니다.

Button 컴포넌트에 type 매개변수가 추가되고 해당 속성이 StyledButton에 올바르게 전달되었습니다. 이는 HTML 폼에서 버튼 타입(submit, button, reset 등)을 지정할 수 있게 해주는 중요한 기능입니다.

frontend/src/pages/AdminPage/auth/LoginTab/LoginTab.tsx (2)

52-80: 폼 요소 및 접근성 개선이 구현되었습니다.

로그인 폼을 <form> 요소로 감싸고 onSubmit 핸들러를 추가한 것은 훌륭한 개선사항입니다. 이를 통해 사용자는 Enter 키를 사용하여 로그인할 수 있게 되었으며, 웹 접근성이 향상되었습니다. 또한 Button 컴포넌트에 type='submit'을 사용함으로써 Button 컴포넌트의 기능 확장이 실제로 활용된 좋은 예시입니다.


89-90: 코드 포맷팅이 개선되었습니다.

LinkButton 컴포넌트의 닫는 태그 포맷이 }>에서 >로 일관되게 변경되었습니다. 이는 코드의 일관성과 가독성을 유지하는 데 도움이 됩니다.

Also applies to: 100-101, 111-112

frontend/src/pages/ClubDetailPage/components/InfoBox/InfoBox.tsx (4)

5-5: SnsLinkIcons 컴포넌트 추가로 소셜 미디어 링크 지원 강화.

새로운 SnsLinkIcons 컴포넌트를 가져와서 동아리의 소셜 미디어 링크를 표시할 수 있게 되었습니다. 이는 사용자 경험을 향상시키는 좋은 변경사항입니다.


9-10: ClubInfoItem 인터페이스 개선으로 유연성 증가.

value 속성을 선택적으로 변경하고 render 속성을 추가하여 단순 문자열뿐만 아니라 복잡한 React 노드도 표시할 수 있게 되었습니다. 이는 기존 코드와의 호환성을 유지하면서 컴포넌트의 기능을 확장하는 좋은 접근 방식입니다.


42-45: SNS 정보 항목 추가로 사용자에게 더 많은 정보 제공.

동아리정보 섹션에 소셜 미디어 링크를 위한 새로운 항목을 추가했습니다. 이는 render 속성을 활용하여 복잡한 컴포넌트를 표시하는 좋은 예시입니다.


65-65: Nullish 병합 연산자를 사용한 조건부 렌더링 구현.

nullish 병합 연산자(??)를 사용하여 render 속성이 있으면 그것을 렌더링하고, 그렇지 않으면 value 속성을 사용하도록 구현되었습니다. 이는 코드를 간결하게 유지하면서 새로운 기능을 지원하는 좋은 방법입니다.

✨ Finishing Touches
  • 📝 Generate Docstrings

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
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: 5

🧹 Nitpick comments (11)
frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx (1)

11-11: MarkdownEditor 코드 스플리팅 제안
MarkdownEditor는 용량이 큰 에디터 컴포넌트일 가능성이 큽니다. React.lazySuspense를 활용해 동적 import를 적용하면 초기 번들 크기를 줄여 페이지 로딩 성능을 개선할 수 있습니다.

frontend/src/constants/snsConfig.ts (1)

10-10: 유튜브 URL 패턴 확장 고려

현재 정규식은 channel/@ 형식의 URL만 허용하고 있습니다. 유튜브는 youtube.com/c/사용자명 또는 youtube.com/user/사용자명 같은 다른 URL 형식도 지원합니다.

-    regex: /^https:\/\/(www\.)?youtube\.com\/(channel\/|@)[A-Za-z0-9._%-]+\/?$/,
+    regex: /^https:\/\/(www\.)?youtube\.com\/(channel\/|@|c\/|user\/)[A-Za-z0-9._%-]+\/?$/,
frontend/.gitignore (1)

19-21: gitignore 항목 추가

테스트 커버리지 디렉토리(coverage/)와 Sentry 설정 파일(.env.sentry-build-plugin)을 .gitignore에 추가한 것은 적절합니다. 이러한 파일들은 버전 관리에서 제외되어야 하는 생성된 파일 또는 민감한 정보를 포함할 수 있는 파일입니다.

단, 19번 줄의 coverage/ 뒤에 불필요한 공백이 있으니 제거하는 것이 좋겠습니다.

-coverage/ 
+coverage/
frontend/src/utils/validateSocialLink.ts (1)

4-10: 검증 로직이 깔끔합니다

소셜 링크 검증 함수가 잘 구현되어 있습니다. 빈 값 체크와 정규식 검증을 통해 적절한 에러 메시지를 반환하는 구조가 깔끔합니다.

다음과 같은 보완 사항을 고려해 볼 수 있습니다:

  1. 링크가 빈 값인 경우 필수 입력 여부를 검증하는 별도의 로직 추가
  2. 에러 메시지 다국어 지원을 위한 분리

에러 메시지를 상수로 분리하는 리팩토링을 제안합니다:

- return `${label} 링크 형식이 조금 이상해요. 다시 한 번 확인해주세요!`;
+ const ERROR_MESSAGE = `${label} 링크 형식이 조금 이상해요. 다시 한 번 확인해주세요!`;
+ return ERROR_MESSAGE;
frontend/src/components/common/InputField/InputField.tsx (1)

89-91: 도움말 텍스트 조건부 렌더링

에러 상태일 때만 도움말 텍스트를 렌더링하는 조건부 렌더링이 깔끔하게 구현되어 있습니다. 이는 사용자에게 필요한 시점에만 피드백을 제공하는 좋은 UX 관행입니다.

스크린 리더 접근성을 위해 ARIA 속성 추가를 고려해볼 수 있습니다.

접근성 향상을 위한 ARIA 속성 추가를 제안합니다:

- <Styled.HelperText>{helperText}</Styled.HelperText>
+ <Styled.HelperText role="alert" aria-live="polite">{helperText}</Styled.HelperText>
frontend/src/utils/validateSocialLink.test.ts (2)

25-37: 테스트 보일러플레이트 최소화 제안

platforms.forEach + 람다 함수 패턴이 각 테스트마다 반복되고 있어요.
test.each(또는 describe.each)를 활용하면 중복을 줄이고 케이스를 테이블화하여 가독성을 높일 수 있습니다.

-  const expectNoError = (platform: SNSPlatform, link: string) => {
-    expect(validateSocialLink(platform, link)).toBe('');
-  };
+  const expectNoError = (platform: SNSPlatform, link: string) =>
+    expect(validateSocialLink(platform, link)).toBe('');

처럼 한 줄 함수로 간략화하거나, 아래와 같이 케이스를 묶어볼 수 있습니다:

describe.each(platforms)('%s URL 검증', (platform) => {
  it('유효한 링크 → 통과', () => {
    expect(validateSocialLink(platform, validLinks[platform])).toBe('');
  });

  it('잘못된 링크 → 실패', () => {
    expect(validateSocialLink(platform, invalidLinks[platform])).toBe(
      `${SNS_CONFIG[platform].label} 링크 형식이 조금 이상해요. 다시 한 번 확인해주세요!`,
    );
  });
});

64-68: 혼동 방지를 위한 유니코드 주석 개선

러시아어 ‘о’ 문자를 사용한 스푸핑 예시는 매우 좋은 케이스입니다.
다만, 두 문자가 시각적으로 같아 차이를 한눈에 파악하기 어렵기 때문에 코드 포인트를 주석에 명시하면 이해하기 더 쉽습니다.

-// 러시아어 소문자 о (U+043E)
+// U+043E(русская 'о')를 사용한 도메인 스푸핑 예시
frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.styles.ts (1)

52-57: 접근성(A11y) 관점의 label 요소 사용

SNSCheckboxLabel은 시멘틱한 <label> 태그이지만, 실제로 연결된 htmlFor 대상을 지정하지 않고 순수 스타일 컨테이너로 사용되고 있습니다.
스크린 리더 등 보조 기기에 혼란을 줄 수 있으니 두 가지 중 하나를 고려해 주세요.

  1. 시멘틱 목적이 없으면 <div> 또는 <span>으로 변경
  2. 연결할 idInputField에 전달하고 labelhtmlFor 속성을 설정
-export const SNSCheckboxLabel = styled.label`
+export const SNSCheckboxLabel = styled.span`
frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx (3)

50-62: useEffect 내부 로직 결합 가능

clubDetail이 존재할 때 두 번의 if 블록이 각각 setSocialLinks, setClubTags를 호출합니다.
하나의 if (clubDetail) 블록으로 합치면 불필요한 조건 검사를 줄이고 가독성이 향상됩니다.


88-97: 빈 태그 문자열 필터링 권장

tags 배열에 빈 문자열이 포함되어 있는 상태로 서버에 전송될 수 있습니다(초기값 ['', ''] 대비).
서버 유효성 검사 실패나 불필요한 데이터 저장을 방지하려면 전송 직전에 filter(Boolean) 처리를 권장드립니다.

-  tags: clubTags,
+  tags: clubTags.filter(Boolean),

192-205: SNSCheckboxLabel와 인풋 간의 시맨틱 연결

스타일 파일에서 언급한 것과 같이, 시멘틱한 <label>을 사용했다면 htmlFor 속성과 id를 연결해 접근성을 보장해 주세요.

-<Styled.SNSCheckboxLabel>{label}</Styled.SNSCheckboxLabel>
+<Styled.SNSCheckboxLabel htmlFor={`${key}-input`}>{label}</Styled.SNSCheckboxLabel>
 ...
-  <InputField
+  <InputField
+    id={`${key}-input`}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 312a425 and 9b3b36b.

⛔ Files ignored due to path filters (1)
  • frontend/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (18)
  • frontend/.gitignore (1 hunks)
  • frontend/package.json (1 hunks)
  • frontend/src/components/common/InputField/InputField.styles.ts (2 hunks)
  • frontend/src/components/common/InputField/InputField.tsx (4 hunks)
  • frontend/src/constants/snsConfig.ts (1 hunks)
  • frontend/src/hooks/useTrackPageView.ts (1 hunks)
  • frontend/src/index.tsx (2 hunks)
  • frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.styles.ts (1 hunks)
  • frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx (6 hunks)
  • frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/components/SelectTags/SelectTags.tsx (1 hunks)
  • frontend/src/pages/AdminPage/tabs/PhotoEditTab/PhotoEditTab.tsx (1 hunks)
  • frontend/src/pages/AdminPage/tabs/PhotoEditTab/components/ImageUpload/ImageUpload.tsx (1 hunks)
  • frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx (1 hunks)
  • frontend/src/pages/ClubDetailPage/ClubDetailPage.tsx (1 hunks)
  • frontend/src/pages/MainPage/components/Banner/Banner.tsx (3 hunks)
  • frontend/src/types/club.ts (3 hunks)
  • frontend/src/utils/validateSocialLink.test.ts (1 hunks)
  • frontend/src/utils/validateSocialLink.ts (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (4)
frontend/src/utils/validateSocialLink.ts (2)
frontend/src/types/club.ts (1)
  • SNSPlatform (14-14)
frontend/src/constants/snsConfig.ts (1)
  • SNS_CONFIG (1-17)
frontend/src/utils/validateSocialLink.test.ts (3)
frontend/src/types/club.ts (1)
  • SNSPlatform (14-14)
frontend/src/constants/snsConfig.ts (1)
  • SNS_CONFIG (1-17)
frontend/src/utils/validateSocialLink.ts (1)
  • validateSocialLink (4-10)
frontend/src/types/club.ts (1)
frontend/src/constants/snsConfig.ts (1)
  • SNS_CONFIG (1-17)
frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx (3)
frontend/src/types/club.ts (1)
  • SNSPlatform (14-14)
frontend/src/utils/validateSocialLink.ts (1)
  • validateSocialLink (4-10)
frontend/src/constants/snsConfig.ts (1)
  • SNS_CONFIG (1-17)
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: Redirect rules - moadong
  • GitHub Check: Header rules - moadong
  • GitHub Check: Pages changed - moadong
🔇 Additional comments (26)
frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx (1)

4-4: Calendar 컴포넌트 import 경로 일관성 확인
다른 AdminPage 탭(PhotoEditTab 등)과 동일하게 컴포넌트를 탭 전용 디렉터리로 분리하여 모듈 구조를 개선한 점이 좋습니다.

frontend/src/pages/AdminPage/tabs/PhotoEditTab/components/ImageUpload/ImageUpload.tsx (1)

54-55: onClick 핸들러 중괄호 닫기 및 개행 추가로 가독성 개선
콜백 내부의 중괄호 닫기와 개행 적용만 있는 형식 변경이므로 기능에는 영향이 없으며, 코드 가독성이 향상되었습니다.

frontend/src/pages/AdminPage/tabs/PhotoEditTab/PhotoEditTab.tsx (1)

4-5: 컴포넌트 경로 로컬라이징 반영
ImageUpload와 ImagePreview의 import 경로를 탭 전용 디렉터리로 옮겨 모듈화가 강화되었으며, 구조가 더 명확해졌습니다.

frontend/src/constants/snsConfig.ts (1)

1-17: SNS 설정 개체가 잘 구성되어 있습니다

SNS 연결 관리를 위한 설정 상수를 만들어 일관된 접근 방식을 제공하고 있어 좋습니다. 레이블, 자리표시자, 정규식 패턴이 각 플랫폼에 맞게 적절히 구성되어 있습니다.

frontend/src/components/common/InputField/InputField.styles.ts (1)

22-48: 오류 상태에 대한 스타일링 개선

입력 필드에 오류 상태 스타일링을 추가한 것은 좋은 UX 개선입니다. 빨간색 테두리와 그림자로 사용자에게 명확한 시각적 피드백을 제공합니다.

frontend/src/hooks/useTrackPageView.ts (3)

5-9: useRef를 사용한 방식 개선

시작 시간과 추적 상태를 useRef로 관리하도록 개선한 것은 좋은 변경입니다. 이를 통해 컴포넌트가 다시 렌더링되더라도 일관된 시간 측정이 가능해집니다.


18-28: 추적 중복 방지 로직 추가

추적이 중복으로 발생하지 않도록 isTracked 플래그를 확인하는 로직을 추가한 것은 좋은 개선입니다. 이로 인해 이벤트 데이터의 정확성이 향상됩니다.


37-42: 클린업 함수 개선

컴포넌트 언마운트 시 trackPageDuration을 호출하여 페이지 머문 시간을 확실히 기록하도록 개선된 것은 좋습니다.

frontend/src/pages/MainPage/components/Banner/Banner.tsx (6)

20-22: 배너 컴포넌트의 초기화 상태 개선

새로운 isReady 상태 변수를 추가하고 isAnimating의 초기값을 false로 설정한 것은 좋은 변경입니다. 이렇게 하면 컴포넌트가 완전히 초기화되기 전에 애니메이션이 시작되는 것을 방지할 수 있습니다.


27-39: 슬라이드 초기화 로직 개선

updateSlideWidth 함수의 업데이트로 슬라이드 너비가 유효할 때만 애니메이션을 활성화하도록 한 점이 좋습니다. 이는 컴포넌트가 완전히 준비되기 전에 발생할 수 있는 시각적 버그를 방지합니다.


41-54: 리사이즈 이벤트 처리 개선

윈도우 리사이즈 시 isReadyisAnimating을 초기화하는 것은 레이아웃 변경 중 애니메이션이 발생하는 것을 방지하는 좋은 접근법입니다.


56-87: 슬라이드 효과 안정성 향상

슬라이드 효과를 적용하기 전에 slideWidthisReady 상태를 확인하는 것은 컴포넌트가 준비되기 전에 변환이 적용되는 것을 방지하는 좋은 방어적 프로그래밍 방식입니다.


89-101: 슬라이드 이동 함수 보호 추가

슬라이드 이동 함수에 isReady 확인을 추가한 것은 컴포넌트가 완전히 초기화되기 전에 네비게이션이 발생하는 것을 방지하는 좋은 방법입니다.


103-111: 자동 슬라이드 타이머 조건 개선

자동 슬라이드 효과가 isReady 상태에 의존하도록 한 것은 컴포넌트가 완전히 준비되기 전에 타이머가 작동하는 것을 방지하는 좋은 접근법입니다.

frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/components/SelectTags/SelectTags.tsx (1)

17-21: JSX 구문 오류 수정

<Styled.Button> 태그에 닫는 꺾쇠 괄호 >를 추가한 것은 올바른 수정입니다. 이 변경으로 이전에 존재했던 JSX 구문 오류가 해결되었습니다.

frontend/package.json (1)

24-25:

Details

❓ Verification inconclusive

Sentry 의존성 추가

Sentry 관련 패키지(@sentry/react@sentry/webpack-plugin)를 추가한 것은 애플리케이션에 에러 추적 및 모니터링 기능을 통합하기 위한 좋은 변경입니다. 단, Sentry가 애플리케이션 코드(아마도 index.tsx)에서 올바르게 초기화되었는지 확인하고, 개발 및 프로덕션 환경에 맞게 적절히 구성되었는지 확인하는 것이 중요합니다.

다음 스크립트를 실행하여 Sentry 초기화 코드가 존재하는지 확인해보세요:


🏁 Script executed:

#!/bin/bash
# Sentry 초기화 코드 검색
echo "Checking for Sentry initialization..."
rg "import \* as Sentry from '@sentry/react'" -A 10 --type ts

Length of output: 661


다음 스크립트를 실행하여 Sentry 초기화 호출(Sentry.init)이 있는지 확인해보세요:


🏁 Script executed:

#!/bin/bash
echo "Sentry 초기화 호출(Sentry.init) 검색 중..."
# ts 및 tsx 파일에서 Sentry.init 호출 검색
rg "Sentry\\.init" -A 5 -g '*.ts' -g '*.tsx'

Length of output: 400


Sentry 초기화 확인 및 환경 변수 검증 필요

frontend/src/index.tsx에서 다음과 같이 Sentry가 올바르게 import·init 된 것이 확인되었습니다.

  • import: import * as Sentry from '@sentry/react';
  • 초기화:
    Sentry.init({
      dsn: process.env.SENTRY_DSN,
      sendDefaultPii: false,
      release: process.env.SENTRY_RELEASE,
      tracesSampleRate: 0.1,
    });

남은 과제는 개발/프로덕션 환경에 맞는 환경 변수 설정이 제대로 이루어졌는지 검증하는 것입니다.

  • .env 또는 CI/CD 환경에 SENTRY_DSN, SENTRY_RELEASE 값이 올바르게 설정되었는지 확인
  • 개발 환경에서는 로깅 레벨·샘플링(rate) 조정을 고려
  • 프로덕션 환경 배포 전 리포트 전송 여부와 release 태깅이 제대로 동작하는지 테스트
frontend/src/index.tsx (2)

6-6: Sentry 의존성 추가 확인

Sentry React SDK를 추가했습니다. 이는 오류 모니터링을 위한 좋은 선택입니다. package.json에 관련 의존성(@sentry/react, @sentry/webpack-plugin)이 추가되었는지 확인해주세요.


26-31:

Details

❓ Verification inconclusive

Sentry 설정 구현이 깔끔합니다

Sentry 초기화 설정이 적절하게 구현되었습니다. 특히 개인정보 전송 방지를 위한 sendDefaultPii: false 설정과 적절한 샘플링 비율(10%)을 지정한 것이 좋습니다.

환경 변수가 제대로 설정되어 있는지 확인이 필요합니다:


🏁 Script executed:

#!/bin/bash
# Check if Sentry environment variables are properly set in CI/CD
echo "Checking for Sentry environment variables..."
grep -r "SENTRY_DSN\|SENTRY_RELEASE" .github/workflows/ || echo "No Sentry env vars found in workflows"

Length of output: 293


#!/bin/bash
echo "Checking for CI/CD configuration files at repository root and common directories..."

# Check for GitHub Actions workflows
if [ -d .github/workflows ]; then
  echo "Found .github/workflows directory:"
  ls -1 .github/workflows
else
  echo "No .github/workflows directory"
fi

# Check for GitLab CI configuration
if [ -f .gitlab-ci.yml ]; then
  echo "Found .gitlab-ci.yml"
else
  echo "No .gitlab-ci.yml"
fi

# Check for CircleCI configuration
if [ -d .circleci ]; then
  echo "Found .circleci directory:"
  ls -1 .circleci
else
  echo "No .circleci directory"
fi

# Check for Azure Pipelines configuration
if [ -f azure-pipelines.yml ]; then
  echo "Found azure-pipelines.yml"
else
  echo "No azure-pipelines.yml"
fi

# Search for Sentry env vars in any YAML configurations
echo "Searching for SENTRY_DSN or SENTRY_RELEASE in all YAML files..."
grep -R "SENTRY_DSN\\|SENTRY_RELEASE" --include="*.yml" -n .

#!/bin/bash
echo "CI/CD 구성 파일 검사 중..."

# GitHub Actions
if [ -d .github/workflows ]; then
  echo "GitHub Actions 워크플로우 파일:"
  ls -1 .github/workflows
else
  echo "GitHub Actions 워크플로우 없음"
fi

# Travis CI
if [ -f .travis.yml ]; then
  echo "Found .travis.yml"
else
  echo "No .travis.yml"
fi

# Jenkins
if [ -f Jenkinsfile ]; then
  echo "Found Jenkinsfile"
else
  echo "No Jenkinsfile"
fi

# GitLab CI
if [ -f .gitlab-ci.yml ]; then
  echo "Found .gitlab-ci.yml"
else
  echo "No .gitlab-ci.yml"
fi

# CircleCI
if [ -d .circleci ]; then
  echo "CircleCI 구성 파일:"
  ls -1 .circleci
else
  echo "No .circleci"
fi

# Azure Pipelines
if [ -f azure-pipelines.yml ]; then
  echo "Found azure-pipelines.yml"
else
  echo "No azure-pipelines.yml"
fi

# SENTRY 환경 변수 검색
echo "SENTRY_DSN 및 SENTRY_RELEASE 검색 중..."
grep -R "SENTRY_DSN\\|SENTRY_RELEASE" -n .

CI/CD 환경변수 설정 확인 필요

현재 리포지토리에서 CI/CD 구성 파일을 찾을 수 없어 자동으로 SENTRY_DSN·SENTRY_RELEASE 설정 여부를 검증하지 못했습니다. 배포·빌드 파이프라인에 아래 항목이 올바르게 설정되어 있는지 확인해 주세요:

  • .github/workflows/*.yml (GitHub Actions)
  • .gitlab-ci.yml (GitLab CI)
  • azure-pipelines.yml (Azure Pipelines)
  • .circleci/config.yml (CircleCI)
  • 사용 중인 다른 CI 도구의 설정 파일
frontend/src/types/club.ts (3)

1-1: 상수 임포트 확인

SNS_CONFIG 상수를 imports하고 있습니다. 타입과 상수 간의 일관성을 유지하기 위한 좋은 접근법입니다.


14-14: 타입 정의가 적절합니다

keyof typeof 연산자를 사용하여 SNS_CONFIG의 키들로부터 SNSPlatform 타입을 정의한 것이 좋습니다. 이는 SNS 플랫폼이 추가되거나 변경될 때 타입을 자동으로 업데이트할 수 있게 해줍니다.


25-25: Record 타입 사용이 적절합니다

Record<SNSPlatform, string> 타입을 사용하여 소셜 링크를 관리하는 방식이 적절합니다. 이는 타입 안전성을 제공하면서도 모든 SNS 플랫폼에 대한 링크를 관리하는 깔끔한 방법입니다.

frontend/src/utils/validateSocialLink.ts (1)

1-3: 필요한 임포트가 있습니다

SNS_CONFIG와 SNSPlatform 타입을 적절히 임포트하고 있습니다.

frontend/src/components/common/InputField/InputField.tsx (3)

17-18: 에러 상태 처리를 위한 props 추가

에러 상태와 도움말 텍스트를 위한 props를 추가한 것은 좋은 개선입니다. 이는 사용자에게 더 나은 피드백을 제공할 수 있게 해줍니다.


33-34: props 구조 분해가 적절합니다

새로운 props를 컴포넌트 파라미터에서 구조 분해하여 사용하고 있습니다.


71-71:

Details

✅ Verification successful

스타일 컴포넌트에 에러 상태 전달

에러 상태를 스타일 컴포넌트에 hasError prop으로 전달하는 것이 좋습니다. 이를 통해 에러 상태일 때 시각적 피드백을 제공할 수 있습니다.

InputField.styles.ts 파일에서 hasError prop에 따른 스타일 변경이 제대로 구현되어 있는지 확인해 보세요:


🏁 Script executed:

#!/bin/bash
cat $(find frontend/src/components/common/InputField -name "InputField.styles.ts")

Length of output: 2160


hasError 스타일 적용 확인 완료

InputField.styles.tsInput 컴포넌트는 hasError prop을 사용해 경계(border) 색상, 포커스 시 보더 및 박스 쉐도우 색상을 올바르게 변경하고 있습니다. 추가적인 수정 없이 의도한 시각적 피드백이 정상 동작합니다.

frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.styles.ts (1)

34-35: 전체 레이아웃 여백 조정 확인 필요

TagEditGroupmargin-bottom이 120px으로 증가했습니다.
동일한 섹션(InfoGroup)의 margin-bottom: 140px과 조합될 때 하단 공백이 과도하게 늘어날 수 있으니 디자인 시안과 맞는지 한 번 더 확인 부탁드립니다.

oesnuj and others added 24 commits May 14, 2025 20:02
UI 스타일 컴포넌트 추가
- SnsLinkIcons 컴포넌트를 render 필드로 전달하여 렌더링
- socialLinks를 기반으로 SNS 정보 노출
- 반복 렌더링 구조로 중복 코드 제거
- props의 출처를 명확히 하기 위해 네이밍 수정
- API 응답 구조에 맞춰 props 타입을 일반화
…nt-FE-115

[fix] useRef에서 startTime.current 프로퍼티 누락 오류 수정
…FE-105

[fix] ClubTag 컴포넌트의 중복 key 문제 해결
…er-key-support-FE-116

[feature] 관리자 페이지 Enter키 로그인 기능 추가
…play-FE-114

[feature] 상세페이지 동아리 SNS 링크 노출 기능 추가
Copy link
Member

@oesnuj oesnuj left a comment

Choose a reason for hiding this comment

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

🚀 ~~

@seongwon030 seongwon030 merged commit f4eaf2b into main May 15, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

💻 FE Frontend 📈 release 릴리즈 배포

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants