[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로 신규 컬럼/테이블 제거 시 원상 복구된다.