Skip to content

Team-Proovy/Proovy-front

Repository files navigation

Proovy Frontend

ProovyλŠ” 이곡계 λŒ€ν•™μƒμ„ μœ„ν•œ νΌμŠ€λ„ AI νŠœν„° μ„œλΉ„μŠ€λ‘œ,

μ •ν™•ν•œ 풀이 검증 Β· μˆ˜μ‹ μΉœν™”μ μΈ μž…λ ₯ Β· ν•™μŠ΅ 루프 μ œκ³΅μ„ λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

λ³Έ μ €μž₯μ†ŒλŠ” Proovy μ„œλΉ„μŠ€μ˜ Frontend(Web) μ½”λ“œλ² μ΄μŠ€μ΄λ©°,

νŒ€ λ‹¨μœ„ ν˜‘μ—…μ„ μ „μ œλ‘œ ν•œ λͺ…ν™•ν•œ μ»¨λ²€μ…˜κ³Ό ꡬ쑰λ₯Ό λ”°λ¦…λ‹ˆλ‹€.


πŸ‘₯ Member

κ°•λ―Όκ²½ μ΄λ‹€μ˜ μ΄μŠΉμ€€ μ§€ν˜„κ΅¬
κ°•λ―Όκ²½ μ΄λ‹€μ˜ μ΄μŠΉμ€€ μ§€ν˜„κ΅¬


1️⃣ 기술 μŠ€νƒ 및 μ„ μ • 이유

Framework / Language

  • React ^19.2.0
  • TypeScript ~5.9.3

React 선택 이유

ProovyλŠ” μ±„νŒ…, μˆ˜μ‹ μž…λ ₯, PDF λ·°μ–΄, μ‹€μ‹œκ°„ 에디터 λ“± UI λ³΅μž‘λ„κ°€ 맀우 높은 ν™”λ©΄λ“€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • μ»΄ν¬λ„ŒνŠΈ λ‹¨μœ„ μ„€κ³„λ‘œ μ±„νŒ…, λ·°μ–΄, μΊ”λ²„μŠ€, μ›Œν¬μŠ€νŽ˜μ΄μŠ€λ₯Ό λͺ…ν™•ν•œ μ±…μž„ λ‹¨μœ„λ‘œ 뢄리 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • μƒνƒœ λ³€ν™”κ°€ λΉˆλ²ˆν•œ λŒ€ν™”ν˜• UI와 μ‹€μ‹œκ°„ 슀트리밍(SSE) 기반의 λ©”μ‹œμ§€ μ—…λ°μ΄νŠΈμ— μ΅œμ ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

TypeScript 선택 이유

Proovy의 도메인 λͺ¨λΈμ€ μ±„νŒ… λ©”μ‹œμ§€, μˆ˜μ‹ 메타데이터, API 응닡 λ“±μœΌλ‘œ ꡬ쑰가 λ³΅μž‘ν•©λ‹ˆλ‹€.

  • νƒ€μž… μ•ˆμ •μ„±μœΌλ‘œ λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό 사전에 λ°©μ§€ν•˜κ³ , νŒ€ ν˜‘μ—… μ‹œ νƒ€μž…μ΄ 자체 λ¬Έμ„œ μ—­ν•  μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • IDE μžλ™μ™„μ„± μ§€μ›μœΌλ‘œ 개발 생산성이 ν–₯μƒλ©λ‹ˆλ‹€.

Styling

  • TailwindCSS v4

TailwindCSS 선택 이유

  • λ””μžμΈ 토큰을 μœ ν‹Έλ¦¬ν‹° 클래슀둜 κ΄€λ¦¬ν•˜μ—¬ UI 일관성 μœ μ§€κ°€ μš©μ΄ν•©λ‹ˆλ‹€.
  • λΉ λ₯Έ UI ν”„λ‘œν† νƒ€μ΄ν•‘μ΄ κ°€λŠ₯ν•˜μ—¬ MVP 개발 속도λ₯Ό 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
  • Prettier ν”ŒλŸ¬κ·ΈμΈκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ μŠ€νƒ€μΌ μ½”λ“œ μ •λ ¬ μžλ™ν™”κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

Package / Tooling

  • pnpm
  • Prettier
  • ESLint

pnpm 선택 이유

  • λͺ¨λ…Έλ ˆν¬ 및 λŒ€κ·œλͺ¨ μ˜μ‘΄μ„± ν™˜κ²½μ—μ„œ λ””μŠ€ν¬ μ‚¬μš©λŸ‰κ³Ό μ„€μΉ˜ 속도가 νš¨μœ¨μ μž…λ‹ˆλ‹€.
  • lockfile 기반으둜 νŒ€μ› κ°„ μ™„μ „νžˆ λ™μΌν•œ μ˜μ‘΄μ„± ν™˜κ²½μ„ 보μž₯ν•©λ‹ˆλ‹€.

Prettier / ESLint 선택 이유

  • μ½”λ“œ μŠ€νƒ€μΌ λ…ΌμŸμ„ μ œκ±°ν•˜κ³ , 리뷰 포인트λ₯Ό λ‘œμ§μ—λ§Œ μ§‘μ€‘ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.
  • 컀밋 μ „ ν¬λ§·νŒ…μ„ κ°•μ œν•˜μ—¬ μ½”λ“œ ν’ˆμ§ˆμ„ 일정 μˆ˜μ€€ μ΄μƒμœΌλ‘œ μœ μ§€ν•©λ‹ˆλ‹€.

μ£Όμš” μ˜μ‘΄μ„± 및 라이브러리

μƒνƒœ 관리

  • @tanstack/react-query: μ„œλ²„ μƒνƒœ 관리 및 캐싱
  • zustand: ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ 관리 (κ°„κ²°ν•˜κ³  κ°€λ²Όμš΄ ꡬ쑰)

μˆ˜μ‹ μž…λ ₯ 및 λ Œλ”λ§

  • mathlive: μˆ˜ν•™ μˆ˜μ‹ μž…λ ₯ μ»΄ν¬λ„ŒνŠΈ
  • katex: LaTeX 기반 μˆ˜μ‹ λ Œλ”λ§
  • remark-math, rehype-katex: markdown λ‚΄ μˆ˜μ‹ 지원

PDF 및 λ¬Έμ„œ λ·°μ–΄

  • pdfjs-dist: PDF λ Œλ”λ§ 및 λ·°μ–΄
  • react-markdown: markdown λ§ˆν¬μ—… λ Œλ”λ§

μΊ”λ²„μŠ€ / λ“œλ‘œμž‰

  • tldraw: ν™”μ΄νŠΈλ³΄λ“œ 및 λ“œλ‘œμž‰ κΈ°λŠ₯

API 및 HTTP

  • axios: HTTP ν΄λΌμ΄μ–ΈνŠΈ
  • msw: Mock Service Worker (개발 ν™˜κ²½μ—μ„œ API λͺ¨ν‚Ή)

UI μ»΄ν¬λ„ŒνŠΈ

  • lucide-react: μ•„μ΄μ½˜ 라이브러리
  • clsx, tailwind-merge: CSS 클래슀 μœ ν‹Έλ¦¬ν‹°

λΌμš°νŒ…

  • react-router-dom: ν΄λΌμ΄μ–ΈνŠΈ λΌμš°νŒ…

2️⃣ λΉŒλ“œ 및 개발 슀크립트

μ‚¬μš© κ°€λŠ₯ν•œ 슀크립트

# 개발 μ„œλ²„ μ‹€ν–‰ (<http://localhost:5173>)
pnpm run dev

# ν”„λ‘œλ•μ…˜ λΉŒλ“œ
pnpm run build

# ESLint 검사
pnpm run lint

# Prettier μ½”λ“œ ν¬λ§€νŒ…
pnpm run format

# λΉŒλ“œλœ κ²°κ³Ό 미리보기
pnpm run preview

Path Alias μ‚¬μš©

Vite μ„€μ •μ—μ„œ @ 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";

3️⃣ 초기 개발 ν™˜κ²½ μ„€μ • (New Developer Setup)

1단계: μ €μž₯μ†Œ 클둠 및 μ˜μ‘΄μ„± μ„€μΉ˜

# μ €μž₯μ†Œ 클둠
git clone <https://github.com/Team-Proovy/Proovy-front.git>
cd Proovy-front

# μ˜μ‘΄μ„± μ„€μΉ˜ (pnpm ν•„μš”)
pnpm install

# pnpm이 μ—†λ‹€λ©΄ μ„€μΉ˜
npm install -g pnpm

2단계: ν™˜κ²½ λ³€μˆ˜ μ„€μ •

# .env 파일 생성
cp .env.example .env  # (λ˜λŠ” μˆ˜λ™μœΌλ‘œ .env 생성)

# .env νŒŒμΌμ— λ‹€μŒ λ‚΄μš© μΆ”κ°€
echo "VITE_API_BASE_URL=http://localhost:3000" >> .env
echo "VITE_ENV=development" >> .env

3단계: IDE μ„€μ • (VS Code)

ꢌμž₯ ν™•μž₯ν”„λ‘œκ·Έλž¨:

  • 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 μžλ™ μˆ˜μ • ν™œμ„±ν™”

4단계: 개발 μ„œλ²„ μ‹€ν–‰

# 개발 μ„œλ²„ μ‹œμž‘
pnpm run dev

# λΈŒλΌμš°μ €μ—μ„œ <http://localhost:5173> 접속

검증

# νƒ€μž… 검사
pnpm run build

# 린트 검사
pnpm run lint

# μ½”λ“œ ν¬λ§€νŒ…
pnpm run format

4️⃣ ν”„λ‘œμ νŠΈ 폴더 ꡬ쑰 (Feature-based Structure)

src/
β”œβ”€β”€ 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                  # μ•± μ§„μž…μ 

5️⃣ Git Workflow & Convention

Branch Strategy

  • main: μ‹€μ œ 배포용
  • dev: 개발 톡합 브랜치
  • feat/*: κΈ°λŠ₯ 개발 브랜치
    • κΈ°λŠ₯ κ΅¬ν˜„μš© 브랜치
    • λ°˜λ“œμ‹œ devμ—μ„œ λΆ„κΈ°ν•˜κ³  dev둜 λ¨Έμ§€

이슈 μ’…λ₯˜

  • [Feature]: μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
  • [Bug]: 버그 λ°œμƒ
  • [Fix]: 버그 μˆ˜μ •
  • [Refactor]: μ½”λ“œ ꡬ쑰 κ°œμ„ 
  • [Documentation]: λ¬Έμ„œ μž‘μ„±/μˆ˜μ •
  • [Chore]: ν”„λ‘œμ νŠΈ μ„€μ • 및 기타 μž‘μ—…
  • [Enhancement]: κΈ°λŠ₯ κ°œμ„  μš”μ²­
    1. Issue λ°œν–‰
      • 이슈 ν•˜λ‚˜(브랜치 ν•˜λ‚˜)μ—μ„œ ν•˜λ‚˜μ˜ κΈ°λŠ₯만 개발
      • Issue ν…œν”Œλ¦Ώ (.github/ISSUE_TEMPLATE/feature-request.md) μ‚¬μš©
      • 이슈 제λͺ© ν˜•μ‹: [이슈 μ’…λ₯˜(λŒ€λ¬Έμžλ‘œ μ‹œμž‘)] 이슈_제λͺ©
        • 예: [Feat] example API κ΅¬ν˜„
        • 예: [Fix] dev 브랜치 좩돌 ν•΄κ²°
      • Assignees / Labels μ„€μ •
    2. 둜컬 μ΅œμ‹ ν™”
      • git fetch
      • git pull

브랜치 넀이밍 κ·œμΉ™

  • κΈ°λ³Έ κ·œμΉ™: feat/이슈번호-κΈ°λŠ₯λͺ…
  • μ‹€μ œ μ‚¬μš© νŒ¨ν„΄(이슈 라벨 반영): issue_label/issue_number-detail
    • 예: feat/12-init-project
    • 예: fix/3-add-login
    • 예: refactor/22-cart-page

Commit Message Convention

  • 컀밋 전에 프리티어 μ μš©ν•˜κΈ° β†’ pnpm run format
    • .prettierc
  • 컀밋 μž‘μ„± μ‹œ Body에 컀밋 κ΄€λ ¨ μ„€λͺ…을 μžμ„Έν•˜κ²Œ 적기
  • 컀밋 λ©”μ‹œμ§€: μ΄μŠˆμ’…λ₯˜: β€œμ»€λ°‹ κ΄€λ ¨ μ„€λͺ…” (#이슈번호)
μ˜ˆμ‹œ)
feat: 둜그인 κ΅¬ν˜„ (#9)
fix: μΉ΄λ“œ νŽ˜μ΄μ§€ μˆ˜μ • (#10)
refactor: μ•„μ΄μ½˜ λ¦¬νŒ©ν† λ§ (#13)

Pull Request Convention

  • PR 제λͺ© κ·œμΉ™: νƒ€μž…(#이슈번호): prλ‚΄μš©
μ˜ˆμ‹œ)
Feat(#9): 둜그인 κ΅¬ν˜„
Fix(#10): μΉ΄λ“œ νŽ˜μ΄μ§€ μˆ˜μ •
Refactor(#13): μ•„μ΄μ½˜ λ¦¬νŒ©ν† λ§
  • PR은 λŒ€μΆ© μ“°μ§€ 말고 νŒ€μ›μ΄ λ¦¬λ·°ν•˜κΈ° 쉽도둝 예쁘고 μžμ„Έν•˜κ²Œ μž‘μ„±ν•˜κΈ°
  • ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό μŠ€ν¬λ¦°μƒ·μœΌλ‘œ PR에 ν¬ν•¨ν•˜κΈ° (λ¨Έμ§€ 이전에 개인적으둜 ν…ŒμŠ€νŠΈλ₯Ό κΌ­ ν•˜κΈ°)
  • Pull Request μž‘μ„±
    • PR ν…œν”Œλ¦Ώ μ‚¬μš© β†’ .github/PULL_REQUEST_TEMPLATE.md
  • dev 브랜치둜의 λ¨Έμ§€λŠ” 2λͺ… μ΄μƒμ˜ Approveκ°€ ν•„μš”ν•˜λ‹€.

6️⃣ Code Convention

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() (λ„ˆλ¬΄ ν¬κ΄„μ μž„)

7️⃣ 개발 μ „ ν•„μˆ˜ 체크리슀트

κΈ°λŠ₯ 개발 μ‹œμž‘

  • 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 제λͺ©: νƒ€μž…(#이슈번호): μ„€λͺ… ν˜•μ‹ μ€€μˆ˜
  • 체크리슀트: PR ν…œν”Œλ¦Ώμ˜ λͺ¨λ“  ν•­λͺ© 체크
  • 리뷰 μš”μ²­: μ΅œμ†Œ 2λͺ… μ΄μƒμ˜ 리뷰어 μ§€μ •
  • Approve 확보: 2λͺ… 이상 Approve ν›„ λ¨Έμ§€

πŸ”§ Troubleshooting

개발 쀑 λ°œμƒν•œ λ¬Έμ œμ™€ ν•΄κ²° 방법은 μ•„λž˜ 링크λ₯Ό μ°Έκ³ ν•˜μ„Έμš”:

πŸ‘‰ Proovy FE νŠΈλŸ¬λΈ”μŠˆνŒ…

μ£Όμš” λ‚΄μš©:

  • ν™˜κ²½ μ„€μ • 였λ₯˜
  • μ˜μ‘΄μ„± μ„€μΉ˜ 문제
  • 개발 μ„œλ²„ μ‹€ν–‰ 였λ₯˜
  • νƒ€μž…/린트 였λ₯˜ ν•΄κ²°
  • API 연동 κ΄€λ ¨ 문제

About

Proovy FE repo

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors