발표는 Rack의 기본 개념과 작동 원리를 설명하며 시작됩니다. Rack은 Ruby 웹 서버와 웹 프레임워크 간의 최소한의 인터페이스를 정의하는 명세입니다. 모든 HTTP 요청은 Rack 스택을 통해 전달되며, 각 미들웨어는 요청을 처리하거나 다음 미들웨어로 넘기는 역할을 수행합니다.
Rack 애플리케이션의 구조
Rack 애플리케이션은 config.ru
파일(rackup 파일)에 정의되며, run
명령을 통해 실행됩니다. Rack 애플리케이션은 HTTP 상태 코드(status), 헤더(headers), 응답 본문(body)을 포함하는 세 가지 요소의 배열을 반환해야 합니다. 이는 웹 서버가 클라이언트에게 응답을 전달하는 데 필요한 최소한의 정보입니다.
미들웨어의 역할과 활용
- 요청 처리: 각 미들웨어는 HTTP 요청을 가로채어 분석하고, 필요한 경우 응답을 직접 반환할 수 있습니다. 예를 들어,
Rack::Static
미들웨어는 특정 경로에 대한 정적 파일을 효율적으로 서빙하여, 메인 애플리케이션이 이 작업을 수행할 필요가 없도록 합니다. - 환경(
env
) 객체 변형: 미들웨어는 요청과 관련된 모든 정보가 담긴env
객체를 수정하거나 정보를 추가할 수 있습니다. Device와 같은 인증 미들웨어는 쿠키 헤더를 분석하여 사용자 인증 정보를env
에 저장하고, 이후의 미들웨어 또는 Rails 애플리케이션은 이 정보를 활용하여 인증된 사용자 여부를 판단합니다. - 경량 프레임워크의 기반: Sinatra, Padrino, Hanami 등 많은 Ruby 웹 프레임워크는 Rack을 기반으로 구축되어 있습니다. 이는 Rails의 모든 기능을 필요로 하지 않는 경우, Rack이 제공하는 모듈화된 구성 요소를 활용하여 더 가볍고 특정 목적에 맞는 애플리케이션을 만들 수 있음을 의미합니다.
성능 및 특수 목적 활용
Rack 미들웨어를 활용하면 Rails 애플리케이션 전체를 로드하지 않고도 특정 요청을 스택의 상단에서 빠르게 처리할 수 있습니다. 이는 DDoS 방어(예: Rack Attack), API 접근 제한, 특정 헤더 처리(예: 웹소켓 프로토콜), 그리고 S3 백엔드와 같은 복잡한 인프라 로직 구현 등 성능과 유연성이 중요한 시나리오에서 매우 효과적입니다. Rack은 Ruby 생태계에서 수많은 웹 서비스의 보이지 않는 핵심 엔진 역할을 하고 있습니다.