[BE-01] 채팅 고도화 스키마 expand 마이그레이션

작업 내용 (설계 의도)

변경 사항

근거 TDD: /Users/biuea/Desktop/dpdpdndn/프로젝트/채팅 시스템/20260704-채팅시스템고도화-tdd.md (ERD·테이블 변경 목록·Release Scenario Phase 0).

무중단 배포의 스키마 먼저 단계. Flyway V38+로 additive 변경만 수행한다. 기존 코드는 새 컬럼/테이블을 모르므로 무영향(ddl-auto: validate이므로 코드보다 스키마가 먼저 존재해야 함).

  • rooms: context_type VARCHAR(30) NULL, context_id BIGINT NULL 추가. 인덱스 idx_rooms_context(context_type, context_id).
  • room_participants: participant_type VARCHAR(20) NOT NULL DEFAULT 'MEMBER', can_speak TINYINT(1) NOT NULL DEFAULT 1, expires_at DATETIME(6) NULL, last_read_message_id BIGINT NULL 추가. 인덱스 idx_rp_expires(participant_type, expires_at, deleted_at).
  • 신규 테이블: room_invitations, communities, community_members (audit·soft-delete 컬럼 포함, [private-db-schema-convention] 준수).
  • 규칙: FK 컬럼 금지, ENUM→VARCHAR, BOOLEAN→TINYINT(1), DATETIME(6), 모든 컬럼·테이블 COMMENT, 인덱스 ALGORITHM=INPLACE, LOCK=NONE. NOT NULL 신규 컬럼(participant_type/can_speak)은 DEFAULT로 기존 행 백필.
  • 위임: 상세 DDL·인덱스 근거는 private-senior-dba 설계 후 private-mysql-implementer가 작성. 본 티켓은 마이그레이션 파일 산출을 대표한다.
  • 롤백: 실패 시 역방향 DDL로 신규 컬럼·테이블 제거(expand-only라 코드 롤백만으로 안전이 기본).

의존

  • 없음 (선행 병목)

다이어그램

처리 흐름

sequenceDiagram
    participant F as Flyway
    participant DB as MySQL8
    F->>DB: ALTER rooms ADD context_type, context_id (INPLACE/LOCK=NONE)
    F->>DB: ALTER room_participants ADD 4 cols (DEFAULT backfill)
    F->>DB: CREATE room_invitations, communities, community_members
    DB-->>F: validate ok

테스트 케이스

  • 로컬 MySQL 8.0에 V1~신규 순서 적용 시 오류 없이 완료된다(exit 0).
  • 기존 rooms/room_participants 행이 있어도 DEFAULT 백필로 participant_type=‘MEMBER’, can_speak=1이 채워진다.
  • 신규 컬럼은 모두 nullable 또는 DEFAULT라 기존 INSERT 경로가 깨지지 않는다.
  • 인덱스 추가가 ALGORITHM=INPLACE, LOCK=NONE으로 락 없이 적용된다.
  • 역방향 DDL로 신규 컬럼/테이블 제거 시 원상 복구된다.