모집·커뮤니티·시설상품·소모임예약·게시글연동 — 크로스 도메인 통합 DAG (TPM)

작성: 2026-07-07 · 레포: /Users/biuea/sports-application · 베이스: origin/dev 5ff07c7c (fresh, HEAD==origin/dev) feature 브랜치(단일 누적): feat/domain-gap-recruitment-facility-20260707 (통합 브랜치 금지, 최종 1 PR→dev는 메인 세션이 수행)

근거 문서

  • TDD A: 20260707-post-community-연동-tdd.md
  • TDD B: 20260707-모집-시설상품-소모임예약연동-tdd.md
  • DB 설계: 20260707-모집커뮤니티연동-design-db.md (S1~S6)
  • FE 앱: 20260707-...-design-fe-app.md / FE 웹: 20260707-...-design-fe-web.md
  • SSOT: 아키텍트 20260706-...-architecture.md, 두 PRD

계약 정합 (크로스 도메인)

계약확인
posts additive + GET /communities/{id}/posts ↔ FE-app A-P2~P5✓ (모임글 sportCategory 상속·미전송)
recruitment 7 + GET /applications(내 신청, principal) ↔ FE-app A-R1~R6✓ senior-pm 보강 반영
SlotResponse.status/programId·FacilityResponse 임베드 ↔ FE-app A-F1/A-F2·FE-web W-SL/W-OH/W-HD
도메인 모델 ↔ DB 테이블✓ design-db 자가점검 1:1
이벤트 계약신규 Kafka 0건(동기+Layer1), 신규 Redis 키 0건 → kafka/redis implementer 불요
미결(비차단)FE cancellation-preview 역제안 — BE 미포함, FE 클라 계산 fallback 존재

인프라 마이그레이션 (design-db S1~S6, Flyway 시작 V56)

단계산출저장소
S1V56 신규 4테이블(recruitments·applications·programs·community_bookings)+인덱스/UNIQUEMySQL
S2V57 posts 3컬럼(community_id·sport_category·global_listed)MySQL
S3V58 posts 인덱스 3종(A-Q1/Q2/Q3)MySQL
S4V59 slots 2컬럼(program_id·status DEFAULT OPEN)MySQL
S5V60 slots 인덱스(B-Q6)MySQL
S6facilities $jsonSchema validator(moderate, operating_hours/holidays optional)Mongo

통합 DAG (도메인 × wave × 티켓)

flowchart LR
    subgraph W0["W0 인프라"]
        MY["MySQL S1~S5 (V56~V60)"]
        MO["Mongo S6 validator"]
    end
    subgraph BEW1["BE W1 거버넌스·독립코어"]
        B20[BE-20 SportCategory→common]
        B22[BE-22 문서거버넌스]
        B50[BE-50 core 등록]
        B51[BE-51 recruitment 코어]
        B56[BE-56 facility VO]
        B57[BE-57 Slot status/programId]
    end
    subgraph BEW2["BE W2"]
        B23[BE-23 Post 모델]
        B24[BE-24 검색조건]
        B52[BE-52 recruitment 서비스]
        B58[BE-58 자동슬롯]
        B59[BE-59 program]
        B60[BE-60 community booking]
    end
    subgraph BEW3["BE W3"]
        B25[BE-25 PostDomainService]
        B26[BE-26 조회쿼리]
        B27[BE-27 응답DTO]
        B53[BE-53 recruitment presentation]
        B55[BE-55 payment OrderType]
    end
    subgraph BEW4["BE W4 post usecases"]
        B28[BE-28]
        B29[BE-29]
        B30[BE-30]
        B31[BE-31]
        B32[BE-32]
        B33[BE-33]
    end
    subgraph BEW5["BE W5 post controllers"]
        B34[BE-34]
        B35[BE-35]
        B36[BE-36]
    end
    W0 --> BEW1
    B20 --> B23
    B20 --> B24
    B20 --> B60
    B51 --> B52
    B56 --> B58
    B57 --> B58
    B57 --> B59
    B23 --> B25
    B24 --> B25
    B52 --> B53
    B52 --> B55
    B25 --> B28
    B25 --> B32
    B25 --> B33
    B28 --> B34
    B33 --> B36
    BEW5 --> FEAPP["FE-app 게이트"]
    BEW3 --> FEWEB["FE-web 게이트"]

BE→FE 게이트

  • FE-web 게이트: BE facility 계약(BE-56 임베드·BE-57 slot status·BE-59 program 착지) 후 오픈. FE-web W1(FE-26 types·FE-27 dark toggle)은 BE 무의존이라 게이트와 병렬 가능.
  • FE-app 게이트: BE post 컨트롤러(W5)·recruitment presentation(BE-53)·payment(BE-55) 착지 후 오픈 — 앱이 소비하는 최종 계약이 posts라 W5 완료가 기준.

Wave 상세 + 너비 분포

Wave티켓너비Single-Writer 비고
W0 인프라MySQL(S1~S5), Mongo(S6)2저장소 분리 → 파일 교집합 ∅
BE W1BE-20·22·50·51·56·576전부 다른 패키지(common/docs/test상수/recruitment/facility/booking)
BE W2BE-23·24·52·58·59·606BE-58·59 booking/facility 동일 도메인 — senior-be가 파일 충돌 시 순차화
BE W3BE-25·26·27·53·555BE-53(controller) vs BE-55(payment OCGImpl) 분리
BE W4BE-28·29·30·31·32·336전부 별도 UseCase 파일
BE W5BE-34·35·3633개 컨트롤러 분리
FE-app W1FE-01·02·03·04·055api/types 미러링·플래그
FE-app W2FE-06·07·08·09·105
FE-app W3FE-11~23 (13)13화면별 파일 분리
FE-app W4FE-24·252통합(라우트·모임상세 배선)
FE-web W1FE-26·272types·dark toggle
FE-web W2FE-28·29·303lib+BFF
FE-web W3FE-31·32·333섹션 컴포넌트
FE-web W4FE-341통합 티켓(단독)
  • 직선형(전 wave 1~2) 아님 → 분해 성공. 평균 너비 BE≈4.7, FE-app≈6.3.

게이트 규칙

  • 각 wave 종료: 변경 모듈 테스트 실제 실행 exit 0(raw) + code-reviewer(BE/FE)/infra-reviewer verdict APPROVED|COMMENT.
  • REQUEST_CHANGES → 담당 수정 후 재리뷰, 통과 전 다음 wave 미개방.
  • 실패/차단은 즉시 메인 보고(영향 범위 = 막히는 후행 개수 명시).

운영 제약 (준수)

  • implementer isolation:worktree, 최신 origin/dev(=feature 브랜치 tip) 기반 분기.
  • 마이그레이션 머지 직전 uniq -d 재검사(V56~V60 중복 방지).
  • testcontainers reuse 끔, qa-/doodlin- 컨테이너 삭제 금지.
  • 테스트명에 티켓ID 금지. enum String 변환 비교 금지.
  • push/PR/머지는 메인 세션 — 이 세션은 feature 브랜치 커밋까지만.

Document History

날짜변경
2026-07-07최초 — 통합 DAG(W0 인프라→BE W1~5→FE-app/web 병렬), 계약 정합 PASS(미결 1 비차단), 인프라 wave 착수