본 강연에서는 복잡한 시스템 전환을 위한 점진적 접근 방식을 두 가지 실제 Rails 애플리케이션 프로젝트 사례를 통해 구체적으로 설명합니다. 첫 번째 사례는 Bootstrap 3에서 Tailwind CSS로의 UI 프레임워크 마이그레이션입니다. 이 프로젝트는 다른 개발 작업을 중단시키지 않으면서, 장기 브랜치 유지나 한 번에 모든 것을 전환하는 방식의 위험을 피해야 했습니다. 강연자는 이 과정을 다음과 같이 수행했습니다. 첫째, 발견(Discovery) 단계에서 Bootstrap 사용 방식을 깊이 이해하고, 최종 목표(시각적 유사성 수준)와 Bootstrap에 의존하는 모든 뷰, 파셜, 헬퍼 등의 인벤토리를 파악했습니다. 둘째, 사전 작업(Preliminary Tasks)으로 레이아웃 통합, 내비게이션 관련 코드 정리 등 마이그레이션을 간소화할 수 있는 개선 사항들을 미리 처리했습니다. 셋째, 설정(Setup) 단계에서는 CSS 프레임워크 헬퍼 메서드를 통해 Bootstrap과 Tailwind를 조건부로 로드할 수 있게 하고, 공통 레이아웃 요소에 대한 두 프레임워크 버전의 파셜과 헬퍼를 분리(새로운 Tailwind 버전을 기본값으로 지정)했습니다. 넷째, 점진적 단계(Incremental Steps)에서는 위험도가 낮은 관리자 뷰부터 시작하여 점차 트래픽이 높은 사용자 뷰로 전환했습니다. 이 과정에서 ‘사이드 퀘스트’를 철저히 배제하고, 각 변경 사항이 작고, 검토하기 쉬우며, 롤백 가능하도록 유지하는 것이 중요하다고 강조했습니다. 마지막으로, 정리(Tear Down) 단계에서 Bootstrap 관련 모든 의존성과 잔여 코드를 제거하여 시스템을 완전히 간소화했습니다. 이 프로젝트는 약 3개월이 소요되었고 30개의 PR로 완료되었습니다.
두 번째 사례는 사용자(User) 모델에 직접 결합되어 있던 Stripe 결제 및 구독 시스템을 분리하여 새로운 계정(Account) 또는 팀(Team) 모델로 이전하는 아키텍처 및 데이터 모델 전환입니다. 이 프로젝트 역시 기존 작업을 방해하지 않으면서, 기능적 동등성을 완벽하게 유지해야 했습니다. 과정은 다음과 같습니다. 첫째, 발견(Discovery) 단계에서 기존 결제 관련 데이터와 프로세스를 면밀히 분석하고, 목표(기능적 동일성 유지)와 결제 관련 모든 DB 컬럼 및 메서드의 인벤토리를 파악했습니다. 둘째, 사전 작업(Preliminary Tasks)으로 결제와 간접적으로 관련된 사용자 계정 잠금 기능 등을 미리 계정 수준으로 옮겨 마이그레이션을 단순화했습니다. 셋째, 설정(Setup) 단계에서는 새로운 BillingAccount
모델과 테이블을 생성하고, 기존 사용자 계정에 대한 BillingAccount
레코드를 생성 및 동기화하는 스크립트를 마련했습니다. 넷째, 점진적 단계(Incremental Steps)는 세 부분으로 나뉘었습니다: 이중 쓰기(Dual Write)를 통해 기존 및 새 위치에 동시에 데이터를 기록하고, 진실의 원천 변경(Change Source of Truth)을 통해 새로운 BillingAccount
데이터를 시스템의 주요 정보원으로 사용하기 시작했으며, 마지막으로 원본 제거(Remove Original)를 통해 기존 데이터 쓰기 호출을 제거했습니다. 각 단계마다 작은 PR을 통해 변경을 적용하고, 데이터 일치 여부를 검증하는 스크립트를 사용하여 지속적으로 확인했습니다. 마지막으로, 정리(Tear Down) 단계에서 사용자 모델에서 기존 결제 관련 참조 및 사용되지 않는 컬럼을 모두 제거했습니다. 이 프로젝트는 약 6개월이 소요되었고 42개의 PR로 완료되었습니다.
이러한 사례들을 통해 강연자는 복잡한 시스템 전환을 위한 일반적인 패턴을 제시합니다: 발견(목표 및 인벤토리 파악) -> 사전 작업 -> 설정 -> 점진적 단계(이중 쓰기, 진실의 원천 변경, 원본 제거, 그리고 각 단계에서의 철저한 검증) -> 정리. 각 단계의 중요성을 강조하며, 특히 변경 단위를 작게 유지하고, 지속적으로 검증하며, ‘사이드 퀘스트’를 피하는 것이 성공적인 전환의 핵심임을 역설합니다. 이 과정은 시스템에 대한 깊은 이해를 증진시키고 예상치 못한 문제를 조기에 발견하는 데 기여합니다.