애샛(Assets)?
CSS, Javascript, Font, Image 등과 같이 일단 디플로이된 후에는 내용이 변경되지 않는 정적(Static) 파일 등을 의미한다. 사용 방식에 따라서 Video나 Audio등 거의 정적인(Nearly-Static) 성격을 가진 파일도 애샛(Assets)으로 구분하기도 한다.
레거시(Legacy) 방식의 애샛(Assets) 서비스
전통적으로 애샛을 서비스하는 방식은 /public 디렉토리 아래에 애샛을 카피해 놓고 브라우저의 요청이 오면 프론트엔드 웹 서버(=Nginx, Apache 등)에 의해 서비스되는 구조이다. 이 경우 아래와 같은 상황에 대한 개선 요구가 있어왔다.
  • 한 페이지에 사용하는 애샛이 너무 많은 경우 너무 빈번한 요청(Requests)이 발생
  • 동일한 내용을 매번 서빙하는 문제로 캐쉬(cache) 사용에 대한 필요성
  • 캐쉬 사용 시 캐쉬 만료(exprire)에 대한 적절한 해결책
레일즈에서의 애샛 파이프라인(Asset Pipeline)
레일즈 3.1부터 등장하기 시작한 기능으로 sprokets 젬(gem)을 통해 제공된다. 기본적인 기능을 요약하자면 다음과 같다.
  • 애샛에 대해 minify(compress)하고 concatenate하는 서비스를 제공하는 프레임웍이다.
  • 내부적으로는 Sprokets 미들웨어가 실행되면서 애샛 종류별로 1개의 마스터 파일만 생성해서 발생하는 요청(Requests) 수를 줄여주고,
  • 생성된 마스터 파일에 대해서 MD5값을 첨부하여 고유한 핑거프린트(fingerprint)를 제공한다. 가령 application.css는 MD5 처리 후 application-908e25…2f54.css 같은 형태가 된다.
  • MD5 hash가 추가된 파일은 캐쉬(cache) 적용이 용이해진다. 가령 파일이 변경되면 핑거프린트도 변하므로 자동으로 캐쉬 만료 점검을 해야하는 번거로움이 해결된다.
  • 뿐만 아니라 CoffeeScript, Sass, ERB를 전처리(preprocess)하는 작업도 애샛 파이프라인에서 담당한다.
Development 환경에서의 동작
Preprocessor
Rails.application.config.assets.compile = true에 의해서 런타임(Run-time) 컴파일이 수행된다. 확장자가 coffeescript, scss인 파일은 각각 javascript와 css 파일로 변환된다.
Minification(Compression)
Rails.application.config.assets.js_compressor = nilconfig.assets.css_compressor = nil이므로 development에서의 minification은 지원되지 않는다.
MD5 Fingerprint
Rails.application.config.assets.digest = true에 의해서 앳샛 파일명에 핑거프린트가 추가된다.
Concatenation
Rails.application.config.assets.debug = true에 의해서 수행되지 않는다. 단, application.scss에서 @import를 사용하는 구조를 사용하고 있다면 preprocessor 동작에 의해 마치 concatenated 된것처럼 보일 수도 있다.
Production 환경에서의 동작
Preprocessor
Rails.application.config.assets.compile = false에 의해서일 런타임(Run-time) 컴파일을 지원하지 않는다. 디플로이(Deploy) 과정 중에 rake asset:precompile 태스크에 의해 한번에 컴파일을 수행하고 결과를 /public/assets/에 옮긴다.
Minification(Compression)
Rails.application.config.assets.js_compressor = :uglifierconfig.assets.css_compressor = :sass에 의해서 uglifier 젬과 sass 젬을 이용하여 minification이 수행된다.
MD5 Fingerprint
Rails.application.config.assets.digest = true에 의해서 앳샛 파일명에 핑거프린트가 추가된다.
Concatenation
Rails.application.config.assets.debug = false이므로 concatenate가 실행된다.
Assets Load Path 또는 Search Path
레일즈가 애샛을 찾는 위치는 Rails.application.config.assets.paths의해 결정되는데, 레일즈 로딩시 app/assets, lib/assets, vendor/assets 아래에 있는 서브 디레토리는 자동으로 스캔해서 이 변수에 집어 넣는다. 만약 이곳 외의 위치에 애샛을 놓고 싶으면 다음과 같은 방식으로 등록한다. vi config/initializers/assets.rb
config.assets.paths << Rails.root.join("lib", "videoplayer", "flash")
Precompile Assets
app/assets/sub_folder/ 아래의 애샛은 자동으로 로딩되므로 별도의 조치없이 바로 사용할 수 있다. 하지만 이곳 외에 저장된 앳샛에 대해서는 아래와 같은 별도의 절차를 거쳐서 로딩을 해야 사용할 수 있다. 이것은 위에서 언급한 Assets Search Path의 설정과 관계없이 수행되어야 한다. 예를 들어 가령 vendor/assets/images/logo.png 파일이 있는 상태라도 <%= image_tag logo.png %>를 수행하면 에러가 발생한다. 이를 해결하기 위해서는 아래와 같이 지정하여야 한다. vi config/initializers/assets.rb
config.assets.precompile += %w( logo.png )
반면 app/assets/images/logo.png이 존재할 때는 위 셋팅없이 바로 사용할 수 있다.