NAS 엑셀 연동 — 기술 검토 및 구현 계획
NAS 엑셀 연동 — 기술 검토 및 구현 계획
섹션 제목: “NAS 엑셀 연동 — 기술 검토 및 구현 계획”분홍아빠 질문: “웹에서 더블클릭하면 Excel이 열리고, 수정 후 저장하면 웹에 반영되게 할 수 있나?”
❌ 브라우저 → 로컬 Excel: 직접 연동 불가능
섹션 제목: “❌ 브라우저 → 로컬 Excel: 직접 연동 불가능”원인: 브라우저 보안 정책상 웹사이트가 클라이언트의 로컬 프로그램 실행 불가
- 악성코드 방지를 위해 모든 브라우저가 차단 (Chrome, Edge, Safari 등)
- ActiveX(IE구시대)나 웹브라우저 내장 프로토콜 일부 예외가 있지만, 현대 브라우저에서는 삭제됨
결론: “더블클릭 → Excel 그대로 열고 Ctrl+S로 웹에 저장”하는 방식은 직접 불가능
✅ 가능한 방식 (3가지)
섹션 제목: “✅ 가능한 방식 (3가지)”방식 A: NAS 드라이브 매핑 (청우팀 방식 그대로, 권장)
섹션 제목: “방식 A: NAS 드라이브 매핑 (청우팀 방식 그대로, 권장)”원리: 지금 청우팀이 쓰는 것처럼 NAS를 Windows 드라이브로 매핑 → 웹앱은 경로만 표시
흐름:
웹 ["작업계획서.xlsx" 클릭] ↓ \\minicity.kr\공용폴더\공사43\작업계획서.xlsx브라우저 [경로 열기 요청] ↓탐색기 [파일 열기] → 엑셀 실행 ↓엑셀에서 수정 → Ctrl+S ↓NAS 저장 완료
웹앱은 파일 수정 시간(mtime)를 폴링으로 확인→ "최종 수정: 2분 전" 표시장점:
- 지금 방식 그대로 → 아무것도 안 바꿔도 됨
- 엑셀 모든 기능 사용
- 저장 즉시 NAS 반영
- 팀원간 자연스럽게 공유
단점:
- 웹앱 외부에서도 NAS 접근 → 보안은 NAS 쪽에서 통제
- 웹앱과 NAS 경로 일치 필요
방식 B: 웹 오피스 (OnlyOffice / Collabora)
섹션 제목: “방식 B: 웹 오피스 (OnlyOffice / Collabora)”원리: 브라우저 안에서 엑셀 유사 편집 → 서버 저장
흐름: 웹 → OnlyOffice iframe → 편집 → Ctrl+S → 서버 → NAS 저장
장점:
- 웹에서 완전한 폐쇄형
- 동시편집(5~10명) 내장
- 브라우저만 됨
단점:
- 엑셀 고급 기능(매크로, 복잡한 수식, VB) 호환성 문제
- 외선팀이 “뭔가 엑셀이 아닌데?” 할 수 있음
- 서버 리소스 소모 큼 (RAM 2~4GB 추가)
구현 난이도: 중간 (Docker OnlyOffice 하나 추가)
방식 C: 다운로드 → 수정 → 재업로드
섹션 제목: “방식 C: 다운로드 → 수정 → 재업로드”흐름: 웹에서 다운로드 → PC 엑셀로 수정 → 웹에 업로드
장점: 구현이 제일 쉬움
단점:
- 매번 반복 → 실무자 불편
- 버전 충돌 위험 (누가 더 먼저 업로드 할지)
추천: 방식 A + 웹앱 권한 통합
섹션 제목: “추천: 방식 A + 웹앱 권한 통합”┌─────────────────────────────────────┐│ 웹앱 (공사관리ERP) ││ - 공사목록, 작업흐름 ││ - "작업계획서" 클릭 ││ → \\NAS\경로 연결 ││ → 탐색기/엑셀 자동 오픈 ││ - 파일 변경 감지 (mtime) ││ → "최종 수정: 2분 전" ││ - 히스토리 버전은 웹앱 관리 │└─────────────────────────────────────┘ ↕┌─────────────────────────────────────┐│ NAS 공유폴더 (Y: 드라이브) ││ - Excel 직접 열고 저장 ││ - 팀원간 자연스럽게 공유 │└─────────────────────────────────────┘구현 PoC (바로 해볼 수 있는 거)
섹션 제목: “구현 PoC (바로 해볼 수 있는 거)”1. DB에 NAS 파일 경로 저장
섹션 제목: “1. DB에 NAS 파일 경로 저장”ALTER TABLE Work ADD COLUMN attached_file_path VARCHAR(500);"\\minicity.kr\\공용\\공사43\\작업계획서_v1.xlsx"2. 프론트 “열기” 버튼
섹션 제목: “2. 프론트 “열기” 버튼”<v-btn v-if="work.attached_file_path" @click="openFile(work.attached_file_path)"> 📂 Excel 열기</v-btn>
function openFile(path) { const unc = encodeURI("file://" + path.replace(/\\\\/g, '/')); window.open(unc); // 또는 탐색기 폴더 열기 window.open(unc.substring(0, unc.lastIndexOf('/')));}3. 백엔드 파일 변경 감지
섹션 제목: “3. 백엔드 파일 변경 감지”@app.get("/api/v1/works/{work_id}/file_info")async def get_file_info(work_id): work = get_work(work_id) path = work.attached_file_path.replace("\\\\", "/") mtime = os.path.getmtime(path) # NAS에 마운트되어야 함 return { "exists": os.path.exists(path), "modified_at": datetime.fromtimestamp(mtime).isoformat(), "size": os.path.getsize(path), }결정사항
섹션 제목: “결정사항”| # | 질문 |
|---|---|
| 1 | 지금 회사 NAS를 Y: 드라이브로 매핑해서 쓰고 있나? 정확한 경로은? |
| 2 | 방식 A(경로연결) + 파일 변경감지, 이 방식으로 구현 할까? |
| 3 | 동시에 여러 사람이 같은 엑셀 파일을 수정하는 경우가 많나? |
방식 A → 백엔드 API 1개 + 프론트 버튼 1개만 추가하면 빠르게 됨!