Ruby on Rails Reference
Ruby on Rails 프레임워크 레퍼런스
Ruby on Rails Reference 소개
Ruby on Rails 레퍼런스는 Rails 웹 프레임워크의 핵심 규칙과 API를 체계적으로 검색할 수 있는 치트 시트입니다. 라우팅, 모델, 컨트롤러, 뷰, 마이그레이션, 테스트 등 6개 카테고리로 구성되어 있으며, 각 항목에는 실제 코드 예제가 포함되어 있습니다. Rails를 처음 배우는 개발자와 메서드 시그니처나 제너레이터 문법이 생각나지 않을 때 빠르게 확인하고 싶은 숙련된 개발자 모두에게 유용합니다.
Ruby on Rails는 MVC(Model-View-Controller) 패턴을 따르며 "설정보다 규칙(Convention over Configuration)"을 강조합니다. 이 레퍼런스는 라우팅 계층을 깊이 있게 다룹니다. 기본 GET/POST 라우트, 한 번에 7가지 RESTful 라우트를 생성하는 `resources` 헬퍼, 계층적 연관 관계를 위한 중첩 리소스, 어드민 영역을 위한 네임스페이스 그룹, 루트 경로 설정이 모두 포함됩니다. 모델 섹션에서는 ActiveRecord 연관 관계(`has_many`, `belongs_to`, 다대다 관계를 위한 `has_many :through`), 유효성 검증 매크로, 재사용 가능한 쿼리 조각인 명명된 스코프를 다룹니다.
컨트롤러 섹션에서는 중복 제거를 위한 `before_action` 콜백, 안전한 대량 할당을 위한 Strong Parameters(`params.require(:model).permit()`), `render`/`redirect_to` 응답 패턴을 다룹니다. 뷰 섹션에서는 ERB 템플릿 문법(`<%= %>`와 `<% %>`), 파셜 렌더링, `link_to`와 `form_with` 헬퍼를 다룹니다. 마이그레이션 섹션은 `rails db:migrate`, `add_column`, `create_table`, `add_index`를 포함하며, 테스트 섹션은 Rails 내장 테스트 프레임워크의 `assert_equal`, `assert_difference`, `assert_response`, YAML 픽스처를 다룹니다.
주요 기능
- 라우팅·모델·컨트롤러·뷰·마이그레이션·테스트 6개 카테고리 수록
- 라우팅: GET/POST 라우트, resources(RESTful), 중첩 리소스, namespace, root path
- ActiveRecord: has_many, belongs_to, has_many :through, validates, 명명된 스코프
- 컨트롤러: before_action 콜백, Strong Parameters(params.require.permit), render/redirect_to
- 뷰: ERB 태그(<%= %>, <% %>), render partial, link_to 헬퍼, form_with 모델 빌더
- 마이그레이션: rails db:migrate/rollback, add_column, t.references 포함 create_table, add_index
- 테스트: rails test, assert_equal, assert_difference, assert_response :success, YAML 픽스처
- 100% 클라이언트 사이드 처리 — 회원가입 불필요, 데이터 서버 전송 없음
자주 묻는 질문
`resources :articles`는 Rails 라우팅에서 무엇을 생성하나요?
`resources :articles`는 7가지 RESTful 라우트를 생성합니다: GET /articles(index), GET /articles/new(new), POST /articles(create), GET /articles/:id(show), GET /articles/:id/edit(edit), PATCH/PUT /articles/:id(update), DELETE /articles/:id(destroy). 각 라우트는 해당 컨트롤러 액션과 매핑됩니다. `only:` 또는 `except:`로 생성할 라우트를 제한하고, 블록으로 중첩 리소스를 만들 수 있습니다.
has_many :through와 has_and_belongs_to_many의 차이는 무엇인가요?
`has_many :through`는 명시적인 조인 모델을 통해 다대다 관계를 만듭니다. 조인 레코드에 추가 속성을 저장하거나 유효성 검증을 추가할 때 선호됩니다. `has_and_belongs_to_many`는 모델 없이 조인 테이블로 직접 다대다 관계를 만들지만 조인에 속성을 추가할 수 없습니다. 유연성이 더 높은 `has_many :through`를 대부분의 경우에 사용하세요.
Strong Parameters란 무엇이고 왜 필요한가요?
Strong Parameters는 허용된 속성을 명시적으로 화이트리스트에 추가하여 대량 할당 취약점을 방지합니다. 공격자가 폼에 추가 필드(예: `admin: true`)를 제출해 민감한 모델 속성을 업데이트하는 것을 막습니다. 컨트롤러에서 `params.require(:model_name).permit(:field1, :field2)`를 사용해 안전한 파라미터 해시를 만드세요. 원시 `params`를 `create`나 `update`에 직접 전달하면 `ActionController::ForbiddenAttributesError`가 발생합니다.
Rails에서 데이터베이스 마이그레이션은 어떻게 작동하나요?
마이그레이션은 데이터베이스 스키마 변경을 데이터베이스에 독립적인 방식으로 기술하는 Ruby 클래스입니다. `rails generate migration AddColumnToTable column:type`으로 마이그레이션 파일을 생성하고 `rails db:migrate`로 적용합니다. Rails는 `schema_migrations` 테이블에서 실행된 마이그레이션을 추적합니다. `rails db:rollback`으로 마지막 마이그레이션을 되돌릴 수 있습니다.
Rails 컨트롤러에서 before_action은 어떤 용도로 사용되나요?
`before_action`은 하나 이상의 컨트롤러 액션 실행 전에 메서드를 실행합니다. 주로 리소스 조회(`@article = Article.find(params[:id])`), 인증 확인, 공유 인스턴스 변수 설정에 사용됩니다. `only: [:show, :edit, :update, :destroy]`로 특정 액션에만 적용하거나 `except:`로 제외할 수 있습니다. 콜백 내에서 렌더링이나 리다이렉트를 하면 체인이 중단됩니다.
Rails의 명명된 스코프(named scope)는 어떻게 작동하나요?
명명된 스코프는 모델에 `scope :name, -> { query }`로 정의하는 재사용 가능한 쿼리 조각입니다. 예를 들어 `scope :published, -> { where(published: true) }`를 정의하면 코드 어디서든 `Article.published`를 호출할 수 있습니다. 스코프는 체이닝이 가능합니다: `scope :recent`도 정의하면 `Article.published.recent`처럼 사용할 수 있습니다. ActiveRecord::Relation을 반환하므로 다른 스코프, `where`, `limit`과 잘 조합됩니다.
Rails 테스트 프레임워크는 어떻게 작동하나요?
Rails는 Minitest 기반의 내장 테스트 프레임워크를 포함합니다. 테스트 파일은 `test/models/`, `test/controllers/` 등에 위치합니다. `rails test`로 실행하거나 특정 파일을 지정할 수 있습니다. 테스트 메서드는 `test "설명" do ... end` 형식으로 작성합니다. 주요 어설션으로는 `assert_equal expected, actual`, `assert_difference "Model.count", 1 do ... end`(카운트 변화 확인), `assert_response :success`(HTTP 200 확인) 등이 있습니다.
Rails에서 render와 redirect_to의 차이는 무엇인가요?
`render`는 새 HTTP 요청 없이 뷰 템플릿을 렌더링하고 200 응답을 반환합니다. 폼 제출 후 유효성 검증에 실패했을 때 제출된 데이터를 유지한 채 폼을 다시 표시하는 데 사용합니다. `redirect_to`는 302 응답을 반환해 브라우저가 다른 URL로 새 GET 요청을 만들도록 합니다. 성공적인 create/update/destroy 후 브라우저 새로고침 시 폼 재제출을 방지하기 위해 사용합니다(Post/Redirect/Get 패턴).