Skip to content

feat: 근로자 기본정보·서류 메타데이터 API 구현 - #40

Merged
chaeliki merged 22 commits into
mainfrom
feat/5-worker-document
Jul 24, 2026
Merged

feat: 근로자 기본정보·서류 메타데이터 API 구현#40
chaeliki merged 22 commits into
mainfrom
feat/5-worker-document

Conversation

@chaeliki

@chaeliki chaeliki commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

왜 필요한가요?

Refs #5

#5 이슈의 근로자 기본정보·서류 메타데이터 API 6개 중 5개(목록 조회 제외)를 구현합니다.
HR이 자신의 사업장 근로자를 안전하게 등록·조회·수정하고, 서류 제출 상태를 관리할 수 있어야 합니다.

V3 migration 스키마는 PR #37 리뷰에서 조율 완료했습니다 (work_status, stay_expiry_date, nationality_code, RESIGNED 확정 — be90ff1). #37은 이 PR의 스키마를 기준으로 V4에 맞춰 rebase 예정입니다.

무엇이 바뀌나요?

  • API·도메인·DB 변경:
    • Worker, WorkerDocument 도메인/JpaEntity, V3__create_worker_document.sql migration 추가 (번호 재조정 가능성 있음)
    • POST/GET/PATCH /api/v1/workers, POST/PATCH /api/v1/workers/{workerId}/documents 5개 API 구현
    • WorkerStatus(기존), DocumentType, SubmissionStatus Enum 추가
    • WorkerErrorCode(404/409) 추가
  • 권한·Workflow 변경: ADMIN/HR은 쓰기, ADMIN/HR/VIEWER는 조회 가능하도록 @PreAuthorize 적용, ActorContext로 사업장 격리
  • AI·외부 연동 변경: 없음
  • 문서·배포 변경: Swagger에 Worker/Worker Document 태그와 스키마 자동 반영

어떻게 검증했나요?

  • ./gradlew clean test
  • ./gradlew build
  • /health와 Swagger UI 확인 (로컬 bootRun으로 직접 확인)
  • 정상 요청 (등록→조회, 서류 등록→수정)
  • 잘못된 입력 (계약기간 역전 → 400)
  • 권한 부족 — VIEWER 쓰기 시도 403 테스트는 아직 없음 (후속 커밋 완료)
  • 다른 사업장 접근 차단 (통합 테스트로 검증)
  • 필요한 상태 전이·Idempotency (낙관적 잠금 expected_version 충돌 시 409)

WorkerSecurityIntegrationTest(5개), WorkerDocumentSecurityIntegrationTest(5개) 전체 통과.
1. 등록→조회 정상 흐름 + 민감정보 미포함 확인
2. PATCH가 보낸 필드만 바꾸고 version이 0→1로 오르는지
3. 오래된 expected_version으로 PATCH하면 409
4. 타 사업장 근로자 조회 시 404
5. 계약기간 역전 시 400 VALIDATION_FAILED

보안·개인정보

  • DTO·로그·AI 입력에 불필요한 개인정보가 없습니다. (여권·외국인등록·전화·계좌번호 미수집)
  • JWT, Worker Link 원본 토큰, API Key, 비밀번호가 없습니다.
  • 모든 사업장 데이터 접근에 company_id 범위를 검사합니다.
  • AI 결과가 자동 승인·발송되지 않습니다. (해당 없음)
  • 관련 Accepted ADR을 지켰습니다. (ADR-0001, ADR-0002)
  • Prompt Builder·Provider SDK·모델 routing 추가하지 않았습니다.

API·DB·운영 영향

  • Swagger/OpenAPI 갱신
  • DB 변경에 Flyway migration이 있습니다.
  • migration 번호·스키마 충돌 — PR #37과 조율 완료
  • 환경변수는 이번 PR에서 새로 추가하지 않았습니다.

리뷰에서 중점 확인할 부분

  • PR #37과의 V3 충돌 조율 결과 → 해결 완료 (be90ff1)

이번 PR에서 하지 않은 것

  • worker_sensitive_data 관련
  • GET /workers 목록 필터

@chaeliki
chaeliki requested a review from hywznn July 23, 2026 17:03
@hywznn

hywznn commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

#40 Worker 스키마 확정 및 병합
→ #37에서 중복 V3 제거
→ #37을 최신 main에 rebase
#37 테스트 데이터와 컬럼명 수정
→ 전체 테스트
#37 병합

이렇게 갑시다 원래 #40 에서 해결하려던 이슈가 먼저이기 때문에 여기 기준으로 Worker스키마를 확정 지은 다음에 제가 v4에 적용해서 맞춰 머지하겠습니다 !

work_status vs employment_status => 사실 별 의미 차이는 없으니 work_status로 하고 제가 수정할게요

visa_expiry_date vs stay_expiry_date => stay_expiry_date | 비자만료냐 체류만료냐인데 이건 ERD나 서비스 내용을 고려했을 때 stay_expiry_date가 맞을 것 같습니다 => 수정이 많이 필요할까요?

nationality vs nationality_code => nationality_code | 나중에 국적 이니셜로 넣기에 이게 편할 것 같아요

RESIGNED vs TERMINATED => 일단 자발적 퇴사라고 해석될 수 있는 RESIGNED를 넣는걸로해서 저도 추가해놓겠습니다 조금 많아진 것 같긴하지만

hywznn
hywznn previously approved these changes Jul 24, 2026
@chaeliki

Copy link
Copy Markdown
Contributor Author

말씀해주신 4가지 확인 후 stay_expiry_date로 치환 완료했습니다 (총 11개 파일, 전체 테스트 통과, be90ff1).

@hywznn hywznn left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

바꾸느라 고생 많으셨습니다 !!

@hywznn
hywznn marked this pull request as ready for review July 24, 2026 01:59
@chaeliki
chaeliki merged commit f8637a0 into main Jul 24, 2026
1 check passed
@chaeliki
chaeliki deleted the feat/5-worker-document branch July 24, 2026 02:10
@chaeliki chaeliki added the area:server Spring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외 label Jul 24, 2026
@chaeliki chaeliki added priority:P0 MVP 진행을 막는 최우선 핵심 작업 security:privacy 개인정보·접근권한·토큰·보안 영향이 있는 작업 type:feature 사용자 또는 Agent가 사용하는 기능 개발 labels Jul 24, 2026
@chaeliki chaeliki self-assigned this Jul 24, 2026
hywznn added a commit that referenced this pull request Jul 24, 2026
* feat(worker): Workflow 참조용 Worker core schema 추가

* feat(task): 승인 연동용 Task 상태 전이 core 추가

* feat(approval): 승인·감사 저장 모델 추가

승인 스냅샷, 외부 제출, 증빙, 감사 이벤트를 V5 마이그레이션과 JPA 저장소로 구성합니다.
사업장 범위 외래키와 상태·버전 제약을 추가하고 감사 이벤트는 일반 수정·삭제 경로 없이 append 방식으로만 기록합니다.

* feat(approval): 승인 흐름과 감사 조회 API 구현

승인 요청·승인·반려·외부 제출·증빙·완료 command를 상태 전이와 같은 transaction에서 처리합니다.
민감정보를 차단하는 snapshot 검증과 fingerprint, request/trace 감사 기록, 사업장 범위 활동 이력과 ADMIN cursor 검색 API를 추가합니다.

* fix(approval): 승인 revision 계약을 ADR과 정렬

JPA 동시성 version과 승인 대상 내용의 content_revision을 분리합니다.
승인은 content revision과 핵심값 fingerprint가 모두 일치할 때만 재사용하고, 중요값 변경 시 revision을 증가시켜 기존 승인을 무효화합니다.
ADR-0003에 맞춰 외부 제출과 완료의 허용 상태도 보정합니다.

* fix(api): 승인 API 계약을 ADR과 정렬

요청·응답 필드를 명시적인 snake_case 계약으로 고정하고 보호 API의 401·403 및 409·422 오류를 OpenAPI에 문서화합니다.
Task 상태 전이와 동시성 오류 코드를 Accepted ADR의 안정적인 코드로 통일합니다.

* test(approval): 승인·감사 보안 시나리오 검증

정상 승인·반려 기반 상태 전이, 민감정보 유입 시 transaction rollback, 역할·사업장 격리, stale version, cursor pagination을 HTTP 통합 테스트로 검증합니다.
PostgreSQL migration 계약에도 Worker·Task·Approval·Audit schema와 tenant-aware FK를 추가합니다.

* docs(approval): 승인·감사 사용 흐름 안내

현재 구현 API와 migration 목록을 갱신하고 승인 snapshot, version·revision 구분, 역할·감사 조회 규칙을 초보자도 따라갈 수 있게 설명합니다.

* test(approval): 반려와 감사 실패 rollback 보강

반려된 승인 요청의 재사용 차단, 외부 제출 reference 누락 시 상태 보존, 감사 이벤트 저장 실패 시 Task·Approval·전이 이력 전체 rollback을 통합 테스트합니다.

* test(approval): 동시 승인 경쟁 검증

동일 Task version에 대한 두 승인 요청을 동시에 실행해 하나만 성공하고 다른 요청은 409로 차단되며 승인·감사 기록도 하나만 남는지 반복 검증합니다.

* test(db): PostgreSQL Task fixture 필수 시각 보완

PostgreSQL migration 계약 테스트의 Task INSERT에 필수 created_at·updated_at을 명시해 실제 V4 NOT NULL 제약과 일치시킵니다.

* fix(approval): 필수정보 검증을 서버 책임으로 이동

Client가 requirements_satisfied 값을 보내는 계약을 제거하고 Task 상태와 미완료 필수 체크리스트를 서버가 직접 조회해 승인 검토 가능 여부를 판단합니다.
필수 체크리스트가 남은 Task는 승인 요청·상태 전이·감사 기록이 생성되지 않는 통합 테스트를 추가합니다.

* fix(db): #40 Worker 스키마와 승인 테스트 정합성 반영

* fix(approval): 중복 승인 시 버전 충돌을 우선 반환
hywznn added a commit that referenced this pull request Jul 24, 2026
* feat(workflow): Knowledge Catalog 투영본 연결

Knowledge 저장소의 Workflow 정의를 Server용 read-only projection으로 검증하고 로드합니다.

운영 환경에서는 RELEASED bundle만 허용하고 Task 유형, 필수 slot, checklist, 출처 version을 고정합니다.

* feat(task): 업무카드와 체크리스트 실행 규칙 구현

Worker 최소 조회 경계, tenant 범위 Repository, required slot 평가, 낙관적 잠금과 상태 전이를 연결합니다.

중요값 또는 필수 checklist 변경 시 승인 snapshot을 무효화하고 Audit·Transition을 같은 transaction에 기록합니다.

* feat(api): Task Workflow 7개 API 공개

Workflow Catalog와 Task 목록·생성·상세·수정·checklist·취소 endpoint를 /api/v1 계약으로 제공합니다.

snake_case, JWT role, company 격리, expected_version과 409·422 오류 계약을 OpenAPI에 반영합니다.

* test(task): 권한·격리·상태·동시성 시나리오 검증

7개 API 흐름, 타 사업장 은닉, Viewer 쓰기 차단, 민감정보 거부와 승인 무효화를 통합 테스트합니다.

동시 수정은 하나만 성공하고 OpenAPI version·snake_case 계약이 유지되는지 검증합니다.

* fix(task): 승인 후 중요값 수정 계약을 ADR과 정렬

필수정보와 checklist가 충분하면 기존 승인을 무효화한 뒤 수정본 snapshot을 새로 만들고 READY_FOR_REVIEW로 전환합니다.

문서 종류·상태 metadata는 허용하되 여권번호 등 실제 민감 식별값은 계속 차단합니다.

* docs(task): 업무카드 개발·운영 흐름 문서화

7개 Task Workflow API, expected_version, 승인 무효화와 Knowledge projection 운영 방법을 README와 환경변수 예시에 추가합니다.

Conventional Commits의 type·scope는 영문으로 유지하고 설명은 한국어로 작성하도록 기여 규칙을 맞춥니다.

* fix(task): #40 Worker 상태 계약과 업무 생성 조건 정렬
@chaeliki chaeliki linked an issue Jul 24, 2026 that may be closed by this pull request
25 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:server Spring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외 priority:P0 MVP 진행을 막는 최우선 핵심 작업 security:privacy 개인정보·접근권한·토큰·보안 영향이 있는 작업 type:feature 사용자 또는 Agent가 사용하는 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker] 근로자 기본정보·서류 메타데이터 API 구현

2 participants