OpenClaw·Hermes 마이그레이션 (9/13) — 마이그레이션 전략: Strangler Fig 패턴 실전
Big Bang을 거부하고 점진 교체를 선택한 기술적 근거
핵심 요약
이 글이 전달하는 것: - 레거시 AI 에이전트 시스템을 새 시스템으로 이관할 때 쓸 수 있는 5가지 전략(A~E) 비교 프레임 - Strangler Fig + Subset Migration(B+D) 조합이 어떤 조건에서 Big Bang을 이기는지의 판정 기준 - rsync 기반 baseline + 점진 동기화로 롤백 경로를 확보하는 구체 구조 - 중간 추상 레이어(memcore)가 차기 마이그레이션 비용을 낮추는 원리
문제 정의: AI 에이전트 마이그레이션이 단순 이전이 아닌 이유
AI 에이전트 시스템의 마이그레이션 대상은 코드만이 아니다. 에이전트 정의, 메모리 구조, 라우팅 로직, 누적된 세션 아카이브가 전부 이동 대상이다. 이 글의 케이스에서는 여러 에이전트 + 메모리 뱅크 + 라우팅 + 세션 아카이브가 이전 범위였다.
이 조건에서 전략을 잘못 고르면 결과는 둘 중 하나로 수렴한다.
- 이전 중 시스템 전체 정지
- 이전 후 데이터 누락 상태로 운영 재개
둘 다 허용 불가다. 따라서 전략 선택이 별도 단계로 분리된다.
5가지 전략 후보 비교
일반적인 마이그레이션 패턴 카탈로그 중 AI 에이전트 맥락에서 적용 가능한 5개를 후보로 올렸다.
| 옵션 | 이름 | 개요 |
|---|---|---|
| A | Big Bang | 레거시 완전 중단 → 신규 전면 투입 |
| B | Strangler Fig | 기능 단위로 신규 이식, 레거시 점진 퇴역 |
| C | (검토 중) | — |
| D | Subset Migration | 대표 서브셋 선이전, 검증 후 전체 확장 |
| E | (검토 중) | — |
최종 채택: B + D 조합.
B와 D는 상호 배타가 아니라 직교한다. B는 시간 축(언제 교체), D는 대상 축(무엇부터 교체)의 결정이다. 따라서 결합 사용이 가능하다.
Big Bang(A)이 기각되는 조건
Big Bang은 구조적으로 단순하다. 전환 날짜를 정하고 레거시를 끈 뒤 신규를 켠다. 이중 운영 구간이 없으므로 복잡도도 낮다.
단, 다음 조건이 하나라도 성립하면 리스크가 속도 이점을 초과한다.
- 레거시가 누적 패치 구조다 — 장기 운영 중 "기존에 덧붙이기" 방식이 반복되어 bootstrap 시점의 패치 충돌이 쌓여 있다.
- 이전 전 데이터 정합성 검증 시간이 부족하다 — Big Bang의 짧은 전환 창에서 전체 에이전트 메모리를 검증하기 어렵다.
- 롤백 비용이 비대칭적이다 — 신규에서 문제가 드러날 때 레거시는 이미 정지 상태이며, 누적 패치 구조라 복원 자체가 불확실하다.
본 케이스는 위 3개 조건 모두 성립한다. 따라서 A는 기각.
채택 전략: Strangler Fig + Subset Migration
Strangler Fig 작동 원리
Strangler Fig는 Martin Fowler가 명명한 레거시 교체 패턴이다. 새 시스템이 기능을 하나씩 가져가고, 레거시는 해당 기능을 내려놓는다. 신규가 성숙할수록 레거시 영역이 축소되고, 최종 단계에서 레거시가 제거된다.
이 글 케이스의 적용 모델:
Legacy (계속 bank/ 업데이트)
→ memcore 점진적 동기화
→ New System은 memcore만 참조
→ 검증 완료
→ Legacy 종료
→ memcore가 지식 베이스 역할 계승
Subset Migration 작동 원리
Subset Migration은 전체를 한 번에 이전하지 않는다. 대표성 있는 서브셋(여기서는 특정 에이전트 그룹과 메모리 영역)을 먼저 이전해 검증한다. 검증 통과 시 나머지로 확장한다.
두 전략의 결합 효과
- Strangler Fig: 시스템 연속성 보장. 레거시가 폴백으로 존재하므로 신규 장애 시 복구 경로 확보.
- Subset Migration: 전면 이전 전 리스크 조기 발견. 검증 실패 비용이 전체 범위가 아닌 서브셋 범위로 한정.
구현 주의점: 동시 운영이 아닌 순차 전환
Strangler Fig에 대한 흔한 오해: "두 시스템이 동시에 같은 요청을 처리한다."
본 구현은 그렇지 않다. 순차적 전환 모델을 택했다.
- Legacy 중단
- New 시작
- New가 memcore를 통해 이전된 지식 기반 위에서 운영
동시에 두 시스템이 에이전트를 실행하는 구간이 없다. 이중 실행은 상태 동기화 충돌과 중복 과금을 유발하므로 의도적으로 배제했다. Strangler Fig의 본질은 "동시 운영"이 아니라 "점진 대체"다.
memcore 동기화 구조
레거시에서 신규로 지식을 넘기는 통로가 memcore다. 동기화는 두 단계로 분리된다.
1단계: rsync 스냅샷 (baseline)
레거시의 메모리 상태를 rsync로 memcore에 복사한다. 이 시점이 마이그레이션 기준점이 된다. 이후 비교·검증은 모두 이 baseline 기준으로 수행된다.
2단계: 점진적 동기화 (delta)
이후 레거시가 새 정보를 추가할 때마다 memcore도 업데이트된다. 최종 전환 직전까지 동기화 상태가 유지된다.
자동화
LaunchAgent com.memcore.sync.plist가 매일 03:30 KST에 동기화를 실행한다.
<!-- com.memcore.sync.plist 핵심 부분 -->
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>3</integer>
<key>Minute</key>
<integer>30</integer>
</dict>
저녁 활동 시간대를 피하고 새벽 저활성 구간을 선택한 결정이다. 동기화 중 발생할 수 있는 락 경쟁을 최소화한다.
롤백 경로 설계
신규 전환 후 문제 발생 시 복구 절차: 레거시 재시작.
memcore는 레거시가 생성한 스냅샷 기반이므로, 레거시를 재시작하면 동일한 지식 베이스 위에서 운영이 재개된다. 데이터 손실 없음.
이 롤백 경로의 확보 가능성이 Strangler Fig 선택의 핵심 근거 중 하나다.
| 전략 | 롤백 비용 |
|---|---|
| Big Bang | 높음 — 레거시 상태 재구성 필요, 누적 패치로 복원 불확실 |
| Strangler Fig | 낮음 — 레거시가 baseline 시점까지 보존됨 |
롤백 비용이 낮다는 것은 "신규를 과감하게 시도할 수 있다"는 뜻이기도 하다. 의사결정 민첩성의 기술적 기반이 된다.
전략 선택 판정 기준: 이식성 우선
마이그레이션 전략을 고를 때 적용한 기준:
"이 결정이 다음 마이그레이션도 더 쉽게 만드는가?"
단기 편의보다 장기 이식성을 우선한다는 원칙이다. 신규 시스템도 언젠가 교체 대상이 된다. 그 시점에 현재 구조가 도움이 되어야 한다.
memcore를 중간 추상 레이어로 두는 이유가 여기 있다. 레거시 내부 구조에 직접 의존하는 연결을 신규에 넘기지 않는다. memcore 인터페이스만 유지하면 다음 교체 시 레거시 → 신규가 아닌 신규 → 차기의 경로가 같은 비용으로 반복 가능하다.
즉, memcore는 교체 비용을 분산시키는 abstraction boundary다.
적용 가능 범위와 한계
적용 가능한 케이스
- 레거시가 장기 운영되며 누적 패치가 쌓여 있는 환경
- 지식/상태가 중요한 AI 에이전트·봇·파이프라인 시스템
- 롤백 경로 확보가 우선순위인 프로덕션 시스템
- 전환 시점이 비즈니스 데드라인에 묶이지 않은 경우
이 패턴이 약한 케이스
- 레거시-신규 간 데이터 모델이 근본적으로 호환되지 않을 때 (memcore 같은 중간 레이어 설계 비용이 과다)
- 전환 기한이 짧고 baseline 유지 비용이 그 기한을 초과할 때
- 서브셋 정의가 자연스럽게 나오지 않는 모놀리식 상태 머신
정리
| 항목 | 결정 |
|---|---|
| 전략 | Strangler Fig + Subset Migration (B+D) |
| Big Bang 기각 근거 | 누적 패치 충돌 → 롤백 비용 비대칭 |
| 동시 운영 여부 | 없음. 순차 전환 |
| 동기화 수단 | rsync baseline + 점진적 delta (03:30 KST) |
| 롤백 | 레거시 재시작. 데이터 손실 없음 |
| 장기 이식성 장치 | memcore 추상 레이어 |
열린 질문
- Subset 선정의 대표성은 어떻게 측정하는가? 서브셋 검증 통과가 전체 성공을 얼마나 보장하는가?
- 중간 추상 레이어(memcore)의 스키마가 다음 세대 시스템의 데이터 모델과 어긋날 때의 마이그레이션 비용은?
- 점진 동기화 구간에서 레거시와 memcore의 일시적 불일치(drift)를 허용 가능한 범위는?
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기