Active Record 기초 — 모델과 데이터베이스의 연결
Active Record 기초 — 모델과 데이터베이스의 연결
데이터베이스에 저장된 정보를 루비 코드로 다루고 싶을 때, 매번 SQL을 직접 쓴다면 금방 지치죠. Active Record는 Rails에서 데이터베이스와 객체 사이를 이어주는 계층이에요. "하나의 클래스가 하나의 테이블을, 하나의 인스턴스가 하나의 행을" 담당한다는 원칙을 바탕으로, 테이블을 다루는 대부분의 작업을 우아한 루비 코드로 바꿔줘요.
본문
Active Record의 역할
Active Record는 객체 관계 매핑(Object-Relational Mapping, ORM) 도구예요. 데이터베이스의 테이블을 클래스로, 행을 객체로, 컬럼을 속성(attribute)으로 사상해요. 덕분에 User.find(1)처럼 루비 메서드 호출로 데이터를 조회하고, .save나 .destroy로 저장·삭제를 처리하죠.
이 계층이 해주는 일은 크게 네 가지로 정리할 수 있어요.
- 데이터베이스 스키마와 독립적으로 모델 클래스와 테이블을 연결해요.
- 테이블의 컬럼과 타입을 알고 있어서, 객체의 속성을 컬럼에 매핑해요.
- 속성에 대한 **접근자(getter/setter)**를 자동으로 만들어요.
- 객체를 저장·삭제할 때 필요한 동작(유효성 검사, 연관관계, 트랜잭션 등)을 함께 처리해요.
모델 클래스 만들기
모델은 app/models/ 아래에 클래스로 정의해요. 예를 들어 사용자를 다루는 모델은 이렇게 생겼어요.
class User < ApplicationRecord
end
ApplicationRecord를 상속받는 것만으로도 테이블 연결, 속성 접근, CRUD가 기본으로 갖춰져요. 클래스 이름 User는 단수형이고, 이 클래스는 기본적으로 users 테이블과 연결되는데, 이 규칙을 **명명 규칙(naming convention)**이라고 해요.
테이블 명명 규칙
Active Record는 클래스 이름과 테이블 이름 사이의 규칙을 자동으로 적용해요.
| 모델 / 클래스 | 테이블 / 스키마 |
|---|---|
Article |
articles |
LineItem |
line_items |
Deer |
deers |
Mouse |
mice |
Person |
people |
복수형 변환은 영어 단수·복수 규칙을 따르지만, 예외적인 단어(mouse → mice 등)나 불규칙 복수형은 커스텀 규칙으로 등록할 수 있어요. 클래스가 하나의 테이블에 딱 맞지 않는 경우에는 self.table_name으로 테이블을 직접 지정하기도 해요.
컬럼과 타입
데이터베이스의 컬럼은 자동으로 객체의 속성이 돼요. 예를 들어 users 테이블에 name(문자열), age(정수) 컬럼이 있다면, User 인스턴스는 user.name, user.age로 접근할 수 있어요. 컬럼의 타입은 Active Record가 알고 있으므로 형변환도 처리해줘요.
생성·저장·삭제
새 객체를 만들고 저장하는 가장 기본적인 흐름을 보면 이래요.
user = User.new(name: "지민", age: 30)
user.save
new는 메모리에만 객체를 만들고, save가 되어야 비로소 데이터베이스에 반영돼요. create는 new와 save를 한 번에 처리하는 편의 메서드예요.
User.create(name: "지민", age: 30)
저장된 객체를 조회할 때는 find, find_by, where 같은 클래스 메서드를 써요.
user = User.find(1) # 기본 키로 조회
user = User.find_by(name: "지민") # 첫 번째 일치 행 반환
users = User.where(age: 30) # 조건에 맞는 모든 행
삭제는 destroy(인스턴스 메서드)나 destroy_by·delete_by(클래스 메서드)를 사용해요.
스키마와 모델을 함께 만들기
모델과 테이블을 함께 생성하는 가장 Rails다운 방법은 제너레이터를 쓰는 거예요. 이 명령은 모델 파일과 함께 마이그레이션 파일도 만들어줘요.
bin/rails generate model User name:string age:integer
이렇게 생성된 마이그레이션을 bin/rails db:migrate로 적용하면 users 테이블이 생겨요.
마이그레이션으로 스키마 관리
스키마 변경은 마이그레이션 파일로 관리해요. 테이블이 이미 있는데 컬럼을 추가하려면 이렇게 작성하죠.
class AddPublishedToArticles < ActiveRecord::Migration[8.0]
def change
add_column :articles, :published, :boolean, default: false
end
end
마이그레이션은 버전이 쌓이면서 스키마의 이력을 남기고, 롤백도 가능하도록 해줘요.
더 알아보기 (Learn more)
- 공식 문서 Active Record Basics
- Active Record Migrations로 스키마 변경 자세히 익히기
- Active Record Validations로 저장 전 유효성 검사 다루기