|
세상에는 무수히 많은 웹 서버들이 있다. 그리고 또 무수하게 많은 웹 프레임워크들도 존재한다. 루비도 예외는 아니다. 물론 루비 하면 레일스가 먼저 떠오르긴 하지만, 레일스를 차지하고서도 Merb, Camping, Ramaze, Maveric, Sinatra, Halcyon 등 얼핏 생각해도 제법 많은 프레임워크들이 있다. (물론 이들 대부분의 프레임워크들이 아직은 초기 버전이고 또한 어떤 식으로든 레일스 프레임워크로부터 영향을 받은 프레임워크들이긴 하지만.) HTTP를 제공하는 서버들도 예외는 아니어서 WEBrick, Mongrel, Thin, Ebb 등 제법 많은 웹 서버들이 속도와 경량성을 앞세워 우후죽순 생겨나고 있어 따라가기가 버거울 정도가 되었다. 여기다 JRuby까지 포함시키면 Tomcat이나 GlassFish같은 컨테이너들도 마찬가지로 루비의 배포 환경 속에 들어온다.
![]() 과거는 잊고, 다시 실용으로 돌아와서 Rack을 보자. Rack이 없는 세상에서라면 루비로 웹 프레임워크를 만드는 사람들은 지구 상에 나와 있을 여러가지 웹 서버들을 가능한 모두 고려하여 자신의 프레임워크를 설계해야 했다. 그렇지만 이제는 Rack API 스펙만 고려하여 프로그래밍하면 그 많은 웹 서버들 모두(아직 출시되지 않은 미래의 웹 서버들을 포함하여)에서 자신의 프레임워크가 정확하게 작동하게 할 수 있게 되는 것이다. HTTP 서버를 개발하는 측도 마찬가지여서, Rack용 핸들러(handler)만 하나 제공하면 그 많은 웹 프레임워크들과 다 잘 어울리는 웹 서버가 되는 것이다. 결국 n*m 이던 것이 Rack 덕에 n+m으로 줄어든 셈이다. 이번에는 Rack의 API를 한번 보자. 다음에 나온 한줄의 코드는 Rack과 연결하기 위해서 웹 프레임워크가 구현해 줘야 할 인터페이스의 전부를 말해준다. lambda { |env| [200, {}, ‘Hello World!’ }즉, env를 매개변수로 call() 메서드를 호출만 할 수 있으면 된다. 그리고 반환값은 위 코드에서 보듯 HTTP의 통상적인 반환값인 [결과코드, 헤드, 본문] 의 형태면 그만이다. 실제로 Rack 속에 들어 있는 Camping 프레임워크의 핸들러 코드는 채 열줄도 안된다. 이렇듯 Rack은 다양한 웹 서버와 다양한 웹 프레임워크들 간의 단순한 '가교' 역할을 담당하는 외에, 실제로 하나의 '미들웨어(middleware)'로서도 제 값을 톡톡히 해 낸다. 프레임워크로 가는 웹 요청을 중간에서 가로채기도 하고 예외처리나 표준 로깅 같은 기능을 추가해 주기도 하고, 파일 업로드와 같은 작업을 프레임워크 대신 처리해 줄 수도 있으니, Rack 속에 들어감으로써 생기는 3%의 부담 정도는 기꺼이 감수할 만하다. (Mongrel 서버를 기준으로 테스트를 했을 경우, Rack을 쓸 때와 안썼을 때 3% 정도의 성능차이가 난다고 한다) 실제로 최근에 나오는 루비 웹 프레임워크들 대부분은 Rack 기반이다. 예를 들어, Merb의 경우도 Rack을 사용하고 있기 때문에 다음과 같은 명령으로 손쉽게 웹서버를 갈아탈 수가 있다. $ merb -a mongrel -p 3000 # 3000번 포트에서 Mongrel서버 실행JRuby를 사용한다면, WAR 파일의 배포방식 역시 Rack을 통해 바뀌게 된다. WAR 파일 패키징을 해주는 Warbler 역시 최근에 기존의 Goldspike를 사용하던 방식에서 JRuby-Rack을 사용하는 방식으로 변경하였다. Erlang 프로그래머들에게 친숙한 Yaws 웹서버 역시 Fuzed를 이용하면 루비 웹 프레임워크에서 사용할 수 있다. 마지막으로 레일스. 레일스는 공식적으로는 Rack에 기반하고 있지는 않다. 그렇지만 이미 Rack 핸들러가 나와 있기 때문에 Rack 속에서 사용하는 것이 어렵지는 않다. 예를 들어, 다음과 같이 간단한 한줄짜리 파일을 config/rack.ru 라는 파일로 만든 다음, run Rack::Adapter::Rails.new명령행에서 다음 명령을 주면, Rack을 통해 Thin 서버에서 실행되는 레일스를 만날 수 있다. $ rackup config/rack.ru -p 3000 -s thin -r thin물론 아직 가야할 길은 멀다. Rack은 이제 겨우 0.3 버전에 불과하고, JRuby-Rack이나 레일스 어댑터 같은 것도 아직은 부족한 부분이 많은 게 사실이다. 그렇지만 Rack이 만든, 그리고 앞으로 만들어 나갈 가능성은 무궁무진하다. 갈수록 재미있어 지는 루비 세상을 기대해 보자!
|
카테고리
최근 등록된 덧글
예외처리를 한 큐에 배울 ..
by ikspres at 08/07 일방적으로 책을 디립다.. by 고감자 at 08/06 아하 ! by jinto at 07/31 잘 봤습니다 ^^ by xeraph at 07/16 100% 동감합니다. 앞으.. by ikspres at 07/05 책 잘 읽고 있습니다. .. by 인간흉기 at 06/28 본문 가장 아래 문단에 오.. by Tirin at 06/17 책 배달되어서 잘 받았.. by 짱가 at 06/16 Partial Update 기능은 .. by kkoon at 06/13 책이 배달되어서 잘 받아.. by 낭만고양이 at 06/13 최근 등록된 트랙백
세랍의 생각
by xeraph's me2DAY Unobtrusive는 뭐라 .. by 인사이트 테라의 느낌 by terra's me2DAY 열정 충전소 - 6회 루비.. by 오 픈 마 루 스 튜 디 오 [Rails] 레일스 2.1 .. by 쎄미 테라의 생각 by terra's me2DAY 멀티랭귀지 프로그래밍 by Minthe Blog 화니의 느낌 by lethee's me2DAY 꽃띠앙의 생각 by codian's me2DAY 종텐++의 느낌 by jong11's me2DAY 이글루 링크
이전 블로그
| |||