Action View 캐시, 사전 컴파일 및 데드 코드 식별: Rails 성능 최적화 전략

RailsConf 2025 The Ghosts of Action View Cache by Hartley McGuire

작성자
Ruby Central
발행일
2025년 07월 24일

핵심 요약

  • 1 Rails Action View는 프래그먼트 캐싱을 통해 뷰 템플릿의 성능을 최적화하고 투명한 캐시 무효화를 제공합니다.
  • 2 Action View Precompiler는 ERB 템플릿을 사전 컴파일하여 애플리케이션의 메모리 사용량을 절감하고 부팅 시간을 최적화합니다.
  • 3 데드 코드 식별 도구는 사용되지 않는 뷰 템플릿을 찾아 제거함으로써 애플리케이션의 효율성을 높입니다.

도입

이 발표는 Rails 애플리케이션의 성능 최적화와 유지보수성 향상을 위한 Action View의 다양한 활용 사례를 다룹니다. 특히 Action View 캐싱, 템플릿 사전 컴파일, 그리고 데드 코드 식별이라는 세 가지 주요 주제를 통해 Rails 개발자들이 직면할 수 있는 문제점들을 해결하는 방법을 제시합니다. 발표자는 실제 사례와 기술적 깊이를 결합하여 Action View의 강력한 기능을 설명하며, 이러한 기능들이 어떻게 상호 연결되어 Rails 애플리케이션의 효율성을 극대화하는지 보여줍니다.

1. Action View 캐시와 캐시 무효화

발표는 먼저 Rails 업그레이드 후 발생한 캐싱 버그 사례를 통해 Rails.cache.fetch 대신 Action View의 프래그먼트 캐싱(cache 헬퍼) 사용의 중요성을 강조합니다. Action View 캐싱은 단순히 쿼리 결과뿐만 아니라 렌더링된 HTML 전체를 캐시하여 요청 처리 속도를 향상시키고, 캐시될 객체 유형에 대한 걱정을 덜어줍니다. 캐시 무효화는 Rails의 “마법”처럼 Action View Digestor가 담당합니다. Action View Digestor는 템플릿의 소스 코드와 모든 종속성(렌더링하는 다른 템플릿)의 해시 다이제스트를 결합하여 고유한 캐시 키를 생성합니다. 이 과정에서 Action View Dependency Tracker (특히 ERB Tracker)가 정규 표현식을 사용하여 템플릿 종속성을 파싱합니다. 종속된 템플릿 중 하나라도 변경되면 캐시 키가 변경되어 캐시가 자동으로 무효화되고 새로운 버전이 렌더링됩니다.

2. Action View 사전 컴파일을 통한 메모리 최적화

두 번째 주제는 Rails 애플리케이션의 메모리 부족 문제 해결을 위한 Action View Precompiler의 활용입니다. 일반적인 Rails 웹 서버는 eager loading 후 워커를 포크하여 요청을 처리하며, 이 과정에서 copy-on-write 최적화를 통해 메모리를 공유합니다. 하지만 ERB 템플릿은 요청 처리 시점에 각 워커에서 개별적으로 컴파일되어 메모리 사용량이 증가하는 문제가 발생합니다. Action View Precompiler는 Ruby의 ripper 파서(이후 Prism 파서)를 사용하여 애플리케이션 부팅 시점에 모든 ERB 템플릿을 미리 컴파일함으로써, 워커들이 컴파일된 템플릿을 공유하게 하여 전체 메모리 사용량을 절감합니다. Prism 파서는 ripper 파서의 한계를 극복하고 다양한 Ruby 구현체 및 템플릿 언어와의 호환성을 높였습니다.

3. Action View를 활용한 데드 코드 식별

세 번째는 애플리케이션 내의 사용되지 않는 뷰 템플릿(데드 코드)을 식별하는 방법입니다. 발표자는 가비지 컬렉터에서 사용되는 Mark-Sweep 알고리즘에서 영감을 받아 loose ERBs라는 CLI 도구 개발 경험을 공유합니다. 이 도구는 Action View Dependency TrackerAction View Digestor를 활용하여 애플리케이션 내의 모든 뷰 템플릿 목록을 수집하고, 컨트롤러나 다른 템플릿에 의해 렌더링되는 “루트 템플릿”을 기준으로 종속성 트리를 구축합니다. 이를 통해 실제 사용되는 템플릿을 “표시(mark)”하고, 표시되지 않은 템플릿을 “제거(sweep)”하여 데드 코드로 식별합니다. 이는 CI/CD 파이프라인에서 린팅 시간을 절약하고 애플리케이션 크기를 줄이는 데 기여합니다.

4. 미래 개선 방향

발표자는 이러한 기능들이 모두 렌더 파싱이라는 동일한 기반 위에 구축되어 있음을 강조하며, 향후 개선점으로 Prism 파서를 Action View의 기본 렌더 파서로 설정하여 ERB Tracker의 정규 표현식 기반 한계를 극복하고, Action View Precompilerloose ERBs를 Rails 코어에 통합하여 개발자가 명시적으로 설치할 필요 없이 기본 기능으로 제공해야 한다고 제안합니다. 이는 성능 향상뿐만 아니라 개발 편의성 및 코드 품질 개선에 크게 기여할 것입니다.

결론

결론적으로, Action View는 단순한 뷰 렌더링을 넘어 Rails 애플리케이션의 성능, 메모리 효율성, 그리고 코드 유지보수성을 향상시키는 데 핵심적인 역할을 합니다. 캐싱을 통한 요청 속도 개선, 사전 컴파일을 통한 메모리 절감, 그리고 데드 코드 식별을 통한 코드 베이스 정리 등 Action View의 다양한 빌딩 블록들은 Rails 개발자들이 복잡한 문제들을 효율적으로 해결할 수 있도록 돕습니다. 발표자는 개발자들이 Rails가 제공하는 풍부한 빌딩 블록들을 탐색하고, Action View와 같은 핵심 구성 요소를 활용하여 혁신적인 솔루션을 구축할 것을 독려하며 발표를 마무리합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!