현장 안전관리 플랫폼 — 기획 / PoC 문서
버전: 0.1 (초안)
작성일: 2026-06-25
상태: 기획 — 이해관계자·도메인 전문가 검수 대기
비고: 본 문서의 모든 산업안전 도메인 수치(법 조문번호·매트릭스 크기·표준 위험요인 등)는 "⚠️ 도메인 전문가 확인 필요" 로 표시. 코드 구현은 본 문서 승인 후 별도 진행.
1. 개요 / 배경
최근 중대재해처벌법 등으로 사업장 안전 의무가 크게 늘었으나, 현장의 안전 업무는 엑셀·종이·카톡에 흩어져 체계 없이 처리되고 있다. TBM(작업 전 안전점검회의), 위험성평가, 안전점검, 작업허가 등 "해야 할 것"은 많은데 단일 시스템이 없어 실무자 부담이 크고, 이력·이행 현황 추적이 어렵다.
본 플랫폼은 이 흩어진 안전 업무를 하나의 디지털 워크플로로 체계화하고, 그중 가장 손이 많이 가는 위험성평가를 AI로 자동화해 실무자의 작성 부담을 줄이는 것을 목표로 한다.
재사용 전제: 사내에 이미 구조가 동일한 검증된 시스템(kwater 계약방법 결정 AI —
입력 → 룰엔진 결정론 판정 → 법규 근거(RAG) → 문서 자동생성)이 있다. 안전관리도 같은 골격이라, 0부터가 아니라 이 코드를 안전 도메인으로 재매핑하는 reuse-first 접근으로 개발 기간·리스크를 크게 줄인다.
2. 문제 정의 (4대 업무 현황 · 페인포인트)
| 업무 | 현황 | 페인포인트 |
|---|---|---|
| 위험성평가 | 엑셀 양식 수기 작성, 공종마다 위험요인을 매번 떠올려 기입 | 작성에 시간 과다, 누락 잦음, 담당자별 편차, 법적 양식요건 충족 불확실 |
| TBM | 종이 일지 / 카톡 사진 | 기록 산재, 참석·이력 추적 불가, 위험포인트 누적 안 됨 |
| 안전점검 | 체크리스트 종이 | 집계·미조치 추적 어려움 |
| 안전법규 Q&A | 담당자 개인 지식·검색 의존 | 산안법·KOSHA 기준 찾기 어렵고 근거 불명확 |
공통 통증: ① 분산(시스템 부재) ② 반복 수작업 ③ 이력·이행 현황 불가시성 ④ 법적 근거·검증 취약.
3. 목표 · 범위
- 목적: 흩어진 안전 업무를 한 플랫폼으로 체계화 + 위험성평가 작성 자동화로 실무 부담 절감.
- 핵심 원칙 — 데이터 자산화 → 인사이트: 모든 안전활동(위험성평가·TBM·점검·아차사고)을 구조화 DB에 축적해 분석·인사이트로 연결한다. 문서 생성(xlsx·한글 등)은 산출물의 하나일 뿐, 진짜 가치는 누적된 안전 데이터다. 즉 이 플랫폼은 "문서 생성기"가 아니라 "안전 데이터 플랫폼"이다. (상세: §7.5)
- 관통 철학 — 컴플라이언스 vs 실질예방 분리: ① 컴플라이언스(방어 서류) = 표준양식·자동 취합으로 최소 리소스로 규격 충족 ② 실질예방 = 치명위험(추락·감전·끼임 등) 2~3개에 집중. 플랫폼은 둘을 분리 지원해 담당자 피로를 줄인다.
- 제품 원칙 — 책임 분산: 안전실이 다 떠안지 않는다. 사업/발주부서·관리감독자가 작성·서명 주체, 안전실은 모니터링/감사. → 역할(현업/안전실/경영)·전자서명·승인 워크플로를 1급 설계로(§6·§9). "본인이 서명한 책임"이 연계돼야 현장 태도가 바뀐다.
- Phase 1 MVP = 위험성평가 자동화 (업무량 절감 효과 최대 + kwater 재사용도 최고). 현업 주도(작업유형 선택→자동 팝업→체크·서명).
- 최종 범위: 위험성평가 · 아차사고 신고 · 적격수급 평가 · 통합 KPI 대시보드 · TBM · 안전법규 Q&A. (확정 우선순위 §10)
- 이번 산출물: 본 기획/PoC 문서 + 제출→DB 수집 PoC 가동(§7.5). (본 코드는 승인 후 확장)
4. 사용자 · 시나리오
| 사용자 | 주 기기 | 핵심 행위 |
|---|---|---|
| 현장 실무자/작업반장 | 모바일 | TBM 작성, 안전점검 체크, 위험성평가 간이 입력/조회 |
| 안전관리자 | PC | 위험성평가표 정밀 작성·검토·승인, 대시보드, 문서 출력 |
| (관리/경영) | PC | 이행 현황·미조치 위험 모니터링 |
→ 반응형 필수 (모바일 현장 입력 + PC 관리자 검토).
대표 시나리오 3종
- (P1) 안전관리자가 PC에서 "○○정수장 전기공사" 입력 → 시스템이 표준 위험요인·빈도·강도·감소대책을 자동 제시 → 검토·보정·승인 → 위험성평가표(xlsx·06양식) 출력.
- (P2) 작업반장이 현장에서 모바일로 당일 TBM 작성(위험포인트·참석자) → 일지 자동 저장·이력화.
- (병행) 실무자가 "고소작업 안전난간 기준?" 질의 → 산안법·KOSHA 근거와 함께 답변.
5. 기능 범위 (Phase별 · MoSCoW)
확정 우선순위(§10): P1 위험성평가 → P2 아차사고 → P3 적격수급 → P4 KPI 대시보드, Q&A 병행.
| 기능 | P1 | P2 | P3 | P4 | 우선순위 |
|---|---|---|---|---|---|
| 위험성평가 입력 위저드(공종·환경조건) | ● | Must | |||
| 표준 위험요인·빈도/강도 자동 추정 + 감소대책(룰+LLM) | ● | Must | |||
| 위험성평가표 출력(xlsx·06양식) | ● | Must | |||
| 현업 작성·관리감독자 전자서명·승인 워크플로 | ● | Must | |||
| 안전법규 Q&A | ◐(병행) | Should | |||
| 아차사고(Near-Miss) 모바일 신고(사진+한줄·익명) | ● | Must | |||
| 신고→배정→조치→결과 피드백 루프 + 보상 | ● | Should | |||
| TBM 일지·안전점검 체크리스트(모바일 현장입력) | ● | Should | |||
| 적격 수급업체 안전 평가(발주·계약 단계) | ● | Should | |||
| 과업지시서 표준 안전조항(작업중지·해지) | ◐ | Could | |||
| KPI 거버넌스 대시보드(과정형 지표→부서/경영 KPI) | ● | Should | |||
| 작업허가서(PTW) | ◐ | Could |
6. 위험성평가 도메인 모델
6-1. 기법 (도메인 정리)
- 법적 근거: 산업안전보건법 제36조(위험성평가) + 고용노동부 「사업장 위험성평가에 관한 지침」(고시). ⚠️ 정확한 조문·최신 개정일은 도메인 전문가 확인 필요.
- 위험성 추정 기법(택1/혼용):
- 빈도 × 강도 매트릭스 — 위험성 = 가능성(빈도) × 중대성(강도). 3×3 / 4×4 / 5×4 등. ⚠️ K-water 채택 매트릭스 크기 확인 필요 → 매트릭스를 데이터(JSON)로 외부화해 크기 무관 수용.
- 체크리스트법 — 공종별 점검항목 Y/N.
- 4M — Man·Machine·Media·Management 요인 분류.
- KRAS 분류체계 — KOSHA 위험요인 표준 코드. → 표준요인 DB 기준 코드로 채택 권장.
- 절차: 사전준비 → 유해·위험요인 파악 → 위험성 추정 → 위험성 결정(허용 여부) → 감소대책 수립·실행 → 기록·공유.
6-2. 데이터 모델
RiskAssessment (위험성평가서)
├─ work_context # 현장/사업소/작업기간/공사명
├─ method # matrix3x3 | matrix5x4 | checklist | 4m (데이터화)
└─ items[] : RiskItem
RiskItem (단위 위험)
├─ work_type / process # 공종·작업유형 (룰엔진 입력)
├─ hazard # 유해·위험요인 (룰엔진 결정)
├─ hazard_category # 4M / KRAS code
├─ estimation {frequency, severity, risk_level} # 룰 기본값 + 사용자 보정
├─ legal_basis[] # 근거 조문 (law_registry 구조 재사용)
├─ controls[] # 감소대책 (룰 기본 + LLM 제안)
└─ residual {frequency, severity, risk_level} # 대책 후 잔존위험성
6-3. kwater 매핑 (구체)
| 안전 개념 | kwater 자산 | 매핑 |
|---|---|---|
| 공종·환경 → 위험요인·빈도·강도 | rule_engine.match() (priority 정렬, 결정론) | 매칭 룰 1건 = RiskItem 후보. result={hazard, category, default_frequency/severity, controls[], legal_basis[]} |
| 환경조건 추가 질문(고소·밀폐·중량물) | restriction_options()(금액→후속질문) | followup_questions()로 환경 조건 질문 동적 생성 → RiskItem 후보 활성화 |
| LLM 근거 한정(환각 억제) | build_decision_pack() | build_risk_pack(work_type) = 룰 표준요인 + KOSHA 청크 + 산안법 조문을 LLM에 동행. LLM은 팩 내에서 "제안"만 |
| 미검증 조문 차단 | _strip_unverified_citations | legal_basis에 없는 조문 인용 generic 치환 그대로 재사용 |
| 평가표 출력 | openpyxl로 06 xlsx 템플릿 채움 | 위험성평가표 xlsx(06 양식). 한글 문서(작업허가서 등)는 hwpx_writer 별도 |
7. 아키텍처 + kwater 재사용 맵
경로 기준: /data/kwater/kwater-contract-ai
| 자산 | 재사용도 | 안전 매핑 |
|---|---|---|
backend/services/rule_engine.py + rules/contract_rules.json | 높음 | 공종/환경 → 표준 위험요인·빈도·강도 결정 (신규 risk_rules.json) |
backend/services/textbook_pack.py (build_decision_pack) | 높음 | 위험성평가 근거팩 |
openpyxl(xlsx) + hwpx_writer.py(한글) | xlsx 신규·hwpx 재사용 | 위험성평가표 = xlsx(06 양식, openpyxl) / TBM일지·작업허가서 등 한글 문서 = hwpx_writer |
rag_service.py + embedding.py + chroma + rules/law_registry.json + data/glossary.json | 높음 | 산안법·KOSHA·내부규정 검색, 안전 약어(TBM·MSDS 등) 확장 |
api/v1/ask.py + Gemini provider | 높음(컬렉션·프롬프트만 교체) | 안전법규 Q&A |
frontend Step1~4 위저드 + store/wizardStore.ts + HomeDashboard.tsx(멀티테넌트) | 높음(모바일 보강) | 위험성평가 입력 위저드, 부서/사업소별 테넌트 |
| FastAPI SPA 서빙 + media01 배포 파이프라인 | 높음 | 동일 배포 모델 |
신규 개발 핵심 5가지
risk_rules.json— 작업유형별 표준 위험요인 DB (최대 공수)- 룰엔진 조건평가기 일반화 — 안전 도메인 키(
work_type,environment등) 수용 (현재 계약 도메인 키 하드코딩) - xlsx 출력(06 템플릿 채움) — openpyxl로
06.위험성평가.xlsx의 위험성평가표 시트에 항목 행을 채워 저장(동적 행 용이). ※ HWPX는 한글 문서 출력 시에만 - 빈도×강도 매트릭스 UI
- 모바일 UX (kwater는 데스크톱 위주)
7.5 데이터 아키텍처 · 인사이트 (플랫폼 핵심)
이 플랫폼의 본질은 문서 자동화가 아니라 안전 데이터의 자산화와 인사이트다. 모든 입력·판정·조치를 처음부터 정규화 구조로 저장해, 누적될수록 가치가 커지게 설계한다.
3계층 구조 + 오브젝트 스토리지
- 수집 (OLTP): 제출·위험성평가·TBM·점검·아차사고를 트랜잭션으로 저장. (PoC: SQLite / 운영: PostgreSQL·Supabase)
- 분석 (OLAP): DuckDB로 집계·추세·교차분석 (사내 표준 스택, kwater·RealtyAPI도 DuckDB 사용 → 재사용).
- 산출: ① xlsx(위험성평가)·한글 문서 ② 대시보드 ③ 인사이트 리포트 — 모두 동일 데이터에서 파생.
- blob = MinIO 오브젝트 스토리지: 사진·첨부 같은 대용량 바이너리는 MinIO(media01)에 저장하고 DB엔 키(참조)만 보관. DB·앱서버 디스크를 가볍게 유지(미디어01 오프로드 전략 일치). 아차사고 사진이 첫 적용 사례.
설계 원칙
- §6의
RiskItem(공종·위험요인·빈도·강도·대책·잔존위험성)을 처음부터 분석 친화 정규화 스키마로 — 문서용 평면 양식이 아니라 행 단위 레코드로 적재. - 문서(xlsx·한글)는 저장된 레코드의 렌더링 결과일 뿐, 원천(single source of truth)은 DB.
도출 가능한 인사이트(예시)
- 자주 나오는 유해위험요인 Top-N, 공종·부서·사업소별 위험성 분포·추세
- 감소대책 채택률, 잔존위험성 잔류 패턴, 미조치 위험 추적·알림
- 계절·공정 단계별 위험 패턴, (장기) 사고/아차사고 ↔ 위험요인 상관 → 예방 신호
검증된 첫 구현체 (가동 중)
- 확인요청서 제출 수집 서비스(Flask + SQLite,
https://sword33.duckdns.org/safety/api/): 제출 →submissions/answers정규화 저장 →/api/stats가 질문별·역할별 집계 반환. = 위 "수집→분석" 패턴의 동작하는 PoC.
8. 필요 데이터 · 규정 소스
| 데이터 | 용도 | 확보 방법 | 상태 |
|---|---|---|---|
| 산안법/시행령/규칙 조문 | legal_basis, Q&A | 국가법령정보센터 OPEN API (kwater tools/fetch_laws_* 패턴 재사용) | 확보 가능 |
| 위험성평가 고시 | 기법·매트릭스 기준 | 법령/고시 | 확보 가능 |
| 작업유형별 표준 위험요인 DB | risk_rules 본체 | reference/공종별 위험성평가 표준모델.xlsm(260종·446시트)에 이미 존재 → ETL 추출 | ✅ 확보 — 신규구축 아님(최대 공수 해소!) |
| 위험성 매트릭스·등급 기준 | 빈도·강도·위험성 결정 | reference/06.위험성평가(최초평가).xlsx 1.1·1.2 시트(표준 5×4) | ✅ 확보 |
| 출력 양식(위험성평가서) | 결과 문서 포맷 | reference/06.위험성평가(최초평가).xlsx(표지·매트릭스·유해위험요인·평가표) | ✅ 확보 |
| 산업안전담당자 업무·체계 | 화면/로직 방향 | reference/*.hwpx 3종(산보·시설물·건설 기본계획) | ✅ 확보(§13.4) |
| 산안법/시행령/규칙 조문 | legal_basis, Q&A | 국가법령정보센터 OPEN API (kwater tools/fetch_laws_* 재사용) | 확보 가능 |
| K-water 내부 안전규정·PTW·TBM 양식 | 내부 분기·템플릿 | 기본계획 hwpx에 PTW·작업중지제·TBM 자가진단 양식 포함 | 🟡 일부 확보 |
| 사고/아차사고 통계(선택) | 빈도 가중치 보정 | 아차사고 PoC로 자체 축적 중 | 후순위 |
반전: 최대 리스크였던 "표준요인 DB 신규구축"이 해소됨 — 직원들이 만든
표준모델.xlsm(260종)이 그 자산. P1은 구축이 아니라 추출(ETL)+검증으로 전환.
9. UX (반응형)
| 현장 실무자 (모바일) | 안전관리자 (PC) | |
|---|---|---|
| 핵심 | TBM·점검 입력, 위험성평가 간이 조회/입력 | 평가표 정밀 작성·검토·승인, 대시보드, 출력 |
| 레이아웃 | 세로 단일 컬럼, 큰 터치 타깃, 단계당 1질문 | 멀티컬럼, 표 일괄 편집, 키보드 중심 |
| 부가 | 오프라인 임시저장, 현장사진 첨부, (선택)음성→텍스트 | 매트릭스 일괄 편집, xlsx 출력 |
구현 방향: kwater 위저드를 반응형 분기 — 동일 wizardStore 상태, viewport별 컴포넌트(모바일=스텝퍼 / PC=풀폼). 문서 출력(xlsx)은 서버 사이드라 디바이스 무관.
10. 로드맵
확정 순서 (사용자 결정 2026-06-25): 위험성평가 → 아차사고 → 적격수급 → KPI 대시보드 (+ Q&A 병행)
| Phase | 산출물 | kwater 재사용 | 신규 개발 |
|---|---|---|---|
| P0 준비 | 표준요인 DB 스키마, 규정 수집 파이프라인 | 법령 수집툴, chroma, embedding | 안전 데이터 수집·구조화, 전문가 검수 루프 |
| P1 위험성평가 (MVP) | 입력위저드 → 룰엔진 추정 → 대책 → 평가표 xlsx(06 양식) + 현업 서명 | rule_engine, decision_pack, form/hwpx, 위저드/스토어, RAG | risk_rules.json, 조건평가기 일반화, xlsx 06 템플릿 출력(openpyxl), 매트릭스 UI, 모바일, 서명·승인 워크플로 |
| P2 아차사고 신고 | 모바일 신고(사진+한줄·익명)→배정→조치→피드백+보상, TBM·점검 현장입력 | 제출 수집 PoC(Flask+SQLite, §7.5) 확장, 위저드 | 모바일 신고 UX, 피드백 루프, 중복제거·중요도 분류, 보상 연동 |
| P3 적격 수급업체 평가 | 발주·계약 단계 안전 평가 계량화 + 표준 안전조항 | kwater 계약 도메인 접점, 룰엔진 | 평가 기준표, 계약 연계 (※ 계약규정·법무 협의 전제) |
| P4 KPI 거버넌스 대시보드 | 과정형 지표→부서/경영 KPI, 경영진 시각화 | HomeDashboard(멀티테넌트), org 분기 | 집계 API(DuckDB), 차트, 미조치 알림 |
| 병행: 안전법규 Q&A | 자유질의 응답 | ask.py 거의 그대로 | 안전 프롬프트·약어 glossary |
P2 아차사고는 오늘 띄운 제출 수집 PoC(§7.5)를 그대로 확장하므로 착수 비용이 낮음. Q&A는 어느 단계든 저비용 병행 가능.
11. 리스크 · 완화
| 리스크 | 영향 | 완화 |
|---|---|---|
| 규정·표준요인 데이터 미확보 | P1 착수 지연 | 데이터 트랙 분리, KOSHA 공개자료 선구축 + 내부자료 후보강 |
| AI 제안의 법적 책임 | 위험요인 누락 시 책임 소재 | 휴먼인더루프(관리자 승인 필수) + 면책 고지 + decision_pack으로 근거 한정 |
| 위험성평가 법적 검증 | 평가서 부실 = 법 위반 | legal_basis 강제, 미검증 조문 generic 치환(kwater 재사용), 법정 양식요건 체크 |
| 도메인 전문가 검수 필요 | 표준요인 정확도 | 산업안전기사/지도사 검수를 P0~P1 필수 게이트로 명시 |
| 출력 양식 정합성 | 06 양식과 미세 차이 | 06 xlsx를 템플릿으로 직접 채움(서식 보존, openpyxl). 한글 문서 필요 시 hwpx 별도 |
| 매트릭스 기법 미확정 | 추정 로직 흔들림 | 매트릭스를 데이터(JSON) 외부화 — 전문가 확인 후 값만 교체 |
| 아차사고 보상 게이밍/노이즈 | 중복·사소 신고 폭증으로 신호 희석 | 중복제거, 중요도 자동 분류, 보상은 채택·개선 완료 기준 |
| 과정형 KPI 형식화 | 이행률 숫자만 채우는 행태 | 질적 표본감사 병행, 지표 주기적 재설계 |
| 적격수급·계약조항 충돌 | 계약규정·법무와 마찰 | 우리 통제 밖 → 계약·법무 사전 협의 전제(P3 게이트) |
| 책임 분산의 조직 저항 | 현업이 서명·작성 거부 | 시스템(서명 워크플로)이 가능케 + KPI 연동(P4)이 실제 레버 — 두 축 상호보완 |
12. 성공지표 (KPI)
- 위험성평가서 작성시간 절감률 (기존 수기 대비) — 핵심 지표
- 표준 위험요인 커버리지 (대상 공종 중 룰DB 보유 비율)
- AI 제안 채택률 (제시한 위험요인·대책 중 관리자 채택 비율)
- 법적 검수 통과율 (양식요건·근거조문 충족)
- 데이터 축적량 / 인사이트 활용 (누적 위험성평가 레코드 수, 표준요인 재사용률, 대시보드 활용도)
- (운영) 월간 활성 사용자, TBM/점검 디지털 기록 비율
13. 참조자료 기반 설계 보강 (2026-06-26)
직원 제작 자산(reference/)과 담당자 업무문서(hwpx) 분석 결과 반영.
13-1. 두 역할 (책임 분산 구체화)
- 사업담당자(현업): ① 위험성평가 ② 현장점검 ③ 현장회의 — 현장 실행 3종.
- ⚠️ 현장회의 ≠ TBM: 현장을 찾아가 어려운 점을 청취·회의하고 그 결과를 기록하는 업무.
- 현장점검·현장회의 = 스마트폰 사진 + 내용 입력 → 아차사고 신고 인프라 그대로 재사용(사진=MinIO, 내용=SQLite). 같은 모바일 폼 패턴.
- 산업안전담당자: 기본계획 수립·안전보건체계(체제구축)·교육·작업중지제·PTW·KOSHA-MS 등 거버넌스 (hwpx 3종이 그 업무·화면 방향).
13-2. 위험성 매트릭스 체계화 ← "어떻게 체계적으로" 답
매트릭스를 '선택 가능한 데이터 프로파일' 로 정의하면 체계화됨 (엑셀 수식/하드코딩이 아니라 데이터):
- 표준 프로파일(reference 06) = 5×4: 빈도 5단계(1~5, 각 판단기준 텍스트 포함), 강도 4단계(1=비치료·2=병원치료·3=장해·4=사망), 위험성 = 빈도×강도(1~20).
- 등급 밴드: 1~3 매우낮음(허용가능) / 4~6 낮음 / 8 보통(허용불가·계획개선) / 9~12 약간높음(빨리개선) / 15~20 매우높음(작업중지·즉시개선).
- 사용자는 프로파일 선택(3×3·4×4·5×4), 셀값·등급밴드·관리기준은 JSON 외부화 → 위험성·등급·관리기준 자동·결정론 산출(kwater decision_pack 철학과 동일, 같은 입력=같은 결과).
- 산출물(구현됨):
config/matrix_profiles.json— 5×4 표준 + 3×3 간이 프로파일. 빈도×강도→위험성→등급→관리기준 결정론 산출 검증 완료.
13-3. 표준모델 → DB (이미 완성된 자산)
표준모델.xlsm: 대분류 → 공종(260종) → 단위작업 → [분류 · 유해위험요인 · 감소대책] 라이브러리.- 분류 = 인적/기계적/전기적/화학적/… 요인(유해위험요인 분류).
- ETL: openpyxl로 446시트 단위작업 표 파싱 →
risk_rules(공종·단위작업·분류·유해위험요인·표준 감소대책) 적재. 빈도/강도는 현장 평가값이라 DB엔 표준요인·대책만. - 산출물(구현됨):
submit_service/etl_risk_model.py→risk_model.db(4.7MB) — 14,555 표준 유해위험요인·감소대책 / 1,445 단위작업 / 5 대분류(공통·건축·토목·기계전기·장비기계) / 6 요인분류(기계적·인적·전기적·작업특성·작업환경·재료적). DuckDB 호환.
13-4. 출력 양식 & 플로우
- 출력 =
06.위험성평가구조: 표지 / 위험성 추정 / 매트릭스(1.1·1.2) / 사업장정보 / 유해위험요인 파악 / 위험성평가표(공정대분류·세부분류 / 분류·원인·유해위험요인 / 관련근거(법규) / 현재안전보건조치 / 빈도·강도·위험성 / 감소대책). - 플로우: 사업내용 자연어 입력 → AI가 공종/단위작업 자동 매칭(kwater 분류·RAG 재사용) → 표준 유해위험요인·감소대책 자동 로드 → 빈도·강도 입력(선택 매트릭스) → 위험성·등급 자동 → 현재조치·추가대책 보정·서명 → 평가서 출력(xlsx·06 양식). ★ 목표: 사용자는 사업내용만 입력하면 결과가 나온다.
13-5. 산업안전담당자 기능 (hwpx에서 도출 — 로드맵 후보)
- 안전보건체계(체제구축·CSO 선임·위원회), 안전보건교육 관리(정기/특별/건설업기초)
- TBM 활성화 + 근로자 안전의식 자가진단 체크리스트(현장회의 연결)
- 작업중지제(현수막·QR), 작업허가제(PTW) 양식, 안전보건대장, DFS(설계안전성검토), 100인 안전패트롤, KOSHA-MS 인증
- 시설물 안전점검·진단(시설물안전법), AI 활용 점검 효율화
15. 멀티유저 / 인증 설계 (2026-06-26)
목표: 여러 직원이 각자 계정으로, 부서/사업소·역할에 맞게 사용. 평가·신고·점검이 "누가/어느 부서" 데이터로 귀속.
15-1. 인증 — Resend 매직링크 (우리 서비스에 격리)
- 격리 이유: 현 Supabase Auth는 식당앱(eatlog)과 공유 → 설정 변경 시 타앱 영향. 안전앱은 자체 매직링크로 독립.
- 플로우: 이메일 입력 →
POST /api/auth/request-link→ 1회용 토큰(랜덤·TTL 15분) 발급 + Resend로 메일 발송(https://sword33.duckdns.org/safety/auth?token=…) → 클릭 → 토큰 검증 → 세션 토큰(서명) 발급 → 이후 API는Authorization: Bearer. - 도메인 allowlist(선택):
@kwater.or.kr만 허용해 외부 가입 차단. 링크 요청 레이트리밋. - 전제: Resend API 키 1개 (
/data/safety-platform/.env, 600). ← 제공 대기
15-2. 사용자·역할
users(id, email, name, dept, role, status, created_ts, last_login)- role:
field(현업/사업담당자) ·safety(안전관리자) ·exec(경영) ·admin - 첫 로그인: 계정 생성(status=pending) → 부서·역할 선택 → 안전관리자 승인 후 활성.
15-3. 테넌시 (부서/사업소 단위)
- 모든 레코드(위험성평가·아차사고·점검·회의)에
owner_id+dept부여. - 가시성: 현업=본인+본인 부서 / 안전관리자=전체(또는 담당 부서) 감사 / 경영=집계 대시보드. 엔드포인트에서 세션 역할·부서로 강제.
- DuckDB 인사이트도 부서별 교차분석으로 자연 확장(§7.5).
15-4. 단계
- (키 수령) Resend 연동 +
users/세션 + 로그인 페이지(/safety/login) - 기존 PoC(아차사고·확인요청서)에
owner_id·dept부착, 익명 옵션 유지 - 자동 위험성평가 엔드포인트(다음 제안)를 로그인 사용자/부서에 귀속
- 역할별 가시성·승인 UI
15-5. DB
- 당분간 SQLite 유지(WAL, PoC 동시성 충분). 사용자 급증 시 PostgreSQL(가동 중인 Supabase DB) 이전 — 스키마 동일 설계.
14. 부록
14-1. 용어 / 약어
- TBM (Tool Box Meeting): 작업 전 안전점검회의
- 위험성평가: 유해·위험요인 파악 → 위험성 추정·결정 → 감소대책 수립
- 빈도×강도: 위험성 = 발생가능성 × 중대성
- 4M: Man·Machine·Media·Management
- KRAS: 안전보건공단 위험성평가 지원 분류체계
- PTW (Permit To Work): 작업허가서
- MSDS: 물질안전보건자료
14-2. ⚠️ 도메인 전문가 확인 필요 (미해결 질문)
- K-water가 채택할 위험성 매트릭스 크기(3×3 / 4×4 / 5×4)와 각 등급 정의·허용기준
- 산안법 위험성평가 관련 정확한 조문·고시 최신 개정일
- 표준 위험요인 분류체계: KRAS 코드 채택 여부 / 자체 체계
- 위험성평가서 법정 양식 요건(필수 항목·서명·보존)
- 사업소/공종별 내부 안전규정 분기 존재 여부
- TBM·작업허가 내부 양식과 전자서명 요건
- AI 자동 제안의 책임·면책 사내 정책
14-3. 재사용 기준 핵심 파일 (kwater)
backend/services/rule_engine.py·textbook_pack.py(build_decision_pack)backend/services/form_generator.py·hwpx_writer.pyrules/contract_rules.json(→ risk_rules.json 설계 기준) ·rules/law_registry.jsonfrontend/src/store/wizardStore.ts·pages/Step1Page.tsxbackend/services/rag_service.py·api/v1/ask.py(Q&A 트랙)
다음 단계 (문서 승인 후)
- 도메인 검수: 6·8장 + 13-2 미해결 질문을 안전 전문가/K-water 안전팀과 리뷰 → 수치 확정
- 데이터 가용성 점검: 8장 소스별 1건씩 확보 테스트(법령 API, KOSHA 자료, 내부자료 요청)
- 기술 스파이크 2건: (a) 06 xlsx 템플릿 채우기 PoC(openpyxl) (b) 룰엔진 조건평가기 안전키 확장 PoC
- 이해관계자 리뷰로 범위·우선순위 합의 → P0 착수