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_precompilerGem은 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 단계에서 검증 도구로 활용될 수 있습니다.