Skip to content

[OCR][P0] Server 소유 문서 OCR 실행·결과 저장 구현 #95

Description

@hywznn

한 줄 목표

AI가 Server PostgreSQL을 직접 수정하지 않고 CLOVA OCR의 구조화 결과만 반환하면, Server가 문서 소유권·사업장 권한을 검증하고 실행 이력·후보값·HR 검토 결과를 안전하게 저장합니다.

쉽게 말하면: AI는 문서를 읽어 결과를 알려 주고, 실제 DB 기록과 확정은 Server가 담당합니다.

사용자 흐름

  1. HR이 이미 등록된 Worker Document의 OCR 실행을 요청합니다.
  2. Server가 JWT의 company 범위에서 Document와 File 소유권을 확인합니다.
  3. Server가 OCR 실행을 기록하고 AI Internal OCR API에 원본 파일을 전달합니다.
  4. AI가 정규화된 field와 confidence를 반환합니다.
  5. Server가 허용 field·타입·requestId를 다시 검증하고 후보 결과를 암호화해 저장합니다.
  6. 낮은 신뢰도·필수값 누락은 장애가 아니라 REVIEW_REQUIRED로 표시합니다.
  7. HR이 원본과 대조하여 승인하기 전에는 Worker·Document 확정값을 변경하지 않습니다.

API 범위

Client용 canonical API는 구현 전 #80의 Document 상세 계약과 맞춥니다.

  • POST /api/v1/documents/{documentId}/ocr-runs202 + ocrRunId
  • Document 상세 또는 별도 조회에서 최신 OCR 상태·검토 필요 여부 제공
  • HR 검토·승인 command의 expectedVersion·권한·감사로그 계약 확정

AI Internal API:

Server 구현 범위

  • AiOcrClient Port와 HTTP Adapter
  • 내부 Bearer·timeout·응답 크기·MIME·파일 크기 제한
  • AI 호출 전에 company·worker·document·file 범위 검증
  • AI 응답의 field allowlist·type·confidence 검증
  • OCR 실행 상태와 requestId 멱등성 관리
  • 신규 document_ocr_run에 실행 메타데이터와 암호화된 후보 결과 저장
  • HR 승인 전 Worker·Document 확정값 자동 변경 금지
  • 승인·반려·실패·재시도 감사로그
  • H2 단위/통합 테스트와 PostgreSQL tenant·migration 검증
  • OpenAPI의 202·검토 필요·401·404·409·413·422·502·503·504 예시

저장 구조 원칙

  • 기존 worker_document에는 여권번호·외국인등록번호·실명·주소 같은 OCR 개인정보 컬럼을 펼쳐 넣지 않습니다.
  • OCR 실행과 후보 결과는 document_ocr_run으로 분리합니다.
  • OCR 후보값은 암호화하여 저장하고 일반 로그·오류·Project에 기록하지 않습니다.
  • 체류 만료일처럼 실제 업무에 반영할 값도 HR 승인 후에만 갱신합니다.
  • 여권번호·외국인등록번호는 MVP에서 worker_sensitive_data로 자동 복사하지 않습니다.
  • 실제 개인정보 Pilot 전 #48에서 확정 저장 필요성·조회 권한·보유기간·Vault/KMS 적용을 재결정합니다.

저장소 경계

Server
→ Document/File 소유권 확인
→ AI OCR 호출
→ 결과 검증·암호화 저장
→ HR 검토·감사로그·상태 반영

AI
→ 파일 검증
→ CLOVA Template OCR
→ 허용 field 정규화
→ fields·fieldConfidences 반환

AI에는 Server DB 계정과 Migration 권한을 주지 않습니다.

작업 충돌 방지

#80 병합 전에는 Document Entity·Repository·Flyway를 수정하지 않고, AiOcrClient 계약과 Fake 기반 테스트까지만 진행합니다. Migration은 최신 main에서 다음 사용 가능한 버전을 Draft PR에 먼저 공유합니다.

완료 조건

  • AI Runtime이 Server DB 계정 없이 OCR을 수행합니다.
  • 다른 사업장 Document는 AI 호출 전에 404로 차단됩니다.
  • 같은 Idempotency-Key와 payload는 OCR 실행을 중복 생성하지 않습니다.
  • AI의 임의 field·잘못된 타입·requestId 불일치가 DB에 저장되지 않습니다.
  • HR 승인 전 OCR 후보값이 Worker 확정 정보가 되지 않습니다.
  • 민감 원문이 일반 로그·감사로그·오류 응답에 남지 않습니다.
  • AI timeout·Provider 실패·Server 재시도에도 최신 실행 결과를 덮어쓰지 않습니다.

선행·연계

Metadata

Metadata

Assignees

Labels

area:ai-integrationServer ↔ AI Runtime 내부 계약·Client·검증·trace 연동 영역; Prompt·모델·Provider 구현은 ai 저장소 소유area:serverSpring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외priority:P0MVP 진행을 막는 최우선 핵심 작업security:privacy개인정보·접근권한·토큰·보안 영향이 있는 작업status:in-progress담당자가 현재 구현 중인 작업type:integration외부 LLM·DB·스토리지 등 시스템 간 연동 작업

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions