공고알림앱 구현 통합 DAG (BE · FE · DB)
작성: private-tpm / 2026-07-22
범위: 1단계 = PRD P0 전부. dev 배포(main 머지)까지. prod·P1·P2 제외.
근거: BE TDD / DB 설계 / FE 설계 / tickets(BE-0129, FE-0118) / 조사 브리프.
요약
BE 29건 · FE 18건, 총 47 티켓. BE·FE는 병렬 트랙 이다 — FE는 MSW 목(FE-04)으로 BE 완료를 기다리지 않는다.
도메인 간 엣지는 단 하나 : BE API 티켓(BE-12~19) 머지 → FE-17(실 API 통합). 그 외 FE 화면은 전부 목 기반이라 BE와 시간축이 분리된다.
DB는 별도 인프라 레포 wave가 없다 — 앱 레포 내 Flyway V1을 BE-01이 작성 한다. Kafka·Redis 없음.
최선행 병목: BE-01 (빌드·패키지·V1 스키마·공통 계약·compose) — BE 전 티켓의 조상. FE-01(FE 스캐폴딩)은 BE-01과 독립 병렬.
도메인 간 계약 정합 (TPM 확인 결과)
계약 BE 소유 FE 소비 정합 매칭 기준 CRUD·재평가 BE-12 / BE-13 FE-07 일치 지원 상태·전이·목록 BE-14 FE-11 / FE-13 / FE-14 일치 면접 회차 BE-15 FE-15 / FE-16 일치 회사 등록·목록·승격 (companyOrigin 필터, brokenSourceCount) BE-17 FE-08 / FE-09 일치 (FE 요청 #5 회사 목록 고장 개수 필드 → 티켓 확정) 애그리게이터 소스 등록·목록·삭제·카테고리 (POST/GET/DELETE /api/aggregator-sources, categories?platform=) BE-17 (AggregatorSourceApiController 분리)FE-18 / FE-17 일치 — FE-18의 “신규 BE 티켓” 모호성은 BE-17이 흡수 공고 조회·상세·수동 등록 BE-18 FE-10 / FE-11 / FE-12 일치 운영 조회 (수집·발송 이력) BE-19 FE-06 일치 (BE-19는 BE wave4) BE 도메인 모델 ↔ DB 20테이블 BE-02~06 design-db (SSOT) 일치 — V1은 design-db를 그대로 반영, 후행 DDL 추가 없음
FE-17 3차 갱신 기준 계약 12건(1차 9 + 2차 3) 전부 확정 — 미해소 계약 없음. FE-17 게이트 시점에 types/api.ts ↔ 실 API 최종 정합화가 티켓 작업 범위에 포함됨.
이벤트 계약(Kafka/Redis) 해당 없음.
senior-pm 정합 검증(게이트 ②)은 태스크 지시상 완료·구현 승인됨. 별도 검증 아티팩트 파일은 프로젝트 디렉토리에 없어 사용자 단언에 근거함 — FE-17(실 API 통합) 게이트에서 필드 단위 재검증이 자연 발생 지점이다.
통합 DAG (Mermaid)
flowchart LR
subgraph IW1["IW1 스캐폴딩 (w2)"]
BE01[BE-01 빌드·V1스키마·공통계약]
FE01[FE-01 FE스캐폴딩·테마]
end
subgraph IW2["IW2 도메인·기반 (w8)"]
BEdom[BE-02~06 도메인 5]
FEbase[FE-02·03·04 프리미티브·로직·MSW]
end
subgraph IW3["IW3 어댑터·API·화면 (w25)"]
BEmid[BE-07~18·22·23·24·26~29 어댑터·API·배치 19]
FEmid[FE-05~09·18 표시·페이지 6]
end
subgraph IW4["IW4 오케·집계·화면 (w8)"]
BE1925[BE-19·25 운영API·집계수집 2]
FEpage[FE-10~15 공고·지원 화면 6]
end
subgraph IW5["IW5 E2E·타임라인 (w2)"]
BE20[BE-20 E2E 시나리오]
FE16[FE-16 지원 상세 타임라인]
end
subgraph IW6["IW6 통합·배포 (w2)"]
BE21[BE-21 compose 부트스트랩]
FE17[FE-17 앱셸·실API통합·web compose]
end
BE01 --> BEdom --> BEmid --> BE1925 --> BE20 --> BE21
FE01 --> FEbase --> FEmid --> FEpage --> FE16 --> FE17
BEmid -->|BE-12~18 머지| FE17
BE1925 -->|BE-19 머지| FE17
wave별 너비 분포 (fan-out 게이트)
통합 wave BE FE 너비 성격 IW1 BE-01 FE-01 2 스캐폴딩 조인(불가피 병목) IW2 BE-02·03·04·05·06 FE-02·03·04 8 도메인·기반 fan-out IW3 BE-0718·22·23·24·2629 (19) FE-05·06·07·08·09·18 (6) 25 최대 fan-out IW4 BE-19·25 FE-10·11·12·13·14·15 (6) 8 오케스트레이션·화면 IW5 BE-20 FE-16 2 E2E·타임라인 조인 IW6 BE-21 FE-17 2 통합·배포 조인
평균 너비 ≈ 7.8. 벌크 wave(IW2·3·4)가 넓다. 좁은 wave(IW1·5·6)는 스캐폴딩/E2E/통합의 본질적 조인 지점 이라 직렬화 실패가 아니다. fan-out 게이트 통과.
도메인 간 게이트 목록 (TPM이 관리)
게이트 여는 조건 막는 후행 검증 근거 G0 BE 시작 BE-01 머지 (V1 스키마 Testcontainers 적용 + 빌드 성공) BE-02~29 전부 infra-reviewer(V1 SQL) + code-reviewer APPROVED/COMMENT, ./gradlew test exit 0 G0’ FE 시작 FE-01 머지 FE-02~18 전부 code-reviewer, tsc --noEmit·lint·npm test exit 0 G1 FE 실API 통합 BE-12~19 전부 main 머지 FE-17 각 BE API 티켓 code-reviewer APPROVED + 테스트 exit 0. FE-17에서 types/api.ts↔실API 대조 G2 dev 배포 각 wave main 머지 시점 — main 머지 = dev 배포 트리거
G1은 FE-17이 IW6(FE-16 이후)에 자연 배치되므로, BE-19(IW4) 머지가 시간상 선행해 자동 충족 된다. TPM은 IW4 BE 완료를 확인한 뒤 G1을 명시적으로 연다.
회색지대 소스(BE-26~29) 규약 준수는 IW3 완료 게이트의 필수 항목 — 특히 BE-28(잡코리아) SourceRequestExecutor 경로 화이트리스트 차단 테스트가 통과해야 IW3를 닫는다.
브랜치·머지 전략 (private-branch-convention)
각 티켓 = origin/main 기준 독립 숏텀 브랜치 + 전용 worktree. feat/BE-01-scaffolding 형식.
리뷰 통과 즉시 main 머지 → 브랜치·worktree 삭제. 장수명 피처 브랜치·wave 단위 통합 브랜치 금지.
같은 wave 티켓은 Single Writer per File로 파일 교집합 ∅ (senior 분해 시 검증됨). BE-01의 build.gradle.kts·application.yml·루트 docker-compose.yml은 후행 wave에서 미수정 — FE-17만 예외적으로 루트 compose에 web 서비스 추가(시간축 분리로 충돌 없음).
후행 wave는 선행 wave 머지 후 최신 main을 다시 base로 딴다.
실행 위임
BE wave 지휘 → private-senior-be : wave 내 티켓을 private-be-implementer 팀으로 병렬 스폰(TDD RED→GREEN→REFACTOR 강제), wave마다 private-code-reviewer 게이트(REQUEST_CHANGES면 수정 후 재리뷰). 마이그레이션 SQL 포함 티켓(BE-01)은 private-infra-reviewer 병행.
FE wave 지휘 → private-senior-fe : 동일. private-fe-implementer 팀 + private-code-reviewer.
TPM은 도메인 사이 게이트(G0/G0’/G1/G2)만 관리하고 도메인 내부 분해·구현에 개입하지 않는다.
Document History
날짜 변경 2026-07-22 최초 작성 — 통합 DAG·게이트·너비 분포·계약 정합