Skip to content

john9803/crewman

Repository files navigation

🧑‍✈️ Crewman

개발 동아리를 위한 참여도 · 과제 · 운영 관리 플랫폼

Vercel React Supabase


📌 프로젝트 개요

Crewman은 개발 동아리에 특화된 운영 관리 플랫폼입니다.

기존 동아리 운영은 오픈카톡방, 구글폼, 노션 등 여러 도구에 분산되어 있어 관리 비용이 높고 참여도 추적이 어렵다는 문제가 있습니다. Crewman은 이를 하나의 플랫폼으로 통합합니다.

현재 초점: 운영 중인 개발 동아리의 내부 운영 관리 (과제 관리 · 참여도 추적 · 게시판)
마일스톤: 하반기 모집 기능 확장 — 지원서 수집부터 합불 안내까지 단일 플랫폼으로 통합

🔗 서비스 바로가기


💡 기획 배경

개발 동아리를 직접 운영하면서 아래 문제를 경험했습니다.

  • 모집 프로세스 비효율 — 지원서 수집, 검토, 합불 통보를 수작업으로 처리
  • 과제 관리 파편화 — 공지는 카톡, 제출은 구글폼, 채점은 노션으로 분산
  • 참여도 파악 불가 — 출석률, 과제 제출률을 한눈에 볼 수 있는 도구 부재

범용 동아리 관리 툴이 아닌 개발 동아리의 운영 방식에 맞춘 서비스를 직접 만들었습니다.


✨ 주요 기능

현재 — 운영 관리

과제 관리

  • 과제 등록 및 마감일 설정
  • 코딩 과제 / 단답식 / 서술식 유형 지원
  • 과제 제출 및 채점 기능
  • 멤버별 제출 현황 일괄 조회

참여도 관리

  • 세션별 출석 체크
  • 멤버별 출석률 및 과제 참여율 통계

게시판

  • 공지사항 및 자유게시판
  • 댓글 / 좋아요

알림

  • 인앱 실시간 알림 (Supabase Realtime)
  • 이메일 알림 (Resend)

마일스톤 — 모집 관리 (하반기)

  • 동아리 모집 공고 등록 및 마감 관리
  • 지원자 목록 조회 및 승인 / 거절 처리
  • 합불 결과 자동 이메일 발송
  • 특정 분야의 동아리뿐 아니라 범용 동아리 관리 플랫폼으로 발전예정

🛠 기술 스택

분류 기술
Frontend React 19, Vite, Tailwind CSS v4
상태관리 Zustand, TanStack Query v5
폼 검증 React Hook Form, Zod
Backend Supabase (Auth, DB, Storage, Realtime)
메일 Resend
차트 Recharts
배포 Vercel

🏗 아키텍처

[React Client]
      │
      ├── Supabase Auth      → 회원가입 / 로그인 / 세션 관리
      ├── Supabase DB        → 멤버, 과제, 게시판, 출석 데이터
      ├── Supabase Storage   → 프로필 이미지
      ├── Supabase Realtime  → 인앱 실시간 알림
      └── Resend API         → 이메일 알림 발송

📁 프로젝트 구조

src/
├── components/     # 공통 UI 컴포넌트
├── hooks/          # 커스텀 훅 (useAttendance, useProfile 등)
├── lib/            # Supabase 클라이언트, 유틸 설정
├── pages/          # 라우트별 페이지 컴포넌트
├── stores/         # Zustand 전역 상태
└── utils/          # 공통 유틸 함수

🔧 트러블슈팅

1. Supabase Realtime 채널 중복 구독

문제: 페이지 재방문 시 동일 채널에 중복 구독이 발생해 알림이 여러 번 수신
원인: 컴포넌트 언마운트 시 채널 구독 해제 처리 누락
해결: useEffect cleanup에서 supabase.removeChannel() 호출로 해결

2. 로그인 후 무한 스피너

문제: 로그인 후 프로필 로딩이 완료되지 않아 앱이 무한 로딩
원인: auth 상태 변경 이벤트에서 fetchProfile 비동기 대기 로직 오류
해결: auth 이벤트 핸들러 내 프로필 fetch 순서 재정리

3. 모바일 사이드바 z-index 충돌

문제: 모바일에서 사이드바 오버레이가 일부 컴포넌트 아래로 렌더링
원인: 부모 요소의 transform 속성이 새로운 스태킹 컨텍스트를 생성해 z-index 무력화
해결: 오버레이를 Portal로 분리하여 body에 직접 렌더링

4. assignment_views upsert 403 에러

문제: 과제 조회수 upsert 시 403 Forbidden 발생
원인: Supabase RLS(Row Level Security) 정책 미설정
해결: 해당 테이블에 적합한 RLS 정책 추가


🔮 진행 중인 작업

  • Spring Boot 백엔드 전환 — Supabase → Spring Boot 3 + PostgreSQL 마이그레이션
  • JavaMail 메일 서버 직접 구현 — SMTP 직접 제어로 Resend 의존성 제거
  • Ubuntu 홈서버 배포 — Nginx 리버스 프록시 구성
  • 모집 기능 확장 — 지원서 수집, 합불 이메일 자동 발송

👤 개발자

이름 GitHub
박진영 @john9803

About

동아리 통합관리 플랫폼 Crewman

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors