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 Tracker
와 Action View Digestor
를 활용하여 애플리케이션 내의 모든 뷰 템플릿 목록을 수집하고, 컨트롤러나 다른 템플릿에 의해 렌더링되는 “루트 템플릿”을 기준으로 종속성 트리를 구축합니다. 이를 통해 실제 사용되는 템플릿을 “표시(mark)”하고, 표시되지 않은 템플릿을 “제거(sweep)”하여 데드 코드로 식별합니다. 이는 CI/CD 파이프라인에서 린팅 시간을 절약하고 애플리케이션 크기를 줄이는 데 기여합니다.
4. 미래 개선 방향
발표자는 이러한 기능들이 모두 렌더 파싱이라는 동일한 기반 위에 구축되어 있음을 강조하며, 향후 개선점으로 Prism
파서를 Action View의 기본 렌더 파서로 설정하여 ERB Tracker
의 정규 표현식 기반 한계를 극복하고, Action View Precompiler
와 loose ERBs
를 Rails 코어에 통합하여 개발자가 명시적으로 설치할 필요 없이 기본 기능으로 제공해야 한다고 제안합니다. 이는 성능 향상뿐만 아니라 개발 편의성 및 코드 품질 개선에 크게 기여할 것입니다.