| Core |
|
| Styling |
|
| State · Data |
|
| Editor |
|
| Mobile |
|
| Testing |
|
| Infra · Tooling |
|
React Compiler가 켜져 있어 useMemo, useCallback, React.memo는 대부분 필요하지 않습니다.
src/
├── app/ # Next.js App Router
│ ├── (private)/ # 인증 필요 — [clubId] 기반 메인 / 어드민
│ ├── (public)/ # 인증 불필요 — 로그인 · 랜딩 · 클럽 공개 페이지
│ └── globals.css # 디자인 토큰 (CSS 변수 · @utility)
├── components/ # ui / layout / 도메인별 컴포넌트
├── lib/
│ ├── actions/ # Server Actions ("use server")
│ ├── apis/ # API 호출 함수
│ └── cn.ts # className 머지 유틸
├── stores/ # Zustand 전역 상태
├── hooks/ # 커스텀 훅
├── flags/ # Flagsmith 기능 플래그
└── types/ # 타입 정의
[clubId] 동적 세그먼트가 곧 클럽 컨텍스트입니다. 사용자는 URL을 따라 클럽을 바꿔가며 활동합니다.
- Weeth는 동아리 운영에서 반복되는 일들을 하나의 서비스로 정리했습니다.
- 한 번 가입하면 여러 동아리를 넘나들며 활동할 수 있고, 클럽 컨텍스트는 URL로 전환됩니다.
- 웹과 iOS·Android를 하나의 코드베이스(Capacitor)로 서비스하며, React Server Components를 바탕으로 가볍게 동작합니다.
|
회원은 이렇게 써요
|
운영진은 이렇게 써요
|
![]() |
![]() |
| 캘린더 | 출석 |
![]() |
![]() |
| 회비 | 멤버 |
![]() |
![]() |
| 게시판 | 마이페이지 |
![]() |
![]() |
| 멤버 관리 | 세션 관리 |
![]() |
![]() |
| 게시판 관리 | 회비 관리 |
![]() |
![]() |
![]() |
![]() |
| 홈 | 캘린더 | 출석 | 마이페이지 |
|
쿠키 기반 인증 · Apple·Kakao 소셜 로그인 |
tiptap 리치 에디터 · 공지/일반 게시판 · 댓글·대댓글·좋아요 |
|
세션별 출석 코드 · QR 스캔 · 실시간 출석 현황 |
프로필 · 활동 기수(Cardinal) · 출석 통계 |
|
멤버 · 게시판 · 일정 · 출석 · 클럽 정보 관리 대시보드 |
Flagsmith 기반 클럽별 기능 On/Off · 버전 분기 |
이 프로젝트는 pnpm만 사용합니다. (npm·yarn 사용 금지)
pnpm install # 의존성 설치
pnpm dev # 개발 서버 실행실행 후 http://localhost:3000 에서 확인할 수 있습니다.
프로덕션 URL(https://weeth.kr)을 띄우는 하이브리드 앱 구조입니다.
pnpm cap:dev:ios # 로컬 개발 서버로 iOS 실행
pnpm cap:dev:android # 로컬 개발 서버로 Android 에뮬레이터 실행
pnpm cap:prod:sync # 프로덕션 URL을 네이티브 프로젝트에 동기화
pnpm cap:open:ios # Xcode 열기
pnpm cap:open:android # Android Studio 열기CAP_SERVER_URL 환경 변수로 웹 서버 주소를 덮어쓸 수 있습니다.
| 명령어 | 설명 |
|---|---|
pnpm dev |
개발 서버 |
pnpm build |
프로덕션 빌드 |
pnpm lint |
ESLint 검사 |
pnpm format:check |
Prettier 포맷 검사 |
pnpm typecheck |
타입 검사 (tsc --noEmit) |
pnpm test |
Jest 테스트 |
pnpm test:e2e |
Playwright E2E 테스트 |
pnpm analyze |
번들 사이즈 분석 |
pnpm generate:types |
Swagger에서 API 타입 생성 |
Team Weeth


















