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의 값은 파일 크기와 파일을 
수정한 날짜를 기반으로 만들거나 체크섬을 이용

CONFIGURING RAILS APPLICATIONS Part 4

By hanguk lee

CONFIGURING RAILS APPLICATIONS Part 4

Part 4 - Configuring Middleware

  • 1,077