Middleware
rails는 여러 미들웨어가 쌓여있는 형태를 이룸.
각 미들웨어는 각자의 목적을 가지고
HTTP의 요청/응답을 변형/제어 함.
프로젝트에 어떠한 미들웨어가 사용되고 있는지 확인 하려면
Documentation
미들웨어를 위한 도큐먼트가 모두 조금씩 흩어져있다.
자료도 거의 찾아 볼 수 없다..
몇몇은 Rails 소스에서 정의되어있고
몇몇은 Rack Gem 어딘가에 정의 되어 있다.
방법!
1. 미들웨어의 이름으로 구글 검색
2. 관련 소스 코드를 읽어보기
http://api.rubyonrails.org
http://rubydoc.info/github/rack/rack/master/file/SPEC
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
한 번에 하나의 쓰레드로 호출.
예)
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
응용 프로그램을 처리하는 동안의 응답 헤더의
시간(초)를 제공하는 X-Runtime을 헤더에 추가
curl 명령을 이용하여 확인
curl -I http://rorlab.org
"_method" 매개 변수를 기반으로 HTTP 요청을 설정
hidden field를 이용하여 PUT 또는 DELETE로 요청
각 요청에 사용되는 고유한 값을 할당
X-Request-Id 헤더에 반환
요청이 시작할때 로그를 남기고 요청 후에 로그를 지운다.

ActionDispatch::ShowExceptions & ActionDispatch::DebugExceptions
예외 발생 시 도움을 주는 미들웨어
레일즈 어플리케이션이 예외를 발생하면
이 둘 중 하나에 의해 표준 레일즈 에러 메시지 페이지 호출
어플리케이션에서 사용하기 위해 원격 IP 주소를 포착
각 요청에 트리거 형식으로 블록 메시지를 호출
before, after 메소드
001 > ActionDispatch::Callbacks.before { puts "before request” }
002 > app.get ‘/‘
003 > ActionDispatch::Callbacks.after { puts “after request” }
모든 마이그레이션이 웹 페이지 로딩 전에 실행 되어 있는지 확인.

활성화된 데이터베이스 연결을 제거합니다.
같은 SQL쿼리를 여러번 수행할 경우 캐시하고
쿼리를 다시 요청할 경우에 캐시로 부터 읽어옴
각 요청의 끝에 캐시를 제거합니다.

ActionDispatch::Cookies, Session::CookieStore and Flash
요청 사이의 쿠키와 세션, 플래시를 유지
Flash :
세션 값에 플래시 메시지를 저장
Session::CookieStore : 쿠키 안에 있는 세션 데이터를 저장하는 미들웨어
Cookies : Set-Cookie 헤더를 통해 브라우져에서 쿠키로 저장됩니다.
params 해시 안에서의 다른 포멧 요청(XML/JSON)이 있는지 분석
HEAD 요청을 GET으로 변경하고 응답 본문을 제거하는 역할

Rack::ConditionalGet and Rack::ETag
파일이 수정되지 않은 경우 응답 본문을 제거합니다.
이전에 받았던 ETag와 동일하다면
불필요한 리소스 다운로드를 방지
Etag의 값은 파일 크기와 파일을
수정한 날짜를 기반으로 만들거나 체크섬을 이용