Skip to content

feat: 근로자 명단 파일 가져오기와 행 검증 API 구현 - #113

Merged
hywznn merged 10 commits into
feat/95-ocr-run-storagefrom
feat/14-worker-import
Aug 8, 2026
Merged

feat: 근로자 명단 파일 가져오기와 행 검증 API 구현#113
hywznn merged 10 commits into
feat/95-ocr-run-storagefrom
feat/14-worker-import

Conversation

@hywznn

@hywznn hywznn commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

왜 필요한가요?

Refs #14

HR이 CSV/XLSX 근로자 명단을 올린 뒤 곧바로 DB에 넣지 않고, 열 연결과 행별 오류 검토를 거쳐 선택한 정상 행만 안전하게 등록할 수 있어야 합니다.

이 PR은 #112 위에 쌓인 Draft PR입니다. #112를 먼저 병합한 뒤 base를 main으로 변경하고 최종 검증합니다.

사용 흐름

파일 업로드 → 열 연결 → 행 검증 → 오류 수정·제외 → 정상 행 선택 등록

상태는 UPLOADED → MAPPED → REVIEW_REQUIRED 또는 READY → COMMITTED로 관리합니다.

무엇이 바뀌나요?

  • UTF-8 CSV와 XLSX 명단 파서를 추가했습니다.
  • 최대 5MB·1,000행·50열·셀당 500자로 입력 크기를 제한했습니다.
  • CSV 수식 문자와 XLSX Formula Cell을 거부합니다.
  • 여권번호·외국인등록번호·계좌번호 및 MVP 수집 제외 개인정보 열을 차단합니다.
  • 원본값, HR 수정값, 정규화값과 행별 오류를 분리해 저장합니다.
  • 정상 행만 기존 Worker 도메인 규칙으로 등록합니다.
  • 생성 요청에 Idempotency-Key와 version 검증을 적용했습니다.
  • 확정에 사용한 모든 Idempotency-Key·요청 hash·성공 응답 snapshot을 별도 테이블에 보존해 A → B → A 재시도도 최초 A 결과를 반환합니다.
  • 같은 확정 키를 다른 선택 행에 재사용하면 409 IMPORT_IDEMPOTENCY_CONFLICT로 거부합니다.
  • XLSX 날짜 셀은 화면 표시 형식과 관계없이 YYYY-MM-DD로 정규화합니다.
  • 사업장 격리용 tenant-aware FK와 PostgreSQL RLS 준비 정책을 추가했습니다.
  • 생성·열 연결·검증·수정·등록·재검증을 감사로그에 남깁니다.
  • Swagger/OpenAPI와 초보자용 연동 문서를 추가했습니다.

주요 API

  • POST /api/v1/imports
  • GET /api/v1/imports/{importId}
  • PUT /api/v1/imports/{importId}/mappings
  • POST /api/v1/imports/{importId}/validate
  • PATCH /api/v1/imports/{importId}/rows
  • POST /api/v1/imports/{importId}/commit
  • POST /api/v1/imports/{importId}/retry

Migration

  • V32__create_worker_import.sql
  • V33__prepare_worker_import_rls.sql

검증

  • ./gradlew clean test 성공
  • CSV/XLSX·수식·민감정보 열 차단 테스트 성공
  • 빈 명단·1,000행 경계·1,001행 거부 테스트 성공
  • 부분 등록·오류 수정·재검증·중복 요청 방지 통합 테스트 성공
  • 다른 사업장 404 및 PostgreSQL RLS 격리 테스트 성공
  • OpenAPI 7개 경로·snake_case·오류 응답 계약 테스트 성공

남은 운영 연계

  • 원본 파일 만료 예정 시각과 보존기간 설정은 저장합니다.
  • 만료된 실제 파일을 삭제하는 배치는 File Storage·Infra 운영 정책과 연결해야 하므로 이 PR에서 임의로 추가하지 않았습니다.

Draft 상태에서 API 계약, 개인정보 차단 범위와 migration 순서를 먼저 검토받습니다.

@hywznn
hywznn requested review from chaeliki and krestar August 7, 2026 15:35
@hywznn
hywznn marked this pull request as ready for review August 7, 2026 17:39
@krestar

krestar commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

현준님 #16 화면기준
Figma [PWF] Prototype-WireFrame-3rd의 05_Desktop Core Product > SETTINGS

SETTINGS가 05_Desktop Core Product 에는 없고,
구현해야 되는 게 신도림에서 권한 관련 UI 빼기로 한PWF3/Screen/SET-001 같은데,

PWF3/Screen/SET-001 보고 하면 되는거 맞는지 내일 함만 확인 부탁드려요

@hywznn

hywznn commented Aug 8, 2026

Copy link
Copy Markdown
Contributor Author

현준님 #16 화면기준 Figma [PWF] Prototype-WireFrame-3rd의 05_Desktop Core Product > SETTINGS

SETTINGS가 05_Desktop Core Product 에는 없고, 구현해야 되는 게 신도림에서 권한 관련 UI 빼기로 한PWF3/Screen/SET-001 같은데,

PWF3/Screen/SET-001 보고 하면 되는거 맞는지 내일 함만 확인 부탁드려요

사실 이건 피그마도 피그마인데 client 화면보고 하시는게 정배인 것 같습니다 일단 기반은 말씀하신대로 SEt-001이 맞습니다

@hywznn
hywznn merged commit 15a5af3 into feat/95-ocr-run-storage Aug 8, 2026
@hywznn
hywznn deleted the feat/14-worker-import branch August 8, 2026 01:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants