Rack & Middleware
Rails 아래에서 동작하는 HTTP 처리 레이어
Rack은 Ruby의 웹 서버(Puma, Unicorn)와 웹 프레임워크(Rails, Sinatra) 사이의 표준 인터페이스입니다. 규약은 매우 간단합니다: call(env) 메서드가 [status, headers, body] 배열을 반환하면 됩니다.
Rails 자체도 하나의 Rack 앱입니다. 요청이 들어오면 여러 Middleware를 거치고, 마지막에 Rails 라우터에 도달합니다.
주요 Middleware (rake middleware로 확인 가능):
ActionDispatch::SSL— HTTPS 강제ActionDispatch::Cookies— 쿠키 처리ActionDispatch::Session— 세션 관리ActionDispatch::Flash— 플래시 메시지Rack::MethodOverride— PUT/PATCH/DELETE 메서드 지원ActionDispatch::RequestId— 요청 추적 ID 부여
커스텀 Middleware를 작성하여 요청 로깅, 인증, CORS 처리 등을 Rails 앱과 독립적으로 처리할 수 있습니다.
구조 다이어그램
Rack::SSL
HTTPS 강제
ActionDispatch::Cookies
쿠키 처리
ActionDispatch::Session
세션 관리
ActionDispatch::Flash
플래시 메시지
Rack::MethodOverride
PUT/PATCH/DELETE 지원
ActionDispatch::RequestId
요청 추적 ID
핵심 포인트
HTTP 요청이 웹 서버(Puma)에 도착
Rack 인터페이스를 통해 Middleware 스택으로 전달
각 Middleware가 순서대로 요청을 처리/수정 (양파 껍질 모델)
Rails Router에 도달 → Controller#Action 실행
응답이 Middleware 스택을 역순으로 통과하며 가공
최종 응답 [status, headers, body]이 브라우저에 반환
장점
- ✓ 관심사의 분리 — Rails 코드를 건드리지 않고 기능 추가
- ✓ Ruby 웹 프레임워크 간 호환 (Rails, Sinatra 등)
- ✓ 테스트 용이 (독립적 유닛)
- ✓ 요청/응답 파이프라인 커스터마이징
단점
- ✗ 미들웨어 순서가 중요 — 잘못 배치하면 동작 안 함
- ✗ 디버깅 시 어느 미들웨어에서 문제인지 찾기 어려움
- ✗ 과도한 미들웨어는 성능 저하
- ✗ 추상화 레이어가 추가되어 복잡도 증가