경험에서 배우는 현실적인 Ruby on Rails 업그레이드

現実のRuby/Railsアップグレード / Yuichi Takeuchi - Kaigi on Rails 2024

3줄 요약

  • Ruby on Rails 업그레이드는 노후화된 시스템의 보안, 기능, 개발 효율성 문제를 해결합니다.
  • 성공적인 업그레이드는 테스트 문화 구축, 에러 모니터링 등 철저한 사전 준비와 단계적 실행이 중요합니다.
  • 지속적인 업그레이드와 코드 설계 개선은 기술 부채 감소 및 개발 생산성 향상으로 이어집니다.

Ruby on Rails의 장기 이용 프로젝트における 업그레이드는, 보안 리스크, 신기능 이용 불가, 개발 효율 저하といった 심각한 과제를 해소하기 위해 불가결입니다. 본 발표에서는, 실제 업그레이드 경험에 근거하여, 그 과제, 준비, 절차, 발생 가능한 문제와 대책, 그리고 얻어진 배움에 대해 상세히 해설합니다.

  • 초기 문제점: 프로젝트는 심각하게 노후화된 Ruby 및 Rails 버전을 사용하고 있어 보안 취약점 노출, 신규 라이브러리 도입 불가, 최신 기능 미활용 등의 문제를 안고 있었습니다. 특히, 인프라와 애플리케이션의 버전 관리 분리와 테스트 코드의 부재는 변경 작업의 높은 비용과 위험을 초래하여 사실상 업그레이드가 불가능한 상태였습니다. 오류 발견 시스템 부재 및 경고 무시 또한 문제의 심각성을 더했습니다.
  • 업그레이드 준비: 성공적인 업그레이드를 위해 변경에 유연하게 대처할 수 있는 환경을 구축하는 것이 우선되었습니다. Ruby와 Rails를 함께 배포할 수 있는 인프라를 마련하고(Docker 활용 등), 업그레이드 과정에서 발생하는 문제를 조기에 발견하기 위한 테스트 코드 작성 및 자동화된 CI 환경 구축에 집중했습니다. 테스트 통과를 코드 리뷰의 필수 조건으로 만들어 테스트 문화를 정착시켰습니다. 또한, 런타임 오류 및 경고를 기록하고 알림을 받는 시스템(Sentry 등)을 도입하여 문제 발생 시 즉각적인 대응이 가능하도록 했습니다. 비즈니스 측과의 원활한 소통과 신뢰 구축 역시 업그레이드 중 발생 가능한 이슈에 대한 이해를 구하는 데 중요했습니다.
  • 업그레이드 절차 및 문제 해결: 준비 과정을 거쳐 Ruby와 Rails의 마이너 버전을 순차적으로 업그레이드했습니다. Rails 업그레이드는 Gemfile 수정, 의존성 해결, rails app:update 실행 후 변경 사항 병합, 테스트 실행 및 오류 수정을 반복하는 방식으로 진행되었습니다. 특히, Rails의 기본 동작 변경(예: belongs_to의 필수 여부 변경, Asset Pipeline)은 업그레이드 자체와 분리하여 단계적으로 적용하며 영향 범위를 최소화했습니다. Ruby 업그레이드도 유사한 절차를 따랐습니다. 이 과정에서 업데이트가 중단된 제3자 라이브러리 문제, Rails 내부 구현에 과도하게 의존하는 코드 문제, Ruby/Rails 버전 변경으로 인한 비호환성 등에 직면했으며, 제3자 라이브러리 교체 또는 자체 유지보수, 가이드 및 소스 코드 분석, 테스트를 통한 문제 해결을 수행했습니다. 단계적 접근과 철저한 테스트가 복잡한 문제 해결에 핵심적이었습니다.
  • 결과 및 시사점: 업그레이드를 통해 코드 작성 방식 개선, 디버깅 효율성 향상, 보안 패치 신속 적용, 성능 향상(특히 Ruby 3.3의 JIT 활용) 등 가시적인 성과를 달성했습니다. 또한, 테스트 문화 정착, 비즈니스 도메인 이해도 증가, 비즈니스 측 신뢰 확보(릴리스 속도 향상)와 같은 긍정적인 변화도 가져왔습니다.

이 업그레이드 프로젝트를 통해, 코드 작성 방식 개선, 디버깅 효율 향상, 보안 취약점 신속 대응, 성능 향상 등 직접적인 성과를 달성했습니다. 더불어 테스트 문화 조성, 업무 이해도 심화, 비즈니스 신뢰 확보와 같은 부가적인 효과도 얻었습니다. 업그레이드는 일회성 이벤트가 아닌 지속적인 관리 대상입니다. 적절한 제3자 라이브러리 선택, 미래를 고려한 코드 설계, 계획적인 자원 확보가 지속 가능한 업그레이드를 가능하게 하며, 시스템 건전성 및 개발 속도 유지에 필수적입니다. 업그레이드는 '확정신고'처럼 미루지 말고 꾸준히 실행하는 것이 중요합니다.