Proovy는 이공계 대학생을 위한 퍼스널 AI 튜터 서비스로,
정확한 풀이 검증 · 수식 친화적인 입력 · 학습 루프 제공을 목표로 합니다.
본 저장소는 Proovy 서비스의 Frontend(Web) 코드베이스이며,
팀 단위 협업을 전제로 한 명확한 컨벤션과 구조를 따릅니다.
| 강민경 | 이다영 | 이승준 | 지현구 |
|---|---|---|---|
| 강민경 | 이다영 | 이승준 | 지현구 |
- React ^19.2.0
- TypeScript ~5.9.3
Proovy는 채팅, 수식 입력, PDF 뷰어, 실시간 에디터 등 UI 복잡도가 매우 높은 화면들로 구성되어 있습니다.
- 컴포넌트 단위 설계로 채팅, 뷰어, 캔버스, 워크스페이스를 명확한 책임 단위로 분리 가능합니다.
- 상태 변화가 빈번한 대화형 UI와 실시간 스트리밍(SSE) 기반의 메시지 업데이트에 최적화되어 있습니다.
Proovy의 도메인 모델은 채팅 메시지, 수식 메타데이터, API 응답 등으로 구조가 복잡합니다.
- 타입 안정성으로 런타임 에러를 사전에 방지하고, 팀 협업 시 타입이 자체 문서 역할 수행합니다.
- IDE 자동완성 지원으로 개발 생산성이 향상됩니다.
- TailwindCSS v4
- 디자인 토큰을 유틸리티 클래스로 관리하여 UI 일관성 유지가 용이합니다.
- 빠른 UI 프로토타이핑이 가능하여 MVP 개발 속도를 크게 향상시킵니다.
- Prettier 플러그인과 함께 사용하여 스타일 코드 정렬 자동화가 가능합니다.
- pnpm
- Prettier
- ESLint
- 모노레포 및 대규모 의존성 환경에서 디스크 사용량과 설치 속도가 효율적입니다.
- lockfile 기반으로 팀원 간 완전히 동일한 의존성 환경을 보장합니다.
- 코드 스타일 논쟁을 제거하고, 리뷰 포인트를 로직에만 집중하기 위함입니다.
- 커밋 전 포맷팅을 강제하여 코드 품질을 일정 수준 이상으로 유지합니다.
- @tanstack/react-query: 서버 상태 관리 및 캐싱
- zustand: 클라이언트 상태 관리 (간결하고 가벼운 구조)
- mathlive: 수학 수식 입력 컴포넌트
- katex: LaTeX 기반 수식 렌더링
- remark-math, rehype-katex: markdown 내 수식 지원
- pdfjs-dist: PDF 렌더링 및 뷰어
- react-markdown: markdown 마크업 렌더링
- tldraw: 화이트보드 및 드로잉 기능
- axios: HTTP 클라이언트
- msw: Mock Service Worker (개발 환경에서 API 모킹)
- lucide-react: 아이콘 라이브러리
- clsx, tailwind-merge: CSS 클래스 유틸리티
- react-router-dom: 클라이언트 라우팅
# 개발 서버 실행 (<http://localhost:5173>)
pnpm run dev
# 프로덕션 빌드
pnpm run build
# ESLint 검사
pnpm run lint
# Prettier 코드 포매팅
pnpm run format
# 빌드된 결과 미리보기
pnpm run previewVite 설정에서 @ alias가 src/ 디렉토리를 가리키도록 설정되어 있습니다.
// ✅ 좋음: @ alias 사용
import { useAuth } from "@/features/auth/hooks/useAuth";
import { ChatHeader } from "@/features/chat/components/ChatHeader";
import { cn } from "@/shared/lib/utils";
// ❌ 나쁜 예: 상대 경로
import { useAuth } from "../../../features/auth/hooks/useAuth";# 저장소 클론
git clone <https://github.com/Team-Proovy/Proovy-front.git>
cd Proovy-front
# 의존성 설치 (pnpm 필요)
pnpm install
# pnpm이 없다면 설치
npm install -g pnpm# .env 파일 생성
cp .env.example .env # (또는 수동으로 .env 생성)
# .env 파일에 다음 내용 추가
echo "VITE_API_BASE_URL=http://localhost:3000" >> .env
echo "VITE_ENV=development" >> .env권장 확장프로그램:
- ESLint (
dbaeumer.vscode-eslint) - Prettier - Code formatter (
esbenp.prettier-vscode) - TypeScript Vue Plugin (Volar) (
Vue.volar) - TypeScript 지원 - Tailwind CSS IntelliSense (
bradlc.vscode-tailwindcss) - Tailwind 자동완성
자동 포매팅이 저장 시 활성화됩니다 (.vscode/settings.json 설정됨):
formatOnSave: true- 기본 포매터: Prettier
- ESLint 자동 수정 활성화
# 개발 서버 시작
pnpm run dev
# 브라우저에서 <http://localhost:5173> 접속# 타입 검사
pnpm run build
# 린트 검사
pnpm run lint
# 코드 포매팅
pnpm run formatsrc/
├── app/ # 앱 전역 설정
│ ├── providers/ # 전역 Provider (React Query, MSW)
│ ├── router/ # 라우터 설정
│ └── styles/ # 전역 스타일
│
├── features/ # 핵심 비즈니스 기능
│ ├── auth/ # 로그인 / 인증
│ ├── chat/ # 채팅 / SSE
│ ├── editor/ # 캔버스 / 수식 입력 (tldraw, mathlive)
│ ├── assets/ # 자산 업로드 / 파일 관리
│ ├── notes/ # 노트 관리
│ ├── search/ # 검색 기능
│ ├── settings/ # 설정
│ ├── sidebar/ # 사이드바
│ ├── storage/ # 스토리지 관리
│ └── subscription/ # 구독 및 결제
│
├── shared/ # 전역 공통 모듈
│ ├── api/ # API 클라이언트 (axios)
│ ├── assets/ # 이미지 등 정적 자산
│ ├── components/ # 공용 컴포넌트
│ ├── hooks/ # 공용 훅
│ ├── layout/ # 레이아웃 컴포넌트
│ ├── lib/ # 유틸리티 함수
│ └── utils/ # 헬퍼 함수
│
├── pages/ # 특정 기능이 포함되지 않는 페이지
│ ├── HomePage.tsx
│ ├── LandingPage.tsx
│
├── mocks/ # Mock Service Worker (MSW)
│ ├── browser.ts
│ ├── handlers.ts
│ └── handlers/
│
└── main.tsx # 앱 진입점main: 실제 배포용dev: 개발 통합 브랜치feat/*: 기능 개발 브랜치- 기능 구현용 브랜치
- 반드시
dev에서 분기하고dev로 머지
[Feature]: 새로운 기능 추가[Bug]: 버그 발생[Fix]: 버그 수정[Refactor]: 코드 구조 개선[Documentation]: 문서 작성/수정[Chore]: 프로젝트 설정 및 기타 작업[Enhancement]: 기능 개선 요청- Issue 발행
- 이슈 하나(브랜치 하나)에서 하나의 기능만 개발
- Issue 템플릿 (
.github/ISSUE_TEMPLATE/feature-request.md) 사용 - 이슈 제목 형식:
[이슈 종류(대문자로 시작)] 이슈_제목- 예:
[Feat] example API 구현 - 예:
[Fix] dev 브랜치 충돌 해결
- 예:
- Assignees / Labels 설정
- 로컬 최신화
git fetchgit pull
- Issue 발행
- 기본 규칙:
feat/이슈번호-기능명 - 실제 사용 패턴(이슈 라벨 반영):
issue_label/issue_number-detail- 예:
feat/12-init-project - 예:
fix/3-add-login - 예:
refactor/22-cart-page
- 예:
- 커밋 전에 프리티어 적용하기 →
pnpm run format.prettierc
- 커밋 작성 시 Body에 커밋 관련 설명을 자세하게 적기
- 커밋 메시지:
이슈종류: “커밋 관련 설명” (#이슈번호)
예시)
feat: 로그인 구현 (#9)
fix: 카드 페이지 수정 (#10)
refactor: 아이콘 리팩토링 (#13)- PR 제목 규칙: 타입(#이슈번호): pr내용
예시)
Feat(#9): 로그인 구현
Fix(#10): 카드 페이지 수정
Refactor(#13): 아이콘 리팩토링- PR은 대충 쓰지 말고 팀원이 리뷰하기 쉽도록 예쁘고 자세하게 작성하기
- 테스트 결과를 스크린샷으로 PR에 포함하기 (머지 이전에 개인적으로 테스트를 꼭 하기)
- Pull Request 작성
- PR 템플릿 사용 →
.github/PULL_REQUEST_TEMPLATE.md
- PR 템플릿 사용 →
dev브랜치로의 머지는 2명 이상의 Approve가 필요하다.
1️⃣ 파일 생성 규칙 (File Naming)
| 파일 종류 | 규칙 (Case) | 예시 (Example) | 비고 |
|---|---|---|---|
| 페이지 & 컴포넌트 | PascalCase | LoginPage.tsx |
|
SidebarItem.tsx |
대문자로 시작 (.tsx) |
||
| 훅(Hook) | camelCase | useAuth.ts |
|
| 그 외 모든 파일 | snake_case | auth_api.ts |
date_utils.ts
global_style.css | 소문자 + 언더바 (_) |
2️⃣ 코드 작성 규칙 (Variable & Function)
| 종류 | 규칙 (Case) | 예시 (Example) |
|---|---|---|
| 변수 (Variable) | camelCase | const userInfo = ... |
const isLoggedIn = true |
||
| 함수 (Function) | camelCase | const getUserData = () => {} |
function handleClick() {} |
||
| 컴포넌트 함수 | PascalCase | export default function LoginPage() {} |
📏 변수명 네이밍 규칙 (Naming Convention)
| 데이터 종류 (Type) | 규칙 (Rule) | 좋은 예시 (Good ✅) | 나쁜 예시 / 비고 (Bad ❌) |
|---|---|---|---|
| 배열 (Array) | 복수형 (-s) |
||
또는 List 접미사 |
const users = [] |
||
const mediaList = [] |
const user = [] (단수형 금지) |
||
const medias (어색한 복수형 지양) |
|||
| 객체 / 단일 값 | 단수형 | const currentUser = {...} |
|
const selectedId = 1 |
const users = {...} (객체인데 복수형 금지) |
||
| 불리언 (Boolean) | 상태 접두사 | ||
(is, has, should) |
const isLoading = true |
||
const hasError = false |
const loading = true (동사 없음) |
||
const check = false (모호함) |
|||
| 함수 (Function) | 동사 + 명사 | getUserData() |
|
handleClick() |
userData() (명사만 사용 금지) |
||
process() (너무 포괄적임) |
- Issue 생성: 작업 내용을 명확히 기술하고 Assignee/Label 설정
- 브랜치 생성:
dev브랜치 최신화 후feat/이슈번호-기능명브랜치 생성 - 코드 컨벤션 준수: 파일명, 변수명, 함수명이 모두 가이드 따름
- 타입 정의: 모든 API 응답, Props에 TypeScript 타입 정의 완료
- 포매팅: 개발 중에도 자주
pnpm run format실행 - 린트: 린트 에러 없는 상태 유지 (
pnpm run lint) - 타입 체크: 타입 에러 없음 (
pnpm run build성공) - 로딩/에러 상태: 비동기 작업 시
isLoading,error상태 표시
- 포매팅:
pnpm run format실행 - 린트:
pnpm run lint검사 통과 - 빌드:
pnpm run build성공 - 기능 테스트: 해당 기능이 의도대로 작동하는지 확인
- 스크린샷: 주요 UI 변경사항 스크린샷 준비
- PR 제목:
타입(#이슈번호): 설명형식 준수 - 체크리스트: PR 템플릿의 모든 항목 체크
- 리뷰 요청: 최소 2명 이상의 리뷰어 지정
- Approve 확보: 2명 이상 Approve 후 머지
개발 중 발생한 문제와 해결 방법은 아래 링크를 참고하세요:
주요 내용:
- 환경 설정 오류
- 의존성 설치 문제
- 개발 서버 실행 오류
- 타입/린트 오류 해결
- API 연동 관련 문제