9531d20b58
Deploy momo-erp / deploy (push) Successful in 49s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
80 lines
3.6 KiB
Markdown
80 lines
3.6 KiB
Markdown
# 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 없음)
|