메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

여러분의 클라우드 앱은 안녕하신가요? '뒤엉킨 누더기 시스템'에서 탈출하는 법

hits-icon620

“드디어 우리 회사도 클라우드를 도입했습니다!” 경영진의 야심 찬 선언과 함께 수년간 운영해 온 사내 시스템을 클라우드로 고스란히 옮겼습니다. 이제 오토스케일링의 마법으로 트래픽이 몰려도 끄떡없고 비용도 절감될 것이라 기대했지만 현실은 냉혹했습니다. 서버는 여전히 원인 모를 오류로 다운되고, 클라우드 비용은 무섭게 청구됩니다. 도대체 무엇이 문제였을까요?

 

문제는 클라우드라는 ‘인프라’가 아니라, 그 위에 올라간 애플리케이션의 구조에 있었습니다.

 

☑️ 무늬만 클라우드, 실상은 ‘거대한 진흙 덩어리’

 

개발 일정에 쫓겨 당면한 문제를 임시방편으로 해결하다 보면, 어느새 시스템은 모든 코드가 엉망으로 얽히고설킨 이른바 커다란 진흙 덩어리(big ball of mud)*가 되어버립니다. 개발자라면 누구나 한 번쯤 “이 코드는 건드리지 마세요!”라는 경고를 들어 본 적이 있을 것입니다. 하나의 기능을 수정하면 전혀 연관 없어 보이는 곳에서 연쇄적으로 버그가 터지는 시스템, 바로 이것이 전형적인 진흙 덩어리의 모습입니다.

 

이 거대하고 무거운 진흙 덩어리를 그대로 클라우드 환경에 들어서 옮기는(리프트 앤 시프트) 것만으로는 클라우드의 무한한 확장성이나 탄력적인 자원 활용 같은 장점을 결코 누릴 수 없습니다. 오히려 기술 부채를 구름 위로 쏘아 올려 더 비싸고 불안정한 진흙 덩어리를 만든 셈입니다.

 

* 커다란 진흙 덩어리 (Big Ball of Mud)
브라이언 풋, 조셉 얀돈이 쓴 논문 <Big Ball of Mud>에서 비롯된 말로 소프트웨어 아키텍처 또는 코드베이스가 명확한 구조나 패턴 없이 뒤엉켜 있어, 커다란 진흙 덩어리처럼 혼란스럽고 관리하기 어려운 상태를 말함. 즉, 시스템 전반이 일관성 없는 설계, 임시 방편적 코드, 누적된 기술 부채로 인해 이해하기 어렵고 확장하기 곤란한 상태를 의미함.  (출처: Yak Shaving: 야크 털 깎기)

 

 

☑️ 무화과 나무처럼 서서히 집어삼키기(스트랭글러 애플리케이션)

 

그렇다고 당장 서비스 중인 이 거대한 시스템을 전면 폐기하고 처음부터 다시 개발할 수는 없습니다. 이는 비용과 시간 측면에서 기업의 목숨을 거는 극도로 위험한 선택이기 때문입니다.

 

가장 현실적이고 안전한 탈출구는 모놀리식 점진적 대체 전략입니다. 기존 시스템을 한 번에 갈아엎는 대신, 숙주 나무를 서서히 감싸며 자라나 결국 원래 나무를 대체해 버리는 ‘교살자 무화과 나무(Strangler vines)’처럼 아주 조금씩, 그러나 확실하게 시스템을 마이크로서비스로 교체해 나가는 것입니다.

 

 

성공적인 탈출을 위한 핵심 단계는 다음과 같습니다.

 

가느다란 실금 찾기: 얽히고설킨 진흙 덩어리 속에서도 비교적 결합도가 낮아 분리하기 쉬운 경계선(가느다란 실금)을 먼저 찾아냅니다. 코드가 너무 복잡하다면 데이터베이스의 상호 작용 구조에서 시작해 코드로 거슬러 올라가며 도메인의 논리적인 경계를 파악하는 것이 좋은 시작점이 될 수 있습니다.

 

❷ 컴포넌트 추출: 찾아낸 기능 조각을 기존 시스템에서 점진적으로 떼어내어, 독립적으로 배포 가능한 마이크로서비스로 만듭니다. 처음부터 아주 작은 단위로 쪼개기 어렵다면, 우선 약간 큰 덩어리인 매크로 서비스로 먼저 추출한 뒤 이해도가 높아지면 점차 작은 마이크로서비스로 리팩터링하는 것도 훌륭한 접근법입니다.

 

❸ 모놀리식-마이크로서비스 프록시: 기능이 마이크로서비스로 이사한 후에도, 기존 시스템이 길을 잃지 않고 새로운 마이크로서비스를 자연스럽게 호출할 수 있도록 중간에 프록시(안내원)를 둡니다. 이를 통해 외부 클라이언트나 기존 시스템은 내부에서 마이크로서비스로 교체되고 있다는 사실조차 모른 채 안정적으로 서비스를 이용할 수 있습니다.

 

결국 중요한 것은 시스템을 한 번에 뒤엎는 것이 아니라, 사용자에게는 연속적인 서비스를 제공하면서 내부 구조만 조금씩 바꿔 나가는 일입니다. 스트랭글러 애플리케이션 전략의 강점도 바로 여기에 있습니다. 기존 시스템을 멈추지 않고도 위험을 통제한 채 점진적으로 현대화할 수 있다는 점입니다.


위 글은 『클라우드 애플리케이션 아키텍처 패턴』의 내용을 발췌하여 작성하였습니다.

 

책은 실무에서 필요한 레거시 현대화, 마이크로서비스 설계, 이벤트 주도 아키텍처 도입 등 현장에서 수많은 시행착오를 겪으며 찾아낸 70가지의 구체적이고 실무적인 아키텍처 패턴을 담고 있습니다. 특히 특정 클라우드 벤더(AWS, GCP, Azure 등)나 플랫폼에 종속되지 않는 범용적인 패턴 언어로 구성되어 있어, 어떤 환경에서든 유연하게 적용할 수 있다는 것이 이 책의 가장 큰 장점입니다.

 

매일같이 레거시 시스템과 씨름하며 시스템 설계의 돌파구를 찾는 아키텍트와 개발자 여러분께, 이 책이 가장 명쾌하고 든든한 생존 가이드가 되어 줄 것입니다.

댓글

댓글 입력