코인체크는 10년 이상 운영된 거대한 Ruby on Rails 기반 금융 시스템을 보유하고 있으며, 모델 1700개, 컨트롤러 600개 이상의 규모를 자랑합니다. 시스템은 대부분 모놀리스 구조이며, 이로 인해 적절한 레이어링 부재, 서비스 간 사용 정리 어려움, 코드 오너십 모호성 등의 문제를 겪고 있습니다. 특히, 비즈니스 성장과 법규 대응으로 인해 복잡해진 사용자 상태 기반 거래 가능 여부 판단 로직, 즉 인가 로직이 40곳 이상에 분산되어 있어 코드의 이해와 유지보수를 어렵게 만들고 있었습니다. 이러한 인가 로직의 산재는 신규 프로덕트 개발 시 타당성 검증 비용 증가, 도메인 로직 복잡화 등의 문제로 이어졌습니다.
이러한 인가 로직 산재 문제를 해결하기 위해 인터페이스를 통일하여 로직을 집약하는 방안을 추진했습니다. 금융 시스템의 안정성과 기존 아키텍처 변경 부담을 고려하여 모듈러 모놀리스 구조를 선택했으며, 이를 위해 Packwerk를 도입했습니다. Packwerk는 Shopify가 개발한 정적 분석 도구로, 모듈 간 의존성 감지와 퍼블릭 영역 설정을 통해 의도치 않은 내부 참조를 방지하는 핵심 기능을 제공합니다. Packwerk-extensions와 packs-rails를 함께 사용하여 모듈화 및 Rails 오토로드 설정을 용이하게 했습니다. 실제 구현에서는 ‘authorization’ 패키지를 생성하고, 사용자의 특정 거래 가능 여부를 판단하는 단일 인터페이스를 제공하는 클래스를 만들었습니다. 복잡한 판단 로직은 비퍼블릭 클래스로 옮겨 직접 참조를 제한했습니다. Packwerk의 정적 분석 특성은 운영 환경 영향 없이 안전하게 리팩토링을 시도할 수 있게 했으며, Packs-rails는 디렉토리 구조 변경에 따른 오토로드 문제를 해결해 저비용으로 모듈화를 진행할 수 있었습니다. 퍼블릭 영역 설정 기능은 코드의 의도를 명확히 하고 통제하는 데 유용했습니다. 코드 분산 재발 방지를 위해 팀 인지 공유 및 커스텀 RuboCop 활용 등 기계적 검증도 병행했습니다. 향후 다른 공통 기능 및 도메인 단위 패키지화로 확장할 계획입니다.
Packwerk를 활용한 인가 로직 집약은 사용성 명확화 및 도메인 로직 복잡도 감소라는 직접적인 성과를 달성했습니다. 더 나아가 Packwerk는 거대 모놀리스 시스템을 안전하게 개선하고 확장 가능한 구조로 나아가기 위한 효과적인 리팩토링 도구로서의 가치를 보여주었습니다.