테마
Story: Product 테이블 스키마 변경 (Soft Delete)
메타
| 항목 | 값 |
|---|---|
| Story ID | E-09-S-01 |
| Epic | E-09 미사용 상품 정리 |
| 상태 | ready-for-dev |
| 우선순위 | P0 |
| 규모 | S |
| 담당 개발자 | BE (DB) |
사용자 스토리
As a 시스템,
I want 상품 삭제 상태를 추적하고 싶다,
So that Soft Delete와 복구 기능을 지원할 수 있다.
수락 기준 (Acceptance Criteria)
AC-01: 스키마 변경
| 항목 | 내용 |
|---|---|
| Given | Product 테이블에 |
| When | 마이그레이션을 실행하면 |
| Then | deleted_at, deleted_by 컬럼이 추가된다 |
AC-02: 인덱스 추가
| 항목 | 내용 |
|---|---|
| Given | deleted_at 컬럼에 |
| When | 인덱스를 생성하면 |
| Then | Soft Delete 필터 쿼리 성능이 보장된다 |
AC-03: 기본값 설정
| 항목 | 내용 |
|---|---|
| Given | 기존 상품 데이터에 |
| When | deleted_at이 NULL이면 |
| Then | 삭제되지 않은 상품으로 조회된다 |
태스크 분해
Task 1: 스키마 변경
- [ ] 1.1: deleted_at 컬럼 추가sql
ALTER TABLE Product ADD COLUMN deleted_at DATETIME NULL; - [ ] 1.2: deleted_by 컬럼 추가sql
ALTER TABLE Product ADD COLUMN deleted_by VARCHAR(50) NULL; -- 'seller': 셀러 직접 삭제 -- 'system': 시스템 자동 삭제
Task 2: 인덱스 생성
- [ ] 2.1: deleted_at 복합 인덱스sql
CREATE INDEX idx_product_deleted ON Product (seller_id, deleted_at); - [ ] 2.2: 기존 인덱스 영향도 분석
Task 3: 마이그레이션
- [ ] 3.1: 마이그레이션 스크립트 작성
- [ ] 3.2: 롤백 스크립트 준비
- [ ] 3.3: 스테이징 환경 테스트
개발 노트
스키마 변경 상세
sql
-- Product 테이블 변경
ALTER TABLE Product
ADD COLUMN deleted_at DATETIME NULL,
ADD COLUMN deleted_by VARCHAR(50) NULL;
-- 인덱스 추가 (셀러별 삭제 상품 조회용)
CREATE INDEX idx_product_deleted ON Product (seller_id, deleted_at);
-- 영구 삭제 배치용 인덱스
CREATE INDEX idx_product_deleted_at ON Product (deleted_at);주의사항
⚠️ Product 테이블 특성
• 658만 row, 8.9GB
• Full scan 절대 금지
• ALTER TABLE 시 Online DDL 사용 권장
• 피크 타임 피해서 작업이벤트 로깅
| 이벤트 | 파라미터 |
|---|---|
schema_migration_started | table_name, columns |
schema_migration_completed | table_name, duration |
생성일: 2026-01-20
