Action Controller 개요 — 요청을 처리하는 콘트롤러의 역할
Action Controller 개요 — 요청을 처리하는 콘트롤러의 역할
웹 요청이 Rails에 들어오면 라우터가 알맞은 액션을 찾아준다면, 그 액션이 실제로 실행되고 응답을 만들어내는 주체는 콘트롤러예요. Action Controller는 이 콘트롤러 계층의 핵심으로, URL·파라미터 같은 요청 정보를 어떻게 다루고, 세션·쿠키를 어떻게 관리하며, 콜백으로 공통 로직을 어떻게 묶는지를 담당해요. 라우팅에서 콘트롤러로 넘어오는 순간부터 요청 사이클의 중심이 바로 이 계층이에요.
본문
콘트롤러가 하는 일
콘트롤러는 브라우저의 요청을 받아서 애플리케이션의 로직(모델)을 실행하고, 그 결과를 바탕으로 응답(뷰)을 만들어 보내는 중간자예요. Rails에서 콘트롤러는 ApplicationController를 상속한 클래스로 만들고, 그 안에 액션이라는 공개 메서드를 정의해요.
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
end
브라우저가 /articles를 요청하면 ArticlesController#index가 실행되고, @articles 인스턴스 변수는 뷰에서 그대로 사용할 수 있어요.
파라미터 다루기
요청에 담긴 데이터는 params 해시로 접근해요. 두 종류의 파라미터가 섞여 있어요.
- 쿼리스트링 파라미터 — URL에
?page=2처럼 붙는 값. - 라우트 파라미터 —
/articles/:id처럼 URL 경로의 일부로 잡힌 값.
예를 들어 /articles/1?page=2라는 요청이 show 액션으로 들어오면 이렇게 접근해요.
params[:id] # => "1"
params[:page] # => "2"
Strong Parameters
폼에서 온 파라미터를 그대로 모델에 넘기면 위험해요. Strong Parameters 방식으로 허용된 값만 걸러서 쓰는 게 Rails의 기본 철칙이에요. 보통 private 메서드로 필요한 키만 permit해요.
def article_params
params.require(:article).permit(:title, :body)
end
require는 해당 키가 반드시 있어야 함을, permit은 그 안에서 허용할 속성 목록을 뜻해요. 이렇게 걸러진 값만 Article.new(article_params)처럼 넘겨요.
렌더링과 리다이렉트
액션의 결과는 두 가지 방식으로 응답할 수 있어요.
- render — 같은 요청 안에서 특정 뷰를 그대로 응답으로 보내요.
- redirect_to — 새 요청으로 다른 주소로 보내요.
def show
@article = Article.find(params[:id])
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render :new
end
end
redirect_to는 실제로 브라우저에 새 주소를 다시 요청하게 만들고, render는 현재 요청의 컨텍스트로 뷰를 바로 그려요. 저장 실패 때 render :new를 쓰는 이유가 여기에 있어요 — 폼 입력값을 유지한 채 다시 보여주기 위해서죠.
세션과 쿠키
요청은 원래 상태가 없는(stateless) 관계라, 사용자별 상태는 서버 쪽 세션이나 브라우저 쪽 쿠키로 유지해요. 세션은 서버가 저장하고 브라우저엔 세션 id만 남겨요.
session[:user_id] = @user.id
쿠키는 브라우저에 저장되는 작은 데이터로, cookies[:foo] = value처럼 다뤄요. 로그인 상태 유지, 장바구니, 사용자별 설정 같은 것들이 이 두 저장소 위에서 동작해요.
콜백(callbacks)
여러 액션에서 공통으로 수행해야 하는 전처리·후처리는 콜백으로 묶어요. 예를 들어 로그인 검사나 특정 게시글 조회를 액션마다 반복하지 않도록 할 수 있어요.
class ArticlesController < ApplicationController
before_action :set_article, only: [:show, :edit, :update, :destroy]
private
def set_article
@article = Article.find(params[:id])
end
end
before_action은 액션이 실행되기 전에 항상 set_article을 먼저 실행해요. only:로 특정 액션에만 적용하거나 except:로 제외할 수도 있어요. 이 패턴을 쓰면 액션 본문이 훨씬 깔끔해져요.
콘트롤러 네이밍과 대응
콘트롤러 파일은 app/controllers/에 두고, 클래스 이름은 파스칼케이스·파일명은 스네이크케이스를 사용해요. 예를 들어 ArticlesController는 articles_controller.rb에 있어요. 뷰는 같은 이름의 폴더(app/views/articles/) 아래에 액션 이름과 같은 파일로 둬요.
더 알아보기 (Learn more)
- 공식 문서 Action Controller Overview
- Rails Routing from the Outside In에서 어떤 요청이 어떤 액션으로 오는지
- Action View Overview에서 액션이 렌더링하는 뷰 만들기