핵심 인사이트 (3줄 요약)
- 본질: 스트랭글러 피그 패턴 (Strangler Fig Pattern)은 모놀리식 레거시 시스템을 한 번에 재작성하는 빅뱅 방식 대신, 전면에 프록시(게이트웨이)를 두고 새로운 기능부터 신규 마이크로서비스로 하나씩 가로채어 레거시를 점진적으로 고사시키는 레거시 전환 전략이다.
- 가치: 시스템 전체를 중단하지 않고 운영 중에 레거시를 신규 아키텍처로 교체할 수 있어, 재작성 리스크를 분산하고 신규 기능과 레거시 기능을 공존시키면서 점진적으로 전환한다.
- 판단 포인트: 전환 완료 시점을 명확히 정의하지 않으면 레거시와 신규 시스템이 장기간 혼재하는 '영구 혼합 아키텍처' 함정에 빠지므로, 각 기능 단위의 전환 완료 기준(Definition of Done)과 일정을 사전에 정의해야 한다.
Ⅰ. 개요 및 필요성
스트랭글러 피그(Strangler Fig)는 열대우림에서 숙주 나무를 감싸고 올라가 결국 숙주를 고사시키는 무화과 나무 일종이다. 마틴 파울러(Martin Fowler)가 2004년 이 생물학적 현상을 레거시 시스템 전환 전략으로 비유했다.
레거시 시스템을 빅뱅(big bang) 방식으로 완전 재작성하면 수년간의 개발 기간 동안 기존 시스템을 동결해야 하고, 완성 후 일제 전환 시 예상치 못한 버그와 데이터 이관 문제가 한꺼번에 터진다. 스트랭글러 피그 패턴은 이 위험을 기능 단위로 분산한다.
┌─────────────────────────────────────────────────────────────┐
│ 스트랭글러 피그 전환 단계 흐름 │
├─────────────────────────────────────────────────────────────┤
│ 1단계: 프록시(게이트웨이) 전면 배치 │
│ 클라이언트 → [Proxy] → [레거시 시스템 100%] │
│ │
│ 2단계: 신규 기능부터 신규 서비스로 라우팅 │
│ 클라이언트 → [Proxy] → [신규 서비스 A] (기능 A 가로챔) │
│ → [레거시 시스템] (나머지) │
│ │
│ 3단계: 기능을 하나씩 신규 시스템으로 이전 │
│ 클라이언트 → [Proxy] → [신규 서비스 A, B, C, ...] │
│ → [레거시 시스템] (점점 줄어듦) │
│ │
│ 4단계: 레거시 완전 고사 → 프록시 단순화 또는 제거 │
└─────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: 낡은 다리를 철거하면서 동시에 옆에 새 다리를 건설하고, 새 경간(Span)이 완성될 때마다 교통을 그쪽으로 우회시켜 결국 낡은 다리를 사용하지 않게 되는 방식이다.
Ⅱ. 아키텍처 및 핵심 원리
패턴의 핵심 구성 요소는 세 가지다. ① 프록시(라우팅 레이어): 전환 기간 동안 레거시와 신규 시스템으로의 트래픽을 분기하는 중앙 라우터, ② 공존 기간(Co-existence Period): 두 시스템이 함께 운영되는 과도기, ③ 전환 기준(Strangling Criteria): 언제 특정 기능을 완전히 신규로 전환할지 결정하는 조건.
| 항목 | 설명 | 포인트 |
|---|---|---|
| 초기 프록시 배치 | 모든 트래픽이 레거시 통과 | 낮음 |
| 일부 기능 전환 | 레거시+신규 혼재 | 중간 |
| 대부분 전환 | 레거시 최소화 | 높음 (데이터 동기화 부담) |
| 레거시 제거 | 신규 시스템 완전 이관 | 낮음 (검증 완료 후) |
┌─────────────────────────────────────────────────────────────┐
│ 레거시-신규 데이터 동기화 전략 │
├─────────────────────────────────────────────────────────────┤
│ 전환 기간 중 레거시 DB와 신규 DB 간 데이터 일관성 유지 │
│ │
│ 옵션 1: 이중 쓰기 (Dual Write) │
│ 신규 서비스 → 신규 DB (기본) + 레거시 DB (동기) │
│ │
│ 옵션 2: CDC (Change Data Capture) │
│ 레거시 DB → CDC → 신규 DB (비동기 동기화) │
└─────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: 기존 집을 리모델링할 때 한 방씩 공사하면서 나머지 방에서 생활하는 것과 같다. 전체 집을 비우고 공사하는(빅뱅) 대신 방 하나씩 순서대로 새로 만든다.
Ⅲ. 비교 및 연결
레거시 전환 전략에는 스트랭글러 피그 외에 빅뱅 재작성, 갈치 (Branch by Abstraction) 패턴이 있다. 각각 위험 수준과 소요 기간이 다르다.
| 비교 축 | A | B |
|---|---|---|
| 전환 방식 | 전체를 한 번에 재작성 | 기능 단위 점진적 전환 |
| 운영 중단 | 장기간 (수개월~수년) | 없음 |
| 위험 수준 | 높음 (일제 전환) | 낮음 (단계적 분산) |
| 비즈니스 기민성 | 전환 완료 전 신기능 불가 | 전환 중에도 신기능 출시 |
- 📢 섹션 요약 비유: 낡은 옷을 한 번에 모두 버리고 새 옷을 사는 것(빅뱅)이 아니라, 계절마다 낡은 옷 하나씩 새 옷으로 교체하는 것(스트랭글러 피그)이다.
Ⅳ. 실무 적용 및 기술사 판단
스트랭글러 피그 패턴의 핵심 실무 도전은 레거시와 신규 시스템 간의 데이터 동기화다. 두 시스템이 공존하는 기간 동안 동일 데이터에 대한 불일치가 발생하지 않도록 CDC (Change Data Capture)나 이벤트 기반 동기화를 구현해야 한다.
판단 체크리스트
- 전환할 기능의 경계(Bounded Context)가 명확히 정의되어 있는가?
- 레거시와 신규 시스템 간 데이터 동기화 전략이 수립되어 있는가?
- 각 기능 전환의 완료 기준(Definition of Done)이 측정 가능한 형태로 정의되어 있는가?
- 전환 완료 타임라인이 설정되어 '영구 혼합 아키텍처' 함정을 피할 계획인가?
- 신규 서비스로 전환 후 레거시 코드를 실제로 비활성화하는 프로세스가 있는가?
- 📢 섹션 요약 비유: 낡은 파이프라인을 교체할 때 새 파이프를 먼저 연결하고 물이 제대로 흐르는지 확인한 후에야 낡은 파이프를 막는다. 확인 전에 막으면 단수가 된다.
Ⅴ. 기대효과 및 결론
스트랭글러 피그 패턴을 적용하면 레거시 시스템을 운영하면서 점진적으로 현대화할 수 있어 비즈니스 연속성이 유지된다. 각 기능 전환이 독립적 배포 단위가 되어 위험이 분산되고, 전환 중에도 신규 기능 출시가 가능하다.
한계는 전환 기간 동안 두 시스템을 동시에 운영·유지보수해야 하는 이중 부담이다. 데이터 동기화 복잡성과 레거시 팀·신규 팀 간의 조율 비용도 증가한다. 전환 완료 타임라인을 명확히 설정하지 않으면 레거시가 '영구히 존재'하는 상황이 된다.
미래 방향으로는 ① AI 기반 레거시 코드 자동 분석으로 전환 기능 경계 추천, ② 컨테이너화를 통한 레거시 시스템 격리·현대화, ③ 스트랭글러 피그와 CDC의 결합으로 실시간 데이터 동기화 자동화가 발전하고 있다.
- 📢 섹션 요약 비유: 식물이 자라면서 기존 지지대(레거시)를 점차 자신의 줄기로 대체하듯, 레거시 시스템의 책임을 신규 서비스가 하나씩 흡수하여 결국 레거시가 필요 없어지게 만든다.
📌 관련 개념 맵
[모놀리식 레거시] → [스트랭글러 피그 패턴] → [점진적 MSA 전환] → [레거시 고사] → [클린 MSA]
| 개념 | 연결 포인트 |
|---|---|
| 모놀리식 아키텍처 | 스트랭글러 피그의 출발점이 되는 레거시 구조 |
| API 게이트웨이/프록시 | 레거시와 신규 시스템의 트래픽 분기 지점 |
| CDC (Change Data Capture) | 전환 기간 데이터 동기화 기술 |
| DDD 바운디드 컨텍스트 | 전환할 기능 경계 결정 기준 |
📈 관련 키워드 및 발전 흐름도
[빅뱅 재작성 실패] → [스트랭글러 피그 패턴(파울러)] → [프록시 기반 점진적 전환] → [CDC 동기화] → [MSA 완전 전환] → [레거시 제거]
👶 어린이를 위한 3줄 비유 설명
- 낡은 나무집 옆에 새 집을 짓고, 방 하나씩 이사하면서 낡은 집 방을 하나씩 부수는 방법이에요.
- 이사가 완전히 끝나면 낡은 집은 아무도 사용하지 않아서 자연스럽게 사라져요.
- 이렇게 하면 이사하는 중에도 계속 집에서 생활할 수 있어요!