This commit introduces a new HTML document detailing the functionality of the PDF 도면 to 외벽선 자동작성 feature, including styles and layout for improved presentation.
Q.CAST Front
Q.CELLS 일본 시장 대상 태양광 패널 레이아웃 설계 · 견적 · 관리 프론트엔드. Next.js 14 App Router 기반.
자세한 작업 규약 · 비명시적 패턴 · gotcha 는 CLAUDE.md 와 docs/ PDF 들을 참조한다.
Stack
- Framework: Next.js 14.2.28 (App Router,
reactStrictMode: false) - Language: JavaScript + TypeScript (
allowJs: true,strict: false) - Canvas: Fabric.js 5.5.2 (커스텀 확장 —
src/components/fabric/,src/util/fabric-extensions.js) - State: Recoil 0.7.7 (도메인별 atom —
src/store/) - Session/Auth: iron-session 8 (쿠키 기반)
- Data fetching: axios 1.7 + SWR 2.3
- i18n: next-international (ja / ko —
src/locales/) - UI: react-responsive-modal, react-select, react-datepicker, ag-grid-react, sweetalert2, react-icons, framer-motion, tailwindcss + sass
- PDF/이미지: jimp, sharp, convertapi
- DB 클라이언트: mssql (서버 사이드), sqlite/sqlite3 (로컬 캐시)
- AWS:
@aws-sdk/client-s3 - Geo:
@turf/turf, mathjs, big.js - Path alias:
@/* → ./src/*
Getting Started
yarn install
yarn dev # .env.localhost 사용, http://localhost:3000
.env.localhost 가 워크트리에 있어야 한다(실제 시크릿 포함). 새 머신에서는 팀에서 받아 배치할 것.
HTTPS 가 필요하면 ./certificates/key.pem, cert.pem 을 준비한 뒤 yarn serve (HTTP 3000 + HTTPS 3001).
Scripts
모든 스크립트는 env-cmd 로 .env.<mode> 를 주입한다. 테스트 러너는 별도로 wiring 되어 있지 않다.
| Script | 설명 |
|---|---|
yarn dev |
로컬 개발 (.env.localhost) |
yarn dev:log |
dev + stdout 을 dev.log 로 미러링 |
yarn dev:local-api |
API 를 http://localhost:8080 으로 고정 |
yarn local:dev |
.env.local.dev 모드 (로컬에서 dev 서버 환경 흉내) |
yarn build |
프로덕션 빌드 (.env.production) |
yarn build:dev |
dev 빌드 (.env.development) |
yarn build:local.dev |
local.dev 빌드 |
yarn start:cluster1 |
next start -p 5000 (PM2 prd1) |
yarn start:cluster2 |
next start -p 5001 (PM2 prd2) |
yarn start:dev |
next start -p 5010 (PM2 dev) |
yarn serve |
server.js — HTTP 3000 + HTTPS 3001 (certificates 필요) |
yarn lint |
next lint — 완료 전 필수 |
Environment Variables
각 모드별 .env.<mode> 파일에 정의. 키 목록(전체 값은 절대 공개 채널에 노출 금지):
| Key | 용도 |
|---|---|
NEXT_PUBLIC_RUN_MODE |
src/config/config.export.js 가 어떤 config 를 로드할지 결정 (local / local.dev / development / production) |
NEXT_PUBLIC_API_SERVER_PATH |
백엔드 API base URL |
NEXT_PUBLIC_HOST_URL |
프론트엔드 호스트 (자기 자신) |
NEXT_PUBLIC_API_HOST_URL |
API 호스트 |
SESSION_SECRET |
iron-session 쿠키 서명 키 — 32 byte 이상 필수 |
NEXT_PUBLIC_CONVERTER_DWG_API_URL |
DWG → SVG 변환 서비스 |
NEXT_PUBLIC_CONVERTER_DXF_API_URL |
DXF → SVG 변환 서비스 |
NEXT_PUBLIC_Q_ORDER_AUTO_LOGIN_URL |
Q-Order autoLogin 진입점 |
NEXT_PUBLIC_Q_MUSUBI_AUTO_LOGIN_URL |
Q-Musubi autoLogin 진입점 |
NEXT_PUBLIC_AWS_S3_BASE_URL |
S3 정적 자산 base URL |
NEXT_PUBLIC_ENABLE_LOGGING |
true 일 때만 src/util/logger.js 와 debugCapture.js 가 실제로 출력 |
AWS_REGION, AMPLIFY_BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, S3_PROFILE |
S3 업로드 (서버 전용 — .env.localhost 등에만) |
.env.* 자체는 git 추적 대상이고 시크릿을 포함한다. 머신별 오버라이드는 .env.*.local (gitignore 됨) 에 둘 것.
Routes (App Router)
src/app/
api/ # Next.js Route Handlers (S3, debug, 이미지 등)
community/ # 커뮤니티
floor-plan/ # 도면 캔버스 — 본 앱의 핵심
estimate/ # 견적 화면
simulator/ # 시뮬레이터
page.jsx # 도면 에디터 진입점
join/ # 회원가입
login/ # 로그인
management/ # 관리자
image/ # 이미지 관리
stuff/ # 자재/제품 관리
layout.js # 루트 레이아웃 — 세션 체크 후 비로그인 시 /login 으로 리다이렉트
page.js # 홈
세션이 없는 상태로 /login 외 경로 접근 시 루트 레이아웃이 강제 리다이렉트한다. src/middleware.js 는 x-pathname 헤더를 주입해 루트 레이아웃이 현재 경로에 따라 분기할 수 있게 한다.
Source Layout
src/
app/ # App Router 라우트 + 글로벌 Provider 들
common/ # 공용 유틸 / 모듈
components/ # 도메인별 UI 컴포넌트
fabric/ # QLine, QPolygon — Fabric.js 확장 클래스
floor-plan/ # 캔버스 툴 모달 (roofShape, placementShape, panelBatch …)
estimate/, management/, simulator/, ui/, …
config/ # 모드별 런타임 config (config.export.js 가 분기)
hooks/ # 도메인별 hook (roofcover, surface, module, object, option …)
lib/ # 세션, 캔버스 저장/복원, 파일/이미지 액션
locales/ # ja.json, ko.json
middleware.js # x-pathname 주입
models/ # 도메인 모델
store/ # Recoil atom (canvas, roof, estimate, modal, menu, setting …)
styles/ # sass entry (includePaths)
util/ # logger, debugCapture, fabric-extensions, canvas-util …
Deployment (PM2)
*.ecosystem.config.js + startscript*.js 조합으로 실행. startscript 가 child_process.exec 로 yarn 스크립트를 호출한다.
| File | 용도 | Port |
|---|---|---|
ecosystem.config.js |
프로덕션 클러스터 (instances: 2) | — |
prd1.ecosystem.config.js |
프로덕션 #1 (fork) | 5000 |
prd2.ecosystem.config.js |
프로덕션 #2 (fork) | 5001 |
dev.ecosystem.config.js |
dev 서버 | 5010 |
dev.local.ecosystem.config.js |
local.dev 모드 dev 서버 | — |
Conventions
상세 사항은 CLAUDE.md 와 docs/Qcast coding convention.pdf, docs/Qcast development guilde.pdf 참조. 핵심만 옮기면:
- Prettier: single quote, no semicolons, tabWidth 2, printWidth 150, trailingComma
all. 완료 전yarn lint. - No raw
alert()—useSwal/useMessage+sweetalert2만 사용.docs/메세지 처리 가이드.pdf. - Path alias
@/...우선,../../..체인 지양. - 로깅 —
console.log직접 사용 금지.src/util/logger.js사용 (NEXT_PUBLIC_ENABLE_LOGGING=true일 때만 출력). - Commit message —
.gitmessage.txt형식 ([일감번호] : [제목]) 또는 최근 브랜치 스타일[2204] <제목> — <상세>. Prefix 만 영문, 본문은 한국어. - i18n — UI 텍스트는
src/locales/{ja,ko}.json에 키 추가 후useI18n으로 접근.
Documentation
| File | 내용 |
|---|---|
CLAUDE.md |
에이전트(Claude / Codex) 작업 규약 + 비명시적 패턴 · gotcha |
docs/Canvas Status.md |
캔버스 기능 상태 · 타겟별 컨텍스트 메뉴 인벤토리 |
docs/Qcast coding convention.pdf |
전체 코딩 컨벤션 |
docs/Qcast development guilde.pdf |
개발 가이드 |
docs/메세지 처리 가이드.pdf |
모달 / 알럿 메시지 규칙 |
docs/git commit message Convention.pdf |
커밋 메시지 컨벤션 |
docs/Nextjs 14 컴포넌트에 대해서….pdf |
App Router 서버/클라이언트 컴포넌트 노트 |
docs/dictionary.txt |
도메인 용어집 (지붕 / 패널 용어 JP/KR) |
docs/diagrams/ |
아키텍처 다이어그램 |
.agents/skills/{next-best-practices,vercel-react-best-practices}/ |
Next/React 패턴 결정 시 우선 참조 (총 95개 룰 .md) |
Troubleshooting
- 빌드 시
Module not found: fs/canvas—next.config.mjs의 webpack externals 에 추가. node-only deps 는 클라이언트 번들에서 제외해야 한다. - 세션이 즉시 풀림 —
SESSION_SECRET이 32 byte 미만이면 iron-session 이 거부한다..env.<mode>확인. - 플랜 로드 시
InvalidStateError—src/lib/canvas.js/src/util/canvas-util.js의 3-layer guard (entry/cache/save) 와SizeSetting의 0-area guard 로 차단된다. 가드 약화 금지 — 손상된 플랜은 정상 데이터로 교체할 것. - App Router 캐시로 인한 stale plan/estimate —
next.config.mjs의experimental.staleTimes가 의도적으로 모두0. 다시 켜지 말 것. - HTTPS dev 실패 —
./certificates/key.pem,cert.pem부재. gitignore 대상이라 팀에서 받아 배치해야 한다. - dev 서버에서만 한글/일본어 폰트 깨짐 —
next/font캐시 문제일 가능성..next/삭제 후 재시작.