1. Action View 프래그먼트 캐싱을 통한 성능 최적화
- 기존
Rails.cache
사용 시 Active Record Relation과 같은 객체가 캐시되어 발생하는 버그를 해결하기 위해 Action View의 프래그먼트 캐싱이 제시됩니다. - 프래그먼트 캐싱은 뷰 템플릿 렌더링 결과를 HTML로 캐시하여, 특정 쿼리뿐만 아니라 전체 HTML 렌더링 과정의 속도를 높입니다.
- 캐시 무효화는
Action View Digestor
가 템플릿 소스 코드와 의존성(하위 템플릿)의 해시값을 기반으로 캐시 키를 생성하여 자동으로 처리합니다. 템플릿이나 종속성이 변경되면 캐시 키가 변경되어 새로운 버전이 렌더링됩니다. Action View Dependency Tracker
는 정규 표현식을 사용하여render
호출에서 템플릿 이름을 추출하며, 이는 캐시 키 생성에 필요한 의존성 트리를 구축하는 데 사용됩니다.
2. Action View Precompiler를 통한 메모리 사용량 절감
- Rails 애플리케이션은 요청 처리 시 ERB 템플릿을 Ruby 코드로 컴파일하는데, 이는 각 워커 프로세스에서 중복되어 메모리 사용량을 증가시킵니다.
action_view_precompiler
Gem은 Ruby의 Ripper 파서를 사용하여 애플리케이션 부팅 시 모든 ERB 템플릿을 미리 컴파일합니다. 이는 템플릿 이름뿐만 아니라 로컬 변수까지 정확하게 파싱하여 가능한 기능입니다.- 이 Gem의 개발 결과, Ripper 기반의 ERB 트래커가 Rails에 업스트림되었고, Ruby 3.4부터는 새로운 Ruby 파서인
Prism
이 기본값으로 채택되어 더욱 견고한 파싱이 가능해졌습니다. - 템플릿 사전 컴파일은
copy-on-write
최적화를 통해 워커 간 메모리 공유를 극대화하여 전체 메모리 사용량을 줄입니다.
3. Action View를 활용한 데드 코드 식별
- 애플리케이션 내에 존재하는 사용되지 않는 뷰 템플릿(데드 코드)을 식별하기 위해
mark-sweep
가비지 컬렉션 알고리즘에서 영감을 받은 방법이 제안됩니다. - 이 방법은 모든 뷰 템플릿 목록을 확보한 후, 컨트롤러나 헬퍼에서 직접 렌더링되는 “루트 템플릿”부터 시작하여 의존성 트리를 따라 사용되는 템플릿을 표시합니다.
Action View Dependency Tracker
를 활용하여 템플릿의 의존성을 파악하고, 최종적으로 표시되지 않은 템플릿을 데드 코드로 간주하여 제거할 수 있습니다. 이는 CI 단계에서 검증 도구로 활용될 수 있습니다.