CONFIGURING RAILS APPLICATIONS


Part 4 - Configuring Middleware 


이한국(@majestin)
2014.08.05(Tue)

Middleware


rails는 여러 미들웨어가 쌓여있는 형태를 이룸.

각 미들웨어는 각자의 목적을 가지고 
HTTP의 요청/응답을 변형/제어 함.


프로젝트에 어떠한 미들웨어가 사용되고 있는지 확인 하려면
$ rake middleware 

Documentation


미들웨어를 위한 도큐먼트가 모두 조금씩 흩어져있다.
자료도 거의 찾아 볼 수 없다..

몇몇은 Rails 소스에서 정의되어있고 
몇몇은 Rack Gem 어딘가에 정의 되어 있다.

방법!
1. 미들웨어의 이름으로 구글 검색
2. 관련 소스 코드를 읽어보기
http://api.rubyonrails.org
http://rubydoc.info/github/rack/rack/master/file/SPEC



ActionDispatch::Static


Rack::Static 미들웨어와 비슷한 역할

/public 폴더 밑의 정적 파일 제공

제공하는 파일과 매치되는 것이 있다면 그 파일을 제공하고
그렇지 않을 시엔 미들웨어 다음 부분으로 이동.
def call(env)
  case env['REQUEST_METHOD']
  when 'GET', 'HEAD'
    path = env['PATH_INFO'].chomp('/')
    if match = @file_handler.match?(path)
      env["PATH_INFO"] = match
      return @file_handler.call(env)
    end
  end

  @app.call(env)
end

Rack::Lock


한 번에 하나의 쓰레드로 호출.

     예)
use Rack::Cache
use Rack::Lock
run myapp

#<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007fc15b4f5cf8>


다른 미들웨어는 클래스로 되어있지만 객체로 사용.

Rails.Cache 내부적으로 사용하는 메모리 기반 저장소를 비움.

 001 > Rails.cache.write('foo', 'bar')
 => true
 002 > Rails.cache.read('foo')
 => 'bar'
 003 > Rails.cache.class
 => ActiveSupport::Cache::FileStore
 004 > Rails.cache.middleware.class
 => ActiveSupport::Cache::Strategy::LocalCache::Middleware

Rack::Runtime


응용 프로그램을 처리하는 동안의 응답 헤더의 
시간(초)를 제공하는 X-Runtime을 헤더에 추가

curl 명령을 이용하여 확인

curl -I http://rorlab.org 

Rack::MethodOverride


"_method" 매개 변수를 기반으로 HTTP 요청을 설정


hidden field를 이용하여 PUT 또는 DELETE로 요청


ActionDispatch::RequestId



각 요청에 사용되는 고유한 값을 할당

X-Request-Id 헤더에 반환


Rails::Rack::Logger


요청이 시작할때 로그를 남기고 요청 후에 로그를 지운다.


ActionDispatch::ShowExceptions & ActionDispatch::DebugExceptions


예외 발생 시 도움을 주는 미들웨어

레일즈 어플리케이션이 예외를 발생하면 
이 둘 중 하나에 의해 표준 레일즈 에러 메시지 페이지 호출


ActionDispatch::RemoteIp


어플리케이션에서 사용하기 위해 원격 IP 주소를 포착


ActionDispatch::Reloader



개발 모드에서 클래스의 리로딩을 관리합니다.

ActionDispatch::Callbacks


각 요청에 트리거 형식으로 블록 메시지를 호출

before, after 메소드

001 > ActionDispatch::Callbacks.before { puts "before request” }

002 > app.get ‘/‘

003 > ActionDispatch::Callbacks.after { puts “after request” } 

ActiveRecord::Migration::CheckPending


모든 마이그레이션이 웹 페이지 로딩 전에 실행 되어 있는지 확인.



ActiveRecord::ConnectionAdapters::ConnectionManagement

활성화된 데이터베이스 연결을 제거합니다.

ActiveRecord::QueryCache


같은 SQL쿼리를 여러번 수행할 경우 캐시하고
 쿼리를 다시 요청할 경우에 캐시로 부터 읽어옴

각 요청의 끝에 캐시를 제거합니다.

ActionDispatch::Cookies, Session::CookieStore and Flash


요청 사이의 쿠키와 세션, 플래시를 유지

Flash세션 값에 플래시 메시지를 저장

Session::CookieStore : 쿠키 안에 있는 세션 데이터를 저장하는 미들웨어

Cookies : Set-Cookie 헤더를 통해 브라우져에서 쿠키로 저장됩니다.

ActionDispatch::ParamsParser


params 해시 안에서의 다른 포멧 요청(XML/JSON)이 있는지 분석

ActionDispatch::Head



HEAD 요청을 GET으로 변경하고 응답 본문을 제거하는 역할

Rack::ConditionalGet and Rack::ETag


파일이 수정되지 않은 경우 응답 본문을 제거합니다.

이전에 받았던 ETag와 동일하다면 
불필요한 리소스 다운로드를 방지

Etag의 값은 파일 크기와 파일을 
수정한 날짜를 기반으로 만들거나 체크섬을 이용

Made with Slides.com