# FITO — (주)피토 PLM (Next.js 풀스택)

> **아키텍처**: 프론트엔드 = **React** (Next.js 15 App Router 기반), 백엔드 = **Node.js** (Next.js API Routes). 단일 Next.js 프로젝트 안에 React 프론트와 Node 백엔드가 함께 있는 풀스택 구조.

기존 Java/Spring MVC + JSP + MyBatis 기반 FITO 시스템을 Next.js 15 + Node.js로 1:1 컨버전한 제조/PLM 시스템.

> **프로젝트 히스토리**: `woosung-nextjs`에서 피벗. 이전 상태는 태그 `woosung-v1-snapshot`에 보존. 우성 도메인 코드(api/*, app/(main)/*)는 점진적으로 FITO로 교체 중.

---

## 디렉토리별 CLAUDE.md

| 디렉토리 | 내용 |
|---------|------|
| [src/lib/](src/lib/CLAUDE.md) | 핵심 인프라: DB, 인증, 세션, 암호화, 상수 |
| [src/store/](src/store/CLAUDE.md) | Zustand 전역 상태 (auth, menu, theme) |
| [src/types/](src/types/CLAUDE.md) | TypeScript 중앙 타입 정의 |
| [src/components/](src/components/CLAUDE.md) | UI/레이아웃/그리드 공통 컴포넌트 |
| [src/app/api/](src/app/api/CLAUDE.md) | API 라우트 |
| [src/app/(main)/](src/app/(main)/CLAUDE.md) | 업무 페이지 (인증 필수) |
| [src/app/(auth)/](src/app/(auth)/CLAUDE.md) | 로그인 페이지 |
| [src/app/admin-panel/](src/app/admin-panel/CLAUDE.md) | 관리자 패널 (팝업) |

---

## 기술 스택
- **Frontend**: Next.js 15 (App Router), React 19, TypeScript, Tailwind CSS
- **Backend**: Next.js API Routes (Node.js)
- **Database**: PostgreSQL (외부 공용 서버 `121.156.99.3:5432/distribution`, raw SQL via `pg`)
- **인증**: JWT (jose) + Cookie 기반 세션
- **상태관리**: Zustand
- **UI**: SweetAlert2, Lucide Icons, Custom DataGrid (TanStack React Table)

## 원본 프로젝트 매핑
원본 FITO 위치: `/Users/jhj/FITO/` (Java 7 + Spring 3.2.4 + MyBatis 3.2.3 + JSP + Tomcat 7)

- `src/app/api/` → Java Controller (`*.do` 엔드포인트, `com.pms.controller.*`)
- `src/app/(main)/` → JSP 페이지 (`/WebContent/WEB-INF/view/`)
- `src/lib/db.ts` → MyBatis SqlSession (queryRows = selectList, queryOne = selectOne)
- `src/lib/auth.ts` → LoginService
- `src/lib/session.ts` → SessionManager + PersonBean
- `src/lib/encrypt.ts` → EncryptUtil (AES)
- `src/lib/constants.ts` → Constants.java
- `src/lib/utils.ts` → CommonUtils.java

## DB 쿼리 패턴
기존 MyBatis XML mapper의 SQL을 `queryRows`/`queryOne`/`execute`로 직접 실행.
파라미터는 `$1`, `$2` 형태의 PostgreSQL prepared statement 사용.

**FITO mapper 위치**: `/Users/jhj/FITO/src/com/pms/mapper/` (77개 XML)

## 새 모듈 추가 시
1. `src/app/api/[module]/route.ts` — API 라우트 (기존 Controller 대응)
2. `src/app/(main)/[module]/page.tsx` — 페이지 (기존 JSP 대응)
3. FITO MyBatis XML에서 SQL 복사하여 raw query로 변환
4. `SearchForm` + `DataGrid` 컴포넌트 조합으로 목록 페이지 구성

## 미들웨어 (인증)
`src/middleware.ts`가 모든 요청을 가로채서 `plm-session` 쿠키 존재 여부 확인.
- 공개 경로: `/login`, `/api/auth/login`, `/_next`, `/favicon.ico`
- 세션 없는 일반 요청 → `/login`으로 리다이렉트
- 세션 없는 API 요청 → 401 JSON 응답

## 실행
```bash
npm run dev   # 개발 서버 (localhost:3000)
```

## 환경변수

- `.env.development` — 로컬 개발용 (외부 FITO DB 접속)
- `.env.development.example` — 팀 공유 템플릿 (비밀번호 마스킹)
- `.env` — Prisma CLI용 기본값

## 배포 표준 (예정)

- Docker Compose dev/prod 분리
- Traefik 리버스 프록시 + `fito.wace.me` 서브도메인
- DB는 외부 `121.156.99.3:5432/distribution` 공유 (컨테이너 내부 DB 없음)
