# 09. Migration Plan

## 1. 전환 원칙

1. 레거시를 그대로 복제하지 않는다.
2. 사용자가 북마크한 주요 URL은 301 리다이렉트한다.
3. 데이터 이관 전 `source -> target` 매핑 테이블을 먼저 만든다.
4. 중복 카탈로그는 신규 모델로 통합하되, 원본 출처를 보존한다.
5. 기부/결제/예약 내역은 감사 가능성이 있으므로 손실 없이 읽기 전용 보관한다.

## 2. 대상 시스템

| 시스템 | 주요 데이터 | 처리 |
|---|---|---|
| 놀고팜 | 체험, 숙소, 캠핑, 스토어, 우수체험관, 예약, 회원 | 신규 CatalogItem/TravelProduct로 이관 |
| 아이러브고향 | 기부, 답례품, 지역브랜드관, 회원, 포인트/기부내역 | Donation/Gift/Point로 이관 또는 연동 조회 |
| productOld | 구 스토어 상품 | 폐기/병합/아카이브 판정 |
| AI추천 도메인 | 추천 로직/콘텐츠/로그 | 통합 RecommendationProfile로 재설계 |

## 3. 데이터 인벤토리

마이그레이션 전 반드시 추출할 항목:

- 테이블 목록.
- row count.
- PK/FK 관계.
- null/중복/깨진 참조.
- 이미지/파일 저장 위치.
- 기존 URL 패턴.
- 카테고리 코드 목록.
- 사용자 식별자 중복 여부.
- 결제/예약/기부 상태값.
- 삭제/숨김/중지 데이터 구분.

## 4. 카테고리 통합

### 기존 문제

- 체험/숙소/캠핑/스토어/답례품 카테고리가 도메인별로 분리되어 있다.
- `product`와 `productOld`가 병행된 흔적이 있다.
- 답례품과 일반 지역상품의 경계가 불명확할 수 있다.

### 신규 구조

```text
Category
  ├ taxonomy: travel/gift/content/campaign
  ├ parent_id
  ├ name
  ├ slug
  ├ sort_order
  └ status

Tag
  ├ name
  ├ type: theme/season/audience/benefit
  └ status
```

## 5. URL 리다이렉트

리다이렉트 매핑 예:

| 기존 | 신규 |
|---|---|
| `/user/experience/experienceList?...` | `/travel/experiences?...` |
| `/user/experience/experienceView?id=123` | `/travel/experiences/{slug}-123` |
| `/user/accommodation/...` | `/travel/stays/...` |
| `/user/facility?facilityType=CAMPING` | `/travel/camping` |
| `/user/product/...` | `/donation/gifts` 또는 `/regions/{local}/products` |
| `/main/toGohyang` | `/donation` |
| `/main/toNolgofarm?URL=...` | 대상 신규 URL 직접 매핑 |

정책:

- SEO 가치가 있는 상세/목록은 301.
- 세션 포함 URL은 canonical URL로 정규화.
- 삭제된 상품은 대체 지역/카테고리 목록으로 이동.

## 6. 회원 통합

검토 항목:

- 놀고팜 회원과 아이러브고향 회원이 같은 사람인지 식별할 키.
- 휴대폰/이메일/CI 기반 중복 병합 가능성.
- 비밀번호 해시 알고리즘 호환성.
- 본인확인 정보 보관 범위.
- 탈퇴/휴면/마케팅 동의 이력.

권장:

- CI 또는 본인확인 기반 계정 병합은 사용자의 명시 확인을 거친다.
- 불확실한 중복은 자동 병합하지 않는다.
- 기부내역은 법적/정산 리스크가 있으므로 병합보다 연결 조회를 우선한다.

## 7. 예약/주문/기부 내역

| 데이터 | 처리 |
|---|---|
| 과거 예약 | 마이페이지 읽기 전용 보관 |
| 진행 중 예약 | 신규 상태 모델로 이관, 공급자 확인 |
| 과거 주문 | 읽기 전용 보관 |
| 배송 중 주문 | 신규 배송 상태와 동기화 |
| 과거 기부 | e음 기준 영수증/내역 조회 연결 |
| 진행 중 기부 | 이관 시점 freeze window 필요 |

## 8. Freeze Window

출시 전환 시 권장:

1. D-14: 데이터 리허설 1차.
2. D-7: 데이터 리허설 2차, 리다이렉트 검증.
3. D-2: 신규 등록 제한 공지.
4. D-1: 레거시 쓰기 제한 또는 동결.
5. D-Day: 최종 델타 이관, DNS/리다이렉트 전환.
6. D+1~D+7: 모니터링, CS 집중 대응.

## 9. 검증 쿼리

필수 검증:

- 원본 상품 수 = 이관 성공 + 제외 + 실패.
- 모든 published 상품에 지역 id 존재.
- 모든 답례품에 `required_donation_amount`와 `gift_value` 존재.
- 모든 답례품이 30% 한도 통과.
- 모든 상세 URL에 신규 canonical URL 존재.
- 모든 진행 중 예약/주문/기부 상태가 누락 없이 이관.

## 10. 롤백

롤백 조건:

- 기부 접수 실패율 임계치 초과.
- 예약/결제 장애 장기화.
- 핵심 URL 404 대량 발생.
- 회원 로그인 장애.

롤백 방식:

- DNS 롤백보다 기능 플래그 기반 부분 롤백을 우선한다.
- 기부 플로우는 read-only 또는 점검 모드로 전환 가능해야 한다.
- 레거시 데이터 쓰기 재개 여부는 freeze 이후 발생 데이터 정합성을 검토한 뒤 결정한다.

