리팩토링 이전, Active Record의 타입 캐스팅 로직은 여러 모듈에 걸쳐 분산되어 있어 ‘스파게티 코드’와 같은 복잡한 구조를 가지고 있었습니다. 이는 코드의 흐름을 추적하고 디버깅하는 것을 극도로 어렵게 만들었으며, 특히 외부 젬(Gem) 개발자들이 타입 캐스팅 기능을 확장하려 할 때 큰 장애물로 작용했습니다. 그들은 문서화되지 않고 불안정한 Rails 내부 코드를 ‘몽키 패치(monkey patch)’해야만 했고, 이는 젬의 호환성을 해치고 시스템 전체의 불안정성을 야기했습니다. 발표자는 이러한 상황을 ‘움직이는 모래 위에 건물을 짓는 것과 같다’고 비유하며 기존 방식의 취약성을 강조했습니다.
이러한 문제를 해결하기 위해, 리팩토링의 핵심은 Attribute
객체와 Type
객체를 도입하여 타입 캐스팅 로직을 캡슐화하고 내부적으로 상태를 관리하도록 재설계하는 것이었습니다. 이제 Attribute
객체는 데이터의 상태를 유지하고, 연결된 Type
객체에게 해당 타입으로의 변환(예: 문자열 ‘1’을 정수 1로)을 위임하도록 변경되었습니다. 이러한 아키텍처 변화는 코드의 응집도를 높이고 모듈성을 크게 향상시켰으며, 결과적으로 기존에 존재했던 복잡한 버그 클래스 전체를 원천적으로 제거할 수 있었습니다. 디버깅 과정 또한 ‘스파게티 코드를 헤쳐나가는 것’에서 ‘단순히 잘못된 타입 객체를 사용했는지 확인하는 것’으로 간소화되었습니다.
초기 리팩토링은 유지보수성 향상에 중점을 두었으나, 새로운 객체 할당 방식은 성능 저하라는 예상치 못한 부작용을 낳았습니다. 예를 들어, 데이터베이스에서 다수의 레코드를 조회할 때, 기존의 두 개의 해시를 사용하는 방식 대신 각 컬럼에 대해 Ruby 객체를 할당하면서 상당한 메모리 및 CPU 오버헤드가 발생했습니다. 그러나 리팩토링 주도자인 Sage는 이후 몇 주에 걸쳐 필요한 경우에만 객체를 인스턴스화하도록 코드를 최적화하여 이러한 성능 손실을 크게 만회했습니다. 이 과정에서 Rails 커뮤니티의 도움을 받아 베타 버전을 광범위하게 테스트하고 성능 문제를 해결하기 위해 적극적으로 협력했습니다.
발표는 또한 유지보수성의 중요성을 강조합니다. Sage는 “버그가 많고 유지보수할 수 없는 코드는 아무리 성능이 좋아도 소용없다. 빠르게 잘못된 일을 하는 것일 뿐”이라고 역설하며, 코드의 안정성과 장기적인 건전성을 위해 유지보수성이 고성능보다 우선시되어야 함을 강조했습니다. 이해하기 쉽고 합리적인 코드는 버그를 줄이고 안정성을 높이며, 이는 특히 많은 개발자가 기여하는 오픈 소스 프로젝트에서 더욱 중요합니다. 마지막으로, 오픈 소스 프로젝트에 효과적으로 기여하는 방법에 대한 실용적인 조언도 제공합니다. 기여 가이드를 숙독하고, 커뮤니티와 적극적으로 소통하며, 프로젝트의 기여 방식을 따르고, 거대한 풀 리퀘스트보다는 작고 점진적인 기여를 하는 것이 중요하다고 조언합니다.