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::MiddlewareRack::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