어떤 키워드에 대해서 알게된 후 궁금하거나 필요하다면, 배경/원리/사용법/결론을 찾고 익히게 되는 것 같아요.
그런데 나중에 다시 떠올리려하면 배경이나 원리는 잊어버리고, 사용법 및 결론만 생각나는 경우가 엄청 많더라구요 ☠️
그래서 좀 더 오래 기억하기 위해, 정리해 보려구요.
단순히 개념 정리만 하는게 아니라,
최대한 제 경험을 섞어볼게요⭐️
응용소프트웨어(이하 앱)와 OS사이, 앱과 앱 사이에서 등 중간 단계에서 조정 및 중개 역할을 하는 소프트웨어.
즉, 시스템에 분산되어있는 앱과 데이터, 웹 서버등 간의 연결을 최적화 시켜주는 역할을 한다.
앱은 확장, 축소가 편리해야하기 때문에 유연해야 한다.
그러려면, 디바이스 혹은 OS간에 플랫폼을 다시 구축할 필요가 없어야 한다.
미들웨어가 그것을 가능케 한다.
미들웨어는 네트워크, OS, DB등과 앱 사이에 위치함으로써, 네트웤 프로토토콜이나, OS종류, DB종류에 관계없이 동일하게 앱을 사용할 수 있게 한다.
DB 미들웨어, RPC 미들웨어, MOM 미들웨어, ORB 미들웨어, WAS 미들웨어 등이 있다.
Rack은 루비 웹앱(ex Rails)과 앱 서버(ex Puma, Thin..)사이에 위치하여 두 소프트웨어가 잘 커뮤니케이션 할 수 있도록 한다.
루비로 만들어진 웹앱 프레임워크는 다양하다. Rails, Sinatra...
앱서버도 다양하다. Puma, WEBrick, Thin, Passenger...
Rack을 사용하면 어떠한 조합의 Rack-compatible한 프레임워크도 모두 사용 가능하다.
-> 간단히 하면, 요청 응답을 다루는 웹서버용 인터페이스
-> 웹 서버에 대한 파이프 라인 디자인 패턴 의 구현
$ bundle exec rake middleware
use Raven::Rack
use Rack::Sendfile
use ActionDispatch::Static
use Rack::LiveReload
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00007f8c713ae4b8>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Remotipart::Middleware
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Warden::Manager
use OmniAuth::Strategies::Facebook
use OmniAuth::Strategies::Naver
use OmniAuth::Strategies::Apple
run JssV3::Application.routes
Rack 미들웨어는 요청을 처리하는 여러 단계를 깨끗하게 분리한다.
-> 관심사 분리
등의 단계를 분리하여 처리 가능해 짐.
Rack 미들웨어는 앱으로 들어오는 요청과 응답을 필터링하는 방법임.
미들웨어 구성 요소는 클라이언트와 서버 사이에 위치하여 인바운드 요청 및 아웃 바운드 응답을 처리하지만, 웹 서버와 통신하는 데 사용할 수있는 인터페이스 이상의 일을 함.
일반적으로 Ruby클래스인 모듈을 그룹화하고 순서를 지정하고 모듈 간의 종속성을 지정하는 데 사용됨.