[BE-60] 지원 건 ↔ 서류 버전 연결 도메인 (FR-85)
작업 내용 (설계 의도)
근거 TDD: 20260808-지원관리-확장-tdd.md — “방안 5 (연결 테이블은 application 소유)“
변경 사항
FR-85는 “하나의 서류 버전을 여러 지원 건에 재사용”하고 “지원 건에는 제출 시점의 서류 버전을 연결하며 이후 새 버전이 생겨도 과거 연결은 바뀌지 않는다”를 요구합니다.
- 연결 테이블은
application컨텍스트가 소유합니다 — “어느 지원에 무엇을 제출했는가”는 지원의 사실입니다.document컨텍스트는 문서 자체만 소유합니다.documentVersionId: Long만 참조해 도메인 교차 참조를 피합니다. - 버전 고정 —
job_application_submitted_documents가application_document_version_id(계열이 아니라 버전)를 가리키므로, 계열에 새 버전이 생겨도 기존 연결이 자동으로 따라가지 않습니다. - 중복 방지 —
UNIQUE (job_application_id, application_document_version_id). 같은 지원에 같은 버전을 두 번 연결하면 409입니다. - 신규 파일만 추가합니다 —
SubmittedDocument.kt,SubmittedDocumentRepository.kt,SubmittedDocumentDomainService.kt. 기존Application.kt·ApplicationDomainService.kt를 건드리지 않습니다(Single Writer — 같은 wave의 다른 티켓과 충돌 없음). - BE-57과 병렬 가능합니다 —
documentVersionId는 Long 참조라 컴파일 의존이 없습니다. 버전 존재 검증(404)은 application 레이어 UseCase(BE-64)가 document DomainService로 수행합니다.
의존
- BE-56 (예외·에러 코드)
다이어그램
처리 흐름
sequenceDiagram participant U as LinkSubmittedDocumentUseCase participant AQ as ApplicationQueryDomainService participant DD as DocumentDomainService participant SD as SubmittedDocumentDomainService participant R as SubmittedDocumentRepository U->>AQ: getBy(applicationId) U->>DD: getVersionBy(documentVersionId) U->>SD: link(applicationId, versionId, submittedAt) SD->>R: save(SubmittedDocument) alt 유니크 위반 R-->>SD: DataIntegrityViolationException SD-->>U: DocumentAlreadySubmittedException else 성공 SD-->>U: SubmittedDocument end
클래스 의존
flowchart LR subgraph Domain["domain/application"] SD[SubmittedDocumentDomainService] Entity[SubmittedDocument] Repo[SubmittedDocumentRepository] end subgraph Infra["infrastructure/application"] Impl[SubmittedDocumentRepositoryImpl] end SD --> Entity SD --> Repo Impl -.implements.-> Repo
테스트 케이스
- 지원 건에 서류 버전을 연결하면 저장되고 조회된다
- 같은 버전을 두 개의 서로 다른 지원 건에 연결할 수 있다 (재사용)
- 같은 지원 건에 같은 버전을 두 번 연결하면
DocumentAlreadySubmittedException이다 - 계열에 새 버전(v3)이 생겨도 v2를 가리키던 연결이 바뀌지 않는다
- 연결을 삭제하면 조회에서 사라지고 문서 버전 자체는 남는다
- 한 지원 건에 서로 다른 유형의 서류 3건을 연결할 수 있다
- 연결이 없는 지원 건 조회 시 빈 목록을 반환한다 (0건 경계)
submittedAt을 지정하지 않으면 현재 시각이 기록된다