## 역할
시스템 전체의 핵심 인프라 계층. DB 접근, 인증, 세션, 암호화, 상수, 유틸리티를 제공한다. 기존 Java 기반 PMS 시스템의 공통 모듈을 Node.js로 포팅한 것으로, 모든 API 라우트와 페이지에서 의존한다.

## 주요 파일
- **db.ts** — PostgreSQL 연결 풀(pg Pool). `queryRows`, `queryOne`, `execute` 3가지 헬퍼 제공. 모든 DB 접근의 단일 진입점.
- **auth.ts** — 자격 증명 검증(`verifyCredentials`). USER_INFO + AUTHORITY_MASTER 조인 후 User 객체 생성. 로그인 이력 기록.
- **session.ts** — JWT 기반 세션(jose). `createSession`(쿠키 설정, 24시간), `getSession`(검증), `destroySession`(삭제).
- **encrypt.ts** — AES-128-ECB 암호화/복호화. 사용자 비밀번호 검증에 사용.
- **constants.ts** — 전역 상수: 마스터 비밀번호, AES 키, 페이징, 파일 문서 타입, 공통코드 ID, 메뉴 아이콘 매핑.
- **utils.ts** — 범용 헬퍼: `checkNull`, `isEmpty`, `setPagingInfo`, `numberWithCommas`, `createObjectId`, `getDate` 등.
- **menu-url-map.ts** — `.do` URL → Next.js 라우트 변환 매핑 테이블.

## 연결 고리
- **auth.ts → db.ts**: verifyCredentials에서 queryOne 호출. DB 스키마 변경 시 SQL 동시 수정 필수.
- **auth.ts → encrypt.ts**: 사용자 입력 비밀번호를 AES 암호화 후 DB 값과 비교.
- **auth.ts → constants.ts**: MASTER_PWD, SUPER_ADMIN 상수 참조.
- **encrypt.ts → constants.ts**: AES_KEY 의존. 키 변경 시 기존 데이터 복호화 불가.
- **middleware.ts ↔ session.ts**: 세션 쿠키명 `plm-session`이 middleware.ts에 하드코딩. session.ts의 SESSION_COOKIE 값과 반드시 일치해야 함.

## 단일 진입점
- **모든 DB 쿼리** → db.ts의 queryRows/queryOne/execute
- **사용자 인증** → auth.ts의 verifyCredentials
- **세션 생성/조회/삭제** → session.ts의 createSession/getSession/destroySession
- **AES 암호화** → encrypt.ts의 encrypt/decrypt

## 등록 절차
- 새 공통코드 추가 → constants.ts의 `CODE_IDS`에 항목 추가
- 새 파일 문서 타입 추가 → constants.ts의 `FILE_DOC_TYPES`에 등록
- 메뉴 URL 매핑 추가 → menu-url-map.ts의 `URL_MAP`에 키-값 쌍 추가

## 절대 금지
- **AES_KEY 변경 금지** — 기존 암호화된 비밀번호 데이터 모두 복호화 불가능
- **SESSION_COOKIE 이름 단독 변경 금지** — middleware.ts의 하드코딩 값과 불일치 발생. 둘 다 동시에 변경 필수
- **SUPER_ADMIN 값 변경 금지** — `"plm_admin"` 사용자만 관리자로 인식
- **checkNull의 문자열 "null"/"undefined" 처리 제거 금지** — 기존 Java 시스템과의 호환성 필수

## 숨겨진 스펙
- `AES_KEY = "ILJIAESSECRETKEY"` (16자) — 기존 Java EncryptUtil과 동일 키
- `MASTER_PWD = "qlalfqjsgh11"` — 이 값으로 로그인 시 DB 비밀번호 검증 스킵
- `SESSION_COOKIE = "plm-session"` — middleware.ts에도 하드코딩
- `NEXTAUTH_SECRET` 미설정 시 기본값 `"fito-plm-default-secret"` 사용
- 세션 유효기간 86400초(24시간)
- User.isAdmin 판정: `userId.toLowerCase() === SUPER_ADMIN`
- SQL alias 주의: 따옴표 없는 alias → PostgreSQL이 소문자로 반환. 대문자 유지하려면 `AS "SABUN"` 형태 필수

@MISTAKES.md
