레일스가 2.3 버전으로 업데이트되면서 이제 레일스도 Rack 기반에서 작동한다(참고: Rack 속에 들어간 레일스). Rack은 웹서버와 루비 웹 애플리케이션(프레임워크) 간의 최소한의 표준 인터페이스다. 따라서 Rack 표준에 따라 설계된 웹서버 또는 웹 프레임워크는 자유롭게 호환된다. Rack을 기반으로 하면 여러 가지 이점이 생기게 되는데, 그 중 하나가 소위 "미들웨어(middleware)" 라고 하는 것을 쓸 수 있게 된다는 것이다. 여기서 "미들웨어"란 웹서버와 웹 애플리케이션 중간에 위치하면서 HTTP의 요청/응답을 변형/제어할 수 있게 해주는 일련의 구성요소/모듈을 의미한다. 게다가 레일스 2.3에서는 메탈(Metal)이라고 부르는 일종의 Rack 미들웨어 래퍼(wrapper)도 제공한다. 메탈(즉, 미들웨어)을 사용할 수 있는 영역은 여럿 있지만, 특히 성능이 중요한 부분에서 사용하면 좋은 효과를 낼 수가 있는 것이, 레일스의 전체 라이프사이클을 타지 않아도 되기 때문이다.
그런데 많은 루비 웹 프레임워크들이 Rack 기반으로 동작함에 따라 이제 여러 프레임워크를 하나의 애플리케이션에서 섞어서 쓰는 일도 쉬워졌다. 예를 들어, 간단하면서도 성능이 좋은 루비 웹 프레임워크인 Sinatra 역시 Rack 기반으로 동작하는 관계로, 이제 레일스 애플리케이션에서 Sinatra를 Rack 미들웨어로 사용하는 것도 어렵지 않다.
방법1. Metal에 태우는 방법
첫번째 방법은 레일스 2.3에 새로 추가된 Metal 을 이용하는 것이다. 레일스 메탈은 Rack 미들웨어의 기능을 이용하여 레일스 애플리케이션에서 좀 더 빠른 액션을 만들 수 있게 해준다. 다음과 같이 레일스 rake middleware 명령을 해 보면 레일스 애플리케이션에 장착된 미들웨어들을 확인해 볼 수 있으며, 이 중 Metal도 들어 있음을 알 수 있다.(참고로 레일스 Metal 애플리케이션들은 Rails::Rack::Metal 미들웨어에 의해 실행된다)
- $ rake middleware
(in /Users/coti22/works/sinatra_works/rails_with_sinatra_as_a_middleware)
use Rack::Lock
. . .
use Rails::Rack::Metal
. . .
run ActionController::Dispatcher.new
그러므로 레일스 애플리케이션의 app/metals 디렉터리에 다음과 같이 Sinatra 코드를 둘 수 있다.
- require 'sinatra/base'
class Hello < Sinatra::Base
get '/sinatra' do
"Hello, sinatra"
end
end
방법2. Sinatra 애플리케이션을 직접 사용하는 방법
두번째 방법은 Metal을 태우지 않고 직접 구현하는 방법이다. 참고로 메탈 애플리케이션은 메탈 체인(chain)을 타야 하기 때문에 HTTP 404 코드를 반환할 수 없으며, 따라서 Rack 미들웨어를 직접 구현할 일도 생길 수 있다. Sinatra 애플리케이션의 코드는 위의 예제 소스와 동일하지만, 이번에는 app/metals 가 아닌 다른 적당한 디렉터리에 두면 된다.
그런 다음 config/environment.rb 파일을 열어 Rails::Initializer.run do |config| 아래에 다음과 같이 미들웨어를 추가해 주면 된다.
- config.middleware.use 'Hello'
이제 Sinatra 애플리케이션이 레일스의 미들웨어로서 장착된다. 확인하려면 rake middleware 명령을 주면 된다.
올 봄, 레일스가 Rack 기반으로 오면서 여러 가지 재미있는 일들이 많이 생길 것 같은 예감이다.
레일스와 Rack에 대한 더 자세한 내용은 여기를 참조하면 좋을 것이다.(또는 여기)
이 글은 스프링노트에서 작성되었습니다.
최근 덧글