[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(image sports-backend:${DOCKER_TAG:-local}, 내부 8080, healthcheck /actuator/health, depends_on DB healthy), mysql(8.0, MYSQL_DATABASE=sports), mongodb, redis, kafka(KRaft 단일 브로커, ZooKeeper 없음). MongoDB 서비스명은 반드시 mongodb(mongo 아님).
  • 데이터 인프라 단일 소유자 경계 노트 (senior-pm 정합 #4): 데이터스토어(mysql/mongodb/redis/kafkabackend의 단일 소유자는 이 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.exampleDOCKER_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_on DB healthy 조건을 갖는다
  • kafka가 KRaft 모드(ZooKeeper 서비스 없음)로 정의된다
  • backend environment가 내부 서비스명(mysql/mongodb/redis/kafka)을 참조한다
  • MongoDB 서비스명이 mongodb다(mongo 아님 — ⑤ exporter 접속 기준)
  • base가 exporter·관측 스택을 정의하지 않는다(⑤ 소유 — 중복 정의 0)