Ruby on Rails 기본 - 모델
모델은 데이터베이스 또는 외부 서비스에 접근하기 위한 비즈니스 로직을 담당하는 컴포넌트이다. 다양한 컴포넌트를 이용할 수 있지만 Rails 초보자라면 O/R 맵퍼를 사용하는 액티브 레코드를 이용해보자.
O/R 맵퍼
O/R(Object/Relational) 맵퍼는 관계형 데이터베이스와 객체 지향 언어의 객체를 이어주는 라이브러리다.
객체 모델과 데이터베이스 관계 모델은 구조가 다르다. 이를 객체 관계 불일치(impedance mismatch)라고 부르는데, O/R 맵퍼는 이러한 잘못된 매칭을 제거하기 위한 툴이다. 액티브 레코드에서는 데이터베이스의 테이블 한 개로 모델 클래스 한 개를 생성한다. 모델 클래스의 인스턴스는 레코드 한 개를 나타내는 객체로 객체의 속성은 테이블의 필드를 그대로 갖게 된다.
O/R 맵퍼로 사용되는 액티브 레코드를 사용하면 Rails에서 관계형 데이터베이스를 마치 객체를 다루듯이 조작할 수 있다.
액티브 레코드를 사용해 데이터베이스에 연결하려면 일단 config/database.yml
에 연결과 관련된 설정을 해줘야한다.
YAML은 <매개 변수 이름>: <값>의 형태로 매개 변수를 표시한다. 또한 들여쓰기로 계층을 표현할 수 있는데 들여쓰기로 탭 문자를 이용할 수는 없다.
database.yml에서 사용할 수 있는 중요한 접속 관련 매개 변수
매개 변수 이름 | 설명 |
adapter | 접속할 데이터베이스 종류 |
database | 데이터베이스 이름(SQLite는 데이터베이스 파일 경로) |
host | 호스트 이름 또는 IP 주소 |
port | 포트 번호 |
pool | 확보할 접속 풀. 데이터베이스 접속을 미리 준비해두고 이용 후에도 접속을 끊지 안혹서 풀에 돌려보내는 식으로 접속 오버헤드를 줄일 때 사용한다. |
timeout | 접속 타임아웃 시간. 밀리초 단위다. |
encoding | 사용할 문자코드 |
username | 사용자 이름 |
password | 비밀번호 |
socket | 소켓 |
데이터베이스 이름은 보통 개발(development), 테스트(test), 배포(production) 환경으로 목적에 맞게 환경을 구분할 수 있다. 데이터베이스 이름은 보통 <환경 이름>.sqlite3가 되지만 변경해도 상관없다.
모델도 generate 명령어로 생성한다.
모델 Association 이름 규칙
종류 | 설명 | 예 |
모델 클래스 | 첫 글자를 대문자로 하고 단수형으로 사용 | Book |
모델 클래스의 파일 이름 | 첫 글자를 소문자로 하고 단수형으로 사용 | book.rb |
테이블 | 첫 글자를 소문자로 하고 복수형으로 사용 | books |
테스트 스크립트 | xxx_test.rb(첫 글자는 소문자로 하고 단수형으로 사용) | book_test.rb |
Rails는 테이블 생성 또는 수정에 마이그레이션(Migration)이라는 기능을 사용한다. 마이그레이션은 테이블 레이아웃을 생성 또는 변경하기 위한 구조이다. 마이그레이션을 사용하면 테이블 관련 작업을 반자동할 수 있어서 레이아웃을 변경하는 일이 발생하더라도 쉽게 반영할 수 있다.
로 마이그레이션 파일을 실행할 수 있다.
Rails는 테스트 데이터를 데이터베이스 내부에 셋팅해둘 수 있도록 픽스처(fixture)라는 기능을 제공한다. 픽스처는 YAML 형식의 데이터를 데이터베이스에 넣어주는 기능이라 생각하면 된다.
만약 config/test/fixtures
경로에 books.yml
을 옮겼다면, 아래 커맨드를 치는 식으로 작동시킨다.
DB에 저장된 Table은 Rails 가 예약해서 사용하는 필드가 포함되어있다.
Rails가 자동 생성한 필드
필드 이름 | 설명 |
id | Primary key(자동으로 번호가 붙음) |
created_at | 레코드 생성 일자(액티브 레코드가 자동으로 설정) |
updated_at | 레코드 수정 일자(액티브 레코드가 자동으로 설정) |
따라서 개발자가 필드를 정의할 때 이런 예약어를 피해야한다.
Last updated