콘텐츠로 이동

NAS 엑셀 연동 — 기술 검토 및 구현 계획

NAS 엑셀 연동 — 기술 검토 및 구현 계획

섹션 제목: “NAS 엑셀 연동 — 기술 검토 및 구현 계획”

분홍아빠 질문: “웹에서 더블클릭하면 Excel이 열리고, 수정 후 저장하면 웹에 반영되게 할 수 있나?”


❌ 브라우저 → 로컬 Excel: 직접 연동 불가능

섹션 제목: “❌ 브라우저 → 로컬 Excel: 직접 연동 불가능”

원인: 브라우저 보안 정책상 웹사이트가 클라이언트의 로컬 프로그램 실행 불가

  • 악성코드 방지를 위해 모든 브라우저가 차단 (Chrome, Edge, Safari 등)
  • ActiveX(IE구시대)나 웹브라우저 내장 프로토콜 일부 예외가 있지만, 현대 브라우저에서는 삭제됨

결론: “더블클릭 → Excel 그대로 열고 Ctrl+S로 웹에 저장”하는 방식은 직접 불가능


방식 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 엑셀로 수정 → 웹에 업로드

장점: 구현이 제일 쉬움

단점:

  • 매번 반복 → 실무자 불편
  • 버전 충돌 위험 (누가 더 먼저 업로드 할지)

┌─────────────────────────────────────┐
│ 웹앱 (공사관리ERP) │
│ - 공사목록, 작업흐름 │
│ - "작업계획서" 클릭 │
│ → \\NAS\경로 연결 │
│ → 탐색기/엑셀 자동 오픈 │
│ - 파일 변경 감지 (mtime) │
│ → "최종 수정: 2분 전" │
│ - 히스토리 버전은 웹앱 관리 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ NAS 공유폴더 (Y: 드라이브) │
│ - Excel 직접 열고 저장 │
│ - 팀원간 자연스럽게 공유 │
└─────────────────────────────────────┘

ALTER TABLE Work ADD COLUMN attached_file_path VARCHAR(500);
"\\minicity.kr\\공용\\공사43\\작업계획서_v1.xlsx"
<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('/')));
}
@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개만 추가하면 빠르게 됨!