# 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 (외부 공용 서버 `211.115.91.141:11140/fito`, 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는 외부 `211.115.91.141:11140/fito` 공유 (컨테이너 내부 DB 없음)