개발자 온보딩
너홀로프로에 처음 합류하시는 분을 위한 30분 셋업 가이드입니다. 설치 → 로컬 실행 → 코드 탐색 → 핵심 규칙 파악까지 한 번에.
1. 사전 준비
| 도구 | 버전 | 비고 |
|---|---|---|
| Node.js | ≥ 20 LTS | nvm use 권장 |
| pnpm | 10.33.0 | corepack enable 로 자동 고정 (루트 package.json#packageManager) |
| Firebase CLI | 최신 | npm i -g firebase-tools — Cloud Functions 배포·에뮬레이터용 |
| gh | 최신 | GitHub CLI — PR 생성 |
corepack enable 만 실행해두면 리포지토리 진입 시 자동으로 pnpm 10.33.0 을 사용합니다. 개별 npm i -g pnpm 불필요.
2. 저장소 클론 + 의존성 설치
gh repo clone hwondev/neohollo-pro
cd neohollo-pro
pnpm install
pnpm install 은 루트 workspace 를 통해 apps/web · apps/ops · apps/docs · packages/* 의존성을 한 번에 설치합니다. functions/ 는 별도 npm workspace 이므로 Cloud Functions 작업 시에만 별개 설치:
cd functions && npm install
3. 환경변수 설정
apps/web 만 환경변수가 필요합니다 (apps/ops 는 client SDK 만, apps/docs 는 없음).
cp apps/web/.env.example apps/web/.env.local
Firebase 콘솔 · Vertex AI · Resend 등 각 값의 발급처·용도는 환경변수 가이드 참조. 개발 중엔 Firebase 에뮬레이터를 써서 실 프로젝트 건드리지 않기 를 기본으로.
4. 로컬 실행
# 전체 앱 동시 실행 (포트 3000, 3001, 3002)
pnpm dev
# 개별 앱만
pnpm dev --filter=@neohollo/web # 포트 3000
pnpm dev --filter=@neohollo/ops # 포트 3001 (운영팀 콘솔)
pnpm dev --filter=@neohollo/docs # 포트 3002 (본 사이트)
| 주소 | 역할 |
|---|---|
| http://localhost:3000 | 메인 서비스 — 변호사 대시보드 + 의뢰인 포털 |
| http://localhost:3001 | Master Admin 콘솔 (masterAdmins 화이트리스트 필요) |
| http://localhost:3002 | 본 Docusaurus 문서 사이트 |
apps/ops 로그인 시 본인 이메일을 Firestore masterAdmins/{email} 에 먼저 등록해야 접근됩니다 (기술 아키텍처 > masterAdmins 컬렉션).
5. 코드 탐색 — 어디에 뭐가 있나
neohollo-pro/
├── apps/
│ ├── web/ ← 메인 서비스 (대부분의 작업은 여기)
│ │ ├── app/
│ │ │ ├── (auth)/ 로그인·회원가입
│ │ │ ├── (setup)/ 온보딩 마법사
│ │ │ ├── (workspace)/ 변호사 대시보드 (owner/staff)
│ │ │ └── (portal)/ 의뢰인 포털 (4자리 접속 코드)
│ │ ├── lib/ 재사용 모듈 (firebase, ai, notifications …)
│ │ └── __tests__/ Vitest
│ ├── ops/ ← 운영팀 콘솔 (별도 앱)
│ └── docs/ ← 이 사이트
├── packages/
│ ├── types/ ← 공유 타입 (UserPlan, ServerSession 등)
│ └── ui/ ← 공유 UI 유틸 (cn 등)
└── functions/ ← Cloud Functions (별도 npm workspace)
apps/web ↔ apps/ops ↔ apps/docs 는 서로 참조할 수 없습니다. 각 앱은 독립 배포 단위. 공유가 필요하면 packages/ 로 승격하거나 각 앱에 복제하세요. ESLint 가 강제합니다.
6. 핵심 명령어
pnpm dev # 전체 dev 서버
pnpm build # 프로덕션 빌드
pnpm lint # ESLint
pnpm type-check # TypeScript 검증 (next build 보다 엄격)
pnpm test # Vitest (web + docs)
pnpm e2e # Playwright E2E (web 빌드 후)
pnpm storybook # Storybook (포트 6006)
로컬에서 최소 pnpm type-check + pnpm lint + 변경 영역 pnpm test 돌리고 푸시합니다. type-check 는 next build 보다 엄격하므로 Zod 4 · ActionResult discriminated union 등 타입 실수를 먼저 걸러줍니다.
7. 처음 읽어볼 것
작업 시작 전 다음 4개를 30분 안에 훑어보세요:
CLAUDE.md— 앱 구조·의존 규칙·코딩 규칙·금지사항. 위반 시pnpm lint실패. 앱 메타데이터 4곳 + Firestore 동기화 규약도 여기 참조.- AI 파이프라인 — 새 AI 기능 추가할 때 필수. (A) 자동 갱신형 vs (B) 사용자 트리거형 구분.
- 데이터 모델 — Firestore 컬렉션 구조, 경로 기반 멀티테넌시.
8. 첫 PR 체크리스트
- feature 브랜치 (
feat/·fix/·refactor/·docs/·chore/) —main직접 push 금지 - Conventional Commits (
feat:·fix:· ...) - 작업 단위별 PR 분리 — 한 PR 에 섞지 말기
-
pnpm type-check+pnpm lint통과 - UI 수정 시 Storybook · E2E 동기화
- CLAUDE.md / docs 규칙 위반 없음 (리뷰어가 확인)
9. 막히면
- Firebase 에뮬레이터 이상:
firebase emulators:start포트 충돌 확인,.firebaserc프로젝트 매핑 확인 - Custom Claims 반영 안 됨: 브라우저 강제 로그아웃 → 재로그인으로 토큰 갱신
- Firestore Rules 차단: 에뮬레이터 Rules 탭에서 쿼리 로그 확인
- CSP 위반:
apps/web/lib/security/csp-headers.ts의getCspDirectives()에만 추가. 테스트는apps/web/__tests__/next-config-headers.test.ts.
그래도 해결 안 되면 팀 채널에 파일 경로 + 증상 + 시도한 것 3줄로 공유.