# CLAUDE.md

## Project Overview

bitForum - Next.js 15 App Router 기반 커뮤니티 프론트엔드 (https://bitforum.io)

- **Framework**: Next.js 15.3+ (App Router, Server Components)
- **React**: 19.1+
- **Language**: TypeScript 5
- **Backend API**: https://localhost:4000 (ASP.NET Core Minimal API)

## Project Structure

```
app/                → Next.js App Router (페이지, 레이아웃, API 라우트)
  ├── (account)/    → 계정 관리 (프로필, 비밀번호 변경 등)
  ├── (auth)/       → 인증 (로그인, 회원가입, 비밀번호 찾기)
  ├── (forum)/      → 게시판 (게시글, 댓글, 글쓰기)
  ├── api/          → Route Handler (백엔드 API 프록시)
  ├── component/    → 공통 레이아웃 컴포넌트 (Layout, PopupModal 등)
  ├── support/      → 고객지원 (FAQ, 공지, 이용안내, 제휴문의)
  ├── news/         → 뉴스
  └── docs/         → 문서 페이지
components/ui/      → shadcn/ui 컴포넌트 (dialog, accordion 등)
contexts/           → React Context Provider (Auth, Member, Config, SignalR)
hooks/              → 커스텀 훅 (useAuth, useDragScroll 등)
lib/
  ├── api/          → 서버 사이드 API 호출 함수 (Server Actions)
  └── utils/
      ├── client.ts → 클라이언트 유틸 (fetchApi, cn, formatDate, throwError)
      └── server.ts → 서버 유틸 (fetchJson, getAccessToken, checkPermission)
types/              → TypeScript 타입 정의 (response/, request/, forum/, account/)
constants/          → 상수 정의
middleware.ts       → 인증 미들웨어 (토큰 검증, 리다이렉트)
```

## Code Style Rules

- 인덴트: 탭 사용
- PK/ID 변수명: `memberID`, `postID` (camelCase + 대문자 ID)
- 클라이언트 컴포넌트: 파일 최상단에 `'use client'` 선언
- 서버 전용 함수: `'use server'` 선언 (Server Actions, lib/utils/server.ts)
- 컴포넌트 파일명: PascalCase (`PopupModal.tsx`, `Layout.tsx`)
- 페이지/라우트: 소문자 kebab-case 디렉토리 (`support/faq/`)
- 스타일: 각 페이지 디렉토리에 `style.scss` 파일
- 파일 내용의 마지막 줄 제거 (빈 줄 없이 끝남)

## Architecture Rules

- **서버 컴포넌트가 기본** — `'use client'` 없으면 RSC
- **클라이언트 상태**: React Context (AuthProvider, MemberProvider, ConfigProvider)
- **API 프록시 패턴**: 클라이언트 → `app/api/[도메인]/[...path]/route.ts` → 백엔드
  - 클라이언트에서 직접 백엔드 호출 안 함 (CORS, 쿠키 처리)
- **서버 데이터 흐름**: Server Component → `fetchJson()` → 백엔드 직접 호출
- **인증**: JWT Bearer 토큰 (accessToken/refreshToken, httpOnly 쿠키)
- **실시간**: SignalR WebSocket (암호화폐 시세, 채팅)

## Code Conventions

### 사용하는 패턴
- `fetchApi<T>()` — 클라이언트에서 Route Handler 호출 (`lib/utils/client.ts`)
- `fetchJson<T>()` — 서버에서 백엔드 직접 호출 (`lib/utils/server.ts`)
- `ResultDto<T>` — 모든 API 응답 래퍼 (`{ success, status, message, data, errors }`)
- `throwError(res)` — 에러 응답 시 예외 발생
- `cn()` — Tailwind 클래스 병합 (clsx + tailwind-merge)
- `dangerouslySetInnerHTML` — 서버에서 받은 HTML 콘텐츠 렌더링
- Route Group — `(auth)`, `(account)`, `(forum)` 으로 관련 페이지 그룹화
- `notFound()` — 데이터 없을 때 404 처리

### 사용하지 않는 패턴 (제안 금지)
- Redux, Zustand (Context + 로컬 상태 사용)
- GraphQL (REST API만 사용)
- 클라이언트에서 백엔드 직접 호출 (반드시 Route Handler 프록시 경유)
- CSS-in-JS (Tailwind + SCSS 사용)
- React Query / SWR (직접 fetch 사용)

## Styling

- **Tailwind CSS** — 기본 스타일링
- **SCSS** — 컴포넌트별 `style.scss`, 글로벌 `globals.scss`
- **CSS Modules** — `common.module.scss` (레이아웃 그리드)
- **shadcn/ui** — new-york 스타일, Radix UI 기반 (`components/ui/`)
- **CSS Variables** — HSL 형식 테마 변수 (`--background`, `--foreground` 등)
- **Font Awesome** — 아이콘 (@fortawesome 패키지)
- **Lucide React** — shadcn/ui 아이콘

## Provider 구조 (Root Layout)

```
SignalRProvider → AuthProvider → MemberProvider → ConfigProvider → {children}
```

- `ConfigProvider`: `initialConfig` prop으로 서버에서 설정 전달 (React.cache)
- `AuthProvider`: 로그인 상태 관리, 토큰 갱신
- `MemberProvider`: 현재 사용자 정보
- `SignalRProvider`: WebSocket 연결 (암호화폐, 채팅)

## API Route Handler 패턴

```typescript
// app/api/{도메인}/[...path]/route.ts
export async function POST(request: NextRequest, { params }: { params: Promise<{ path: string[] }> }) {
    const { path } = await params;
    const endpoint = `/api/${path.join('/')}`;
    const res: ResultDto = await fetchJson(endpoint, {
        method: 'POST',
        body: await request.arrayBuffer(),
        headers: { 'Content-Type': request.headers.get('content-type') || '' }
    });
    return NextResponse.json(res);
}
```

## Build & Run

```bash
# 개발 서버 (HTTPS, 포트 3000)
npm run dev

# 프로덕션 빌드
npm run build

# 프로덕션 실행
npm run start

# 린트
npm run lint
```

## 사용 Domain

- https://bitforum.io → 사용자 프론트엔드
- https://api.bitforum.io → 백엔드 API
- https://admin.bitforum.io → 관리자 패널
