기능 요구 사항
+기본 프로세스 상에서 특정 버튼 클릭으로 사용자가 PDF 문서를 업로드한다.
Gemini API 로 해당 문서의 내용 중 평면도를 분석한다.
분석 내용을 응답으로 전달받고 현재 프로세스(캔버스)로 전달한다.
분석이 성공적으로 마무리되면 업로드한 파일은 폐기 처리한다.
결정사항
+lucid-shaw-91e51f 에서 진행/api/gemini/floor-plangemini-3.1-pro-previewmm전체 흐름
+∗ 클라이언트는 서버 라우트만 호출하며 Gemini API 키와 직접 통신하지 않는다.
+핵심 파일 (수정 / 신규)
+GEMINI_API_KEY, GEMINI_MODEL 추가@google/generative-ai 추가{ type: 'pdf-import', name, icon } 항목case 'pdf-import' 추가서버 라우트 설계
+입력 (Input)
-
+
- Content-Type ·
multipart/form-data
+ - file · PDF (≤ 20MB, MIME
application/pdf)
+ - unitHint (옵션) ·
mm·auto
+
처리 (Pipeline)
-
+
formData.get('file')→ 사이즈 / MIME 검증
+ GoogleGenerativeAI(GEMINI_API_KEY)클라이언트 생성
+ - Gemini File API 업로드 →
fileUri획득
+ gemini-3.1-pro-preview호출 · 외곽선 추출 프롬프트 + JSON 강제
+ - 응답 JSON 파싱 + 좌표 검증 (vertex ≥ 3, 자기교차 / 0면적 거부) +
- finally ·
genai.files.delete(uploadedFile.name)
+
출력 (Output)
-
+
- 성공 ·
{ outerline:[{x,y},…], unit:'mm', confidence }
+ - 실패 ·
{ error:{ code, message } }
+ - 응답 스키마:
{ outerline, unit:'mm', scale?, confidence:0..1, notes? }
+ response_mime_type=application/json·response_schema강제
+
보안 / 운영 (Ops)
-
+
GEMINI_API_KEY는 서버 env 만 사용 · 클라이언트 노출 금지
+ - S3 등 영구 저장소에 절대 저장하지 않음 (REQ-04 폐기) +
- 로깅은
src/util/logger.js만 사용
+ - raw 응답 출력은
NEXT_PUBLIC_ENABLE_LOGGING=true일 때만
+
클라이언트 흐름
+6 · 1모달 PdfImportModal
+ -
+
- 상태머신 ·
idle → uploading → analyzing → success | error
+ - 호출 ·
fetch('/api/gemini/floor-plan', { method:'POST', body: formData })
+ - 성공 시
usePdfImport.applyOuterline(points, unit)호출 후 모달 닫기
+ - 실패 시
useSwal로 에러 메시지 표시
+
6 · 2캔버스 반영 hook usePdfImport
+ -
+
- 단위 변환 ·
unit === 'mm'→ canvas px/mm 비율로 변환
+ - 정규화 · 시계방향 정렬 + bounding box 중앙 정렬(translate) +
- 기존 외곽선 존재 시
useSwalconfirm — 덮어쓰기 분기
+ - 점 →
name === 'outerLine'QLine 객체 add
+ setOuterLinePoints(points)후addPolygonByLines(lines)재사용
+ canvas.renderAll()
+
검증 / 엣지 케이스
+SizeSetting 가드와 일관)컨벤션 / 운영
+Formatting
+-
+
- Prettier · single quote · no semicolons +
tabWidth: 2·printWidth: 150
+ - 경로 alias
@/...우선 (상대경로 체이닝 지양)
+
Messaging / I18n
+-
+
- 모든 알림 · 다이얼로그는
useSwal+useMessage
+ - raw
alert()금지
+ - 다국어 키
pdf.import.*ja / ko 양쪽 추가
+
Logging
+-
+
console.log직접 사용 금지
+ src/util/logger.js·NEXT_PUBLIC_ENABLE_LOGGING게이트
+ - Gemini raw 응답은 로깅 플래그 ON 시에만 출력 +
Verification
+-
+
- 마지막에 lint / type / build subagent 점검 +
- dev 에서 실제 평면도 PDF 1~2건 manual test +
작업 순서
+@google/generative-ai 의존성 추가GEMINI_API_KEY · GEMINI_MODEL env / config 매핑src/app/api/gemini/floor-plan/route.js 작성menusState 에 pdf-import 항목 + PDF 아이콘 SVG 추가CanvasMenu.jsx onClickNav switch 에 케이스 추가modalAtom 으로 PdfImportModal 오픈PdfImportModal.jsx 작성usePdfImport.js 작성pdf.import.* · ja / ko 양쪽yarn lint + dev 환경 manual test