내부 정책/지침과 외부 법령을 함께 검토해서, 현재 회사 정책에 무엇을 추가해야 하는지 또는 어떤 내용이 불필요한지 검토하기 위한 시스템입니다.
배포는 main 브랜치 push 시 GitHub Actions로 실행됩니다.
프론트엔드는 React + Vite, 백엔드는 Supabase(Auth, Postgres, Storage, Edge Functions), AI 분석은 OpenAI API를 사용합니다.
이 시스템은 법률 자문 시스템이 아닙니다.
결정론적 구조화와 저장을 우선하고, OpenAI는 사람이 검토할 수 있는 개정 가이드 생성에만 사용합니다.
- 정책/지침 문서 업로드
- 문서를
장/조/항/호/목단위로 구조화 - 구조화 섹션을 DB에 저장
- 법령 URL 등록 및 본문 구조화
- 선택한 정책/지침과 선택한 법령을 기준으로 AI 종합 비교
- 우측 하단 리포트에 다음 두 가지 출력
- 현행 정책에 추가해야 할 내용 및 근거
- 현행 정책에 불필요한 내용 및 근거
docx,txt,md업로드 지원- 문서 제목 기준으로
POLICY/GUIDELINE분류 - 구조화 단위:
- 장
- 조
- 항
- 호
- 목
현재 파서 규칙의 주요 기준:
제 n 장→ 장제 n 조→ 조①→ 항1.→ 호가.→ 목
- 허용된 URL 도메인에서만 등록
law.go.krwww.law.go.krelaw.klri.re.kr
- HTML이면 본문 텍스트를 추출
- 텍스트가 직접 내려오면 그대로 사용
- 등록 시 원문과 구조화 섹션을 함께 저장
- 선택된 모든 정책/지침 + 선택된 모든 법령을 한 번의 프롬프트로 OpenAI에 전달
- 결과는 문서별 가이드로 반환
- 어느 정책/지침에 반영해야 하는지
- 어느 위치에 넣거나 빼야 하는지
- 정책/지침 근거 위치
- 법령 근거 위치
- 조치 가이드
- 신뢰도
추가로 현재 리포트에는 다음도 표시합니다.
- 사용 모델명
- OpenAI API 호출 건수
- React 19
- Vite
- TypeScript
- Supabase Auth
- Supabase Postgres
- Supabase Storage
- Supabase Edge Functions
- OpenAI Responses API
src/
components/
lib/
styles.css
App.tsx
shared/
policyParser.ts
comparisonEngine.ts
revisionClassifier.ts
sectionHierarchyColumns.ts
supabase/
migrations/
functions/
- src/App.tsx
- 전체 화면 상태 관리
- src/components/DocumentList.tsx
- 정책/지침 선택 토글
- src/components/DocumentViewer.tsx
- 구조화 섹션 테이블
- src/components/LawSourcePanel.tsx
- 법령 URL 등록 및 선택
- src/components/ComparisonReviewPanel.tsx
- AI 비교 결과 리포트
- src/lib/documentService.ts
- Supabase / Edge Function 호출
- shared/policyParser.ts
- 결정론적 구조 파서
- register-document
- 내부 문서 등록
- register-law-source
- 법령 URL 등록
- run-comparison
- 결정론적 비교 실행
- run-bulk-comparison
- 기존 경로 보존용 함수
- classify-revision
- 비교 실행 단위 AI 분류
- analyze-selected-revisions
- 선택된 정책/지침 + 법령 종합 AI 리포트
현재 스키마는 policy_ 접두사를 사용합니다.
주요 테이블:
policy_documentspolicy_document_versionspolicy_document_sectionspolicy_law_sourcespolicy_law_versionspolicy_law_sectionspolicy_comparison_runspolicy_comparison_resultspolicy_revision_decisionspolicy_audit_logs
구조화 섹션은 기본적으로 다음 정보를 가집니다.
hierarchy_typehierarchy_labelhierarchy_orderoriginal_textnormalized_textpath_display
추가로 명시적 계층 컬럼을 사용하는 마이그레이션도 포함되어 있습니다.
chapter_label,chapter_textarticle_label,article_textparagraph_label,paragraph_textitem_label,item_textsub_item_label,sub_item_text
VITE_SUPABASE_URL=...
VITE_SUPABASE_ANON_KEY=....env.example를 복사해서 사용하면 됩니다.
cp .env.example .env이 프로젝트는 현재 Google OAuth 로그인 기준으로 동작합니다.
Supabase Dashboard에서:
Authentication > Providers > Google- Google Client ID / Secret 등록
- Redirect URL 허용
로컬 개발 기준 예:
http://127.0.0.1:5173
OpenAI 키는 프론트 .env에 넣지 않습니다.
반드시 Supabase Edge Function secret으로 등록해야 합니다.
필수 시크릿:
OPENAI_API_KEY=...
OPENAI_REVISION_MODEL=gpt-5.2CLI 예:
supabase secrets set OPENAI_API_KEY=... --project-ref <project-ref>
supabase secrets set OPENAI_REVISION_MODEL=gpt-5.2 --project-ref <project-ref>npm installcp .env.example .env.env에 실제 값을 채웁니다.
supabase db pushsupabase functions deploy register-document --no-verify-jwt
supabase functions deploy register-law-source --no-verify-jwt
supabase functions deploy run-comparison --no-verify-jwt
supabase functions deploy classify-revision --no-verify-jwt
supabase functions deploy analyze-selected-revisions --no-verify-jwt참고:
- 현재 일부 함수는 게이트웨이 JWT 검증 대신 함수 내부 인증 검증을 사용합니다.
- 그래서
--no-verify-jwt로 배포하는 경로를 사용하고 있습니다.
npm run dev기본 접속:
http://127.0.0.1:5173/
이 저장소는 GitHub Actions로 GitHub Pages 배포가 가능하도록 설정되어 있습니다.
워크플로우:
.github/workflows/deploy-pages.yml
필수 GitHub Repository Secrets:
VITE_SUPABASE_URL
VITE_SUPABASE_ANON_KEY배포 조건:
main브랜치 push 시 자동 배포- 또는
workflow_dispatch로 수동 실행
예상 배포 주소:
https://policy.sanghak.kr/
GitHub Pages가 아직 안 뜨면 아래를 확인해야 합니다.
- Repository
Settings > Pages - Source가
GitHub Actions인지 확인 - Custom domain이
policy.sanghak.kr로 설정되어 있는지 확인 - Repository Secrets에
VITE_SUPABASE_URL,VITE_SUPABASE_ANON_KEY가 등록되어 있는지 확인
npm run lint
npm run typecheck
npm run test
npm run build- Google OAuth 로그인
docx,txt,md업로드- 구조화 섹션 생성
- 문서 목록에 추가
- 법령 URL 입력
- 본문 수집 및 구조화
- 법령 목록에 추가
- 문서 목록에서 정책/지침 카드 토글 선택
- 법령 목록에서 비교할 법령 선택
선택 정책·지침과 법령 비교 실행
이 버튼은 현재:
- 선택된 정책/지침
- 선택된 법령
조합을 기준으로 결정론 비교를 실행하고, 우측 하단 리포트는 선택 상태를 기준으로 OpenAI 종합 분석을 표시합니다.
우측 하단 리포트에서 확인 가능한 항목:
- 현행 정책에 추가해야 할 내용 및 근거
- 현행 정책에 불필요한 내용 및 근거
- 반영 위치
- 정책/지침 근거 위치
- 법령 근거 위치
- 조치 가이드
- 신뢰도
- 사용 모델
- OpenAI API 호출 건수
이 프로젝트에서 OpenAI는 다음에만 사용합니다.
- 선택된 정책/지침과 법령의 종합 개정 가이드 생성
- 개정 필요성 설명
- 불확실한 사례에 대한 저신뢰 메모
다음에는 사용하지 않습니다.
- 기본 구조 파싱
- 원문 저장
- 버전 저장
- 구조 자체의 주 저장 로직
현재 프롬프트는 다음 기준을 강제합니다.
- 일반 민간회사 기준
- 정부기관/공공기관 전용 의무는 제외
- 제공된 정책/지침과 법령 텍스트만 근거로 사용
- 문서별 가이드 생성
- 저신뢰 시 명시적으로 표시
- 카드 클릭으로 선택 토글
- 선택된 문서는 문서 보기에도 표시
- 구조화 섹션만 표시
- 테이블 컬럼:
- 장
- 조
- 항
- 호
- 목
- 내용
계층 컬럼 값이 있는 셀은:
- 검은색 배경
- 흰색 글씨
- 상단 요약:
- 선택 정책 및 지침 x건
- VS
- 법령 이름
- 하단:
- AI 비교 결과
- 추가해야 할 내용 및 근거
- 불필요한 내용 및 근거
- PDF 파서는 붙어 있지 않습니다.
- 구조 파서는 한국어 규정 문서 형식에 맞춘 규칙 기반입니다.
- 동일 법령 중복 제거는 추가 정리가 더 필요합니다.
- 비교 검토 UI는 현재 AI 리포트 중심입니다.
- 거대한 문서 집합을 한 번에 분석하면 OpenAI 입력 길이 제약에 걸릴 수 있습니다.
- OpenAI 키를 프론트에 넣지 마십시오.
- Supabase service role key를 프론트에 넣지 마십시오.
- 법령 URL은 허용된 도메인만 사용합니다.
- 이 시스템의 출력은 최종 법률 판단이 아니라 내부 검토 가이드입니다.
- 동일 법령명 + 시행일 기준 중복 제거
- PDF 수집 및 안정적 텍스트 추출
- 구조화 재파싱 워크플로우
- AI 리포트 결과 저장 및 이력 관리
- 선택된 법령 집합별 분석 결과 캐싱
- 대형 문서 분석 시 chunking 전략