[BE-60] 지원 건 ↔ 서류 버전 연결 도메인 (FR-85)

작업 내용 (설계 의도)

근거 TDD: 20260808-지원관리-확장-tdd.md — “방안 5 (연결 테이블은 application 소유)“

변경 사항

FR-85는 “하나의 서류 버전을 여러 지원 건에 재사용”하고 “지원 건에는 제출 시점의 서류 버전을 연결하며 이후 새 버전이 생겨도 과거 연결은 바뀌지 않는다”를 요구합니다.

  1. 연결 테이블은 application 컨텍스트가 소유합니다 — “어느 지원에 무엇을 제출했는가”는 지원의 사실입니다. document 컨텍스트는 문서 자체만 소유합니다. documentVersionId: Long만 참조해 도메인 교차 참조를 피합니다.
  2. 버전 고정job_application_submitted_documentsapplication_document_version_id(계열이 아니라 버전)를 가리키므로, 계열에 새 버전이 생겨도 기존 연결이 자동으로 따라가지 않습니다.
  3. 중복 방지UNIQUE (job_application_id, application_document_version_id). 같은 지원에 같은 버전을 두 번 연결하면 409입니다.
  4. 신규 파일만 추가합니다 — SubmittedDocument.kt, SubmittedDocumentRepository.kt, SubmittedDocumentDomainService.kt. 기존 Application.kt·ApplicationDomainService.kt를 건드리지 않습니다(Single Writer — 같은 wave의 다른 티켓과 충돌 없음).
  5. 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을 지정하지 않으면 현재 시각이 기록된다