[INFRA-02] base compose — backend·MySQL·Mongo·Redis·Kafka 편입
작업 내용 (설계 의도)
변경 사항
근거 TDD: ../TDD.md “compose 파일 소유 경계”, “스택 격리”. ADR-001/002. 현재 docker-compose.yml엔 mock류만 있고 backend·데이터스토어가 없다(FR-1 선행). base compose에 서비스 정의를 신설하되 호스트 포트·환경별 값은 넣지 않는다(override 담당). 이 파일은 ⑧만 쓰는 소유 파일 — ⑤·⑦는 별도 -f로 얹는다.
- 신규 서비스(서비스명 확정):
backend(imagesports-backend:${DOCKER_TAG:-local}, 내부 8080, healthcheck/actuator/health,depends_onDB healthy),mysql(8.0,MYSQL_DATABASE=sports),mongodb,redis,kafka(KRaft 단일 브로커, ZooKeeper 없음). MongoDB 서비스명은 반드시mongodb(mongo아님). - 데이터 인프라 단일 소유자 경계 노트 (senior-pm 정합 #4): 데이터스토어(
mysql/mongodb/redis/kafka)·backend의 단일 소유자는 이 base compose다. ⑤ observability는 이 서비스들을 재정의하지 않고docker-compose.observability.yml에서 exporter 대상으로 참조만 한다(⑤ exporter가mongodb서비스명으로 접속). base가 서비스 명명의 SSOT다. - 기존 mock(minio·mock-pg·mock-servers·mailhog) 유지(제거 0 — 하위 호환).
- backend
environment는 내부 서비스명 참조(DB_URL=jdbc:mysql://mysql:3306/sports,MONGODB_URI=mongodb://mongodb:27017/sports,REDIS_HOST=redis,KAFKA_BOOTSTRAP_SERVERS=kafka:9092) — 두 스택 내부 포트 동일, 호스트 포트만 override에서 분리. .env.example에DOCKER_TAG·DB 크리덴셜 키 문서화.- 각 DB 서비스에 named volume + healthcheck 지정.
롤백: 앱·DB 서비스 추가는 additive라 파일 revert로 원복(기존 mock 무영향).
의존
- 없음 (INFRA-01 이미지는 런타임 참조 — 파일 작성엔 불필요)
다이어그램
클래스 의존
flowchart LR Base["docker-compose.yml (base)"] --> Be["backend :8080"] Base --> My["mysql :3306"] Base --> Mo["mongodb :27017"] Base --> Re["redis :6379"] Base --> Ka["kafka :9092"] Base --> Mock["기존 mock 유지"] Be -.depends_on healthy.-> My Be -.depends_on healthy.-> Ka
테스트 케이스
docker compose -f docker-compose.yml config가 exit 0으로 병합 유효성을 통과한다- base 단독에는 호스트 포트 매핑이 없다(override 없이는 포트 미노출)
- 기존 mock 7종이 그대로 존재한다(제거 0건)
- backend가
depends_onDB healthy 조건을 갖는다 - kafka가 KRaft 모드(ZooKeeper 서비스 없음)로 정의된다
- backend
environment가 내부 서비스명(mysql/mongodb/redis/kafka)을 참조한다 - MongoDB 서비스명이
mongodb다(mongo아님 — ⑤ exporter 접속 기준) - base가 exporter·관측 스택을 정의하지 않는다(⑤ 소유 — 중복 정의 0)