미들웨어와 Rack
Rack 스택을 알아봅니다
미들웨어와 Rack은(는) CoddyKit의 무료 Ruby Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Ruby Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Rack이란 무엇인가요?
Rack은 Ruby 웹 서버와 프레임워크 사이의 최소 인터페이스입니다. Sinatra, Rails 및 기타 프레임워크는 모두 Rack에서 실행됩니다.
- 요청과 응답이 흐르는 방식을 표준화합니다
- 재사용 가능한 미들웨어를 사용할 수 있게 합니다
- Rack 앱은
call(env)에 응답하는 모든 것입니다
app = lambda do |env|
[200, { 'Content-Type' => 'text/plain' }, ['Hello Rack']]
end
puts app.call({}).inspectRack 계약
Rack 앱의 call은 세 요소로 이루어진 배열을 반환해야 합니다.
- 상태 정수(예: 200)
- 헤더 해시
each에 응답하는 본문(일반적으로 문자열 배열)
status, headers, body = 200, { 'Content-Type' => 'text/html' }, ['<h1>Hi</h1>']
puts status
puts headers.inspect
body.each { |chunk| puts chunk }env 해시
env 인수는 요청을 설명하는 해시입니다.
REQUEST_METHOD는 GET 또는 POST와 같은 요청 방식입니다PATH_INFO는 요청된 경로입니다QUERY_STRING은 원시 쿼리 매개변수입니다
env = { 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/home' }
puts "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"미들웨어란 무엇인가요?
미들웨어는 요청이 앱에 도달하기 전이나 후에 동작을 추가하도록 앱을 감쌉니다.
- 로그 기록, 인증, 압축
- 각 미들웨어도
call(env)에 응답합니다 - 체인에서 다음 앱을 호출합니다
class Logger
def initialize(app)
@app = app
end
def call(env)
puts "Request: #{env['PATH_INFO']}"
@app.call(env)
end
end미들웨어 클래스 만들기
미들웨어는 감싼 앱을 저장하고 call에서 해당 앱에 작업을 위임합니다.
- 생성자는 내부 앱을 받습니다
call은 환경을 수정한 다음 전달할 수 있습니다- 돌아오는 과정에서 응답을 변경할 수도 있습니다
class UpcaseBody
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
new_body = body.map(&:upcase)
[status, headers, new_body]
end
end
puts 'Middleware defined'미들웨어 스택
미들웨어는 스택을 구성합니다. 요청은 앱까지 아래로 흐르고 응답은 다시 위로 흐릅니다.
- 들어갈 때는 바깥쪽 미들웨어가 먼저 실행됩니다
- 나올 때는 바깥쪽 미들웨어가 마지막에 실행됩니다
inner = lambda { |env| [200, {}, ['core']] }
class Wrap
def initialize(app); @app = app; end
def call(env)
s, h, b = @app.call(env)
[s, h, b.map { |x| "[#{x}]" }]
end
end
puts Wrap.new(inner).call({}).last.inspectSinatra에서 미들웨어 사용하기
use를 사용해 Sinatra 앱에 미들웨어를 추가합니다.
use Rack::Loggeruse호출 순서가 스택 순서를 정합니다
require 'sinatra'
use Rack::Logger
get '/' do
'Logged request'
endconfig.ru와 rackup
config.ru 파일은 rackup 또는 Puma로 Rack 앱을 시작합니다.
run은 최종 앱을 설정합니다use는 그 앞에 미들웨어를 추가합니다
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::Application자주 사용하는 기본 제공 미들웨어
Rack에는 유용한 미들웨어가 함께 제공됩니다.
Rack::CommonLogger요청 기록Rack::Deflatergzip 압축Rack::Static파일 제공Rack::Session::Cookie세션
# In config.ru
# use Rack::Deflater
# use Rack::Static, urls: ['/assets'], root: 'public'
puts 'See comments for usage'응답 수정하기
미들웨어는 내부 앱이 실행된 후 응답 헤더를 추가하는 경우가 많습니다.
- 응답의 세 요소를 받습니다
- 헤더를 변경한 다음 반환합니다
class AddHeader
def initialize(app); @app = app; end
def call(env)
status, headers, body = @app.call(env)
headers['X-Powered-By'] = 'Ruby'
[status, headers, body]
end
end
app = AddHeader.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[1].inspect요청 중단하기
미들웨어는 내부 앱을 호출하지 않고 요청을 중단할 수 있습니다.
- 인증 관문이나 요청 속도 제한에 유용합니다
- 응답의 세 요소를 직접 반환합니다
class Auth
def initialize(app); @app = app; end
def call(env)
return [401, {}, ['Unauthorized']] unless env['token']
@app.call(env)
end
end
app = Auth.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[0]빠른 확인
Rack에 대한 이해도를 확인합니다.
복습
Rack 스택에 대해 배웠습니다.
- Rack은 Ruby 웹 프레임워크 아래에서 공통으로 사용하는 인터페이스입니다
- Rack 앱은
call(env)에 응답하고[status, headers, body]를 반환합니다 - 미들웨어는 앱을 감싸 여러 부분에 걸친 동작을 추가합니다
- Sinatra에서는
use를, 또는config.ru를 사용해 스택을 구성합니다 - 미들웨어는 응답을 수정하거나 요청을 즉시 중단할 수 있습니다
자주 묻는 질문
“미들웨어와 Rack” 강의는 무료인가요?
네 — “미들웨어와 Rack” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Ruby Academy 강의 전체를 잠금 해제할 수 있습니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“미들웨어와 Rack”에서 뭘 배우나요?
Rack 스택을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Ruby Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Ruby Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Ruby Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“미들웨어와 Rack” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Ruby Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Ruby Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Sinatra 기초
- 경로와 매개변수
- JSON API
- 미들웨어와 Rack