플러닝 Flearning

2-2 Model과 데이터베이스 본문

최신 기술 트렌드/Ruby On Rails (Rails5)

2-2 Model과 데이터베이스

플러닝 2016.08.03 14:03


1. 개요

지금까지 화면에 간단한 텍스트를 띄우는 방법을 배웠습니다.

하지만 이것만으로는 간단한 방명록조차 만들 수 없습니다.

데이터를 다루는(저장, 읽기 등) 방법을 배우지 않았기 때문입니다.

이번 강의에서는 데이터베이스를 사용하는 방법에 대해 배워보겠습니다.

2. 데이터베이스(Database)

블로그에 작성한 글, 댓글 등은 사이트를 나갔다 와도 사라지지 않습니다. 이 말은 즉 데이터가 어딘가에 저장되어 있다는 뜻입니다.

데이터를 영구적으로 저장하기 위해서는 반드시 하드디스크의 파일에 저장해야 하는데, 데이터를 파일에 효율적으로 보관하고, 읽고, 쓰고, 삭제하는 등의 기능을 전문적으로 하는 프로그램이 있습니다. 이를 DBMS(DataBase Management System)라고 부릅니다.

많이 사용되는 DBMS는 sqlite, MYSQL, PostgreSQL등이 있습니다.

config/database.yml 파일에서 어떤 DBMS를 사용할지 설정할 수 있습니다.

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

adapter속성에 sqlite3을 사용하도록 명시한 것을 볼 수 있습니다.

sqlite는 개발(development)모드와 테스트(test)모드에서 많이 사용합니다.

하지만 실제 운영(production)모드에서 사용하기에는 성능이 떨어지기 때문에 운영 모드로 실행할 땐 MYSQL이나 PostgreSQL등을 사용하는 것이 일반적입니다.

2-1. 데이터 저장 방식

사용자로부터 컨택트 폼에서 어떤 데이터를 입력받아야할지 생각해보세요.

하나의 컨택트는 이름(name), 이메일(email), 내용(content)을 가질 수 있습니다.

이름, 이메일, 내용과 같이 데이터의 종류를 구분짓는 것을 컬럼(column)이라고 합니다.

3줄(가로)의 데이터는 3개의 컨택트를 의미하며 데이터 1줄을 로우(row)라고 부릅니다.

그리고 이처럼 연관있는 컬럼과 로우들이 모여서 하나의 테이블(table)을 만들어냅니다.

3. ORM - ActiveRecord

데이터베이스에 있는 데이터에 접근하기 위해서는 SQL이라는 언어를 사용해야 합니다.

그래서 개발자는 SQL 언어를 공부해야했고, DBMS마다 SQL 문법이 다른 부분도 고려를 해야했습니다.

이를 해결하기 위해 개발자와 데이터베이스 사이에 통역가의 역할을 하는 ORM(Object Relational Mapping)이 등장했습니다.

ORM이 중간에서 통역가의 역할을 해줌으로써 개발자는 익숙한 루비, 파이썬, 자바 등의 코드로 데이터베이스에 접근을 할 수 있게 되었고, DBMS마다 달라지는 SQL 문법을 고려할 필요가 없어졌습니다.

즉, ORM은 개발자가 작성한 코드를 SQL로 변환시켜줘서 개발자와 데이터베이스가 원활한 소통을 할 수 있게 해줍니다.

또한 데이터에 쉽게 접근할 수 있는 기능도 제공합니다.

루비 온 레일즈에서는 ActiveRecord라는 ORM을 사용합니다.

4. 모델

모델은 DB의 테이블과 매칭되는 루비 클래스입니다.

한 줄의 명령어로 모델 파일을 생성할 수 있습니다.

rails g model Contact

먼저 모델 파일은 app/models/contact.rb 경로에 생성되었고 빈 클래스만 존재합니다.

# app/models/contact.rb
class Contact < ApplicationRecord
end

Contact 모델이 상속받는 ApplicationRecord는 모든 모델에서 공통으로 사용하는 기능을 넣을 수 있도록 레일즈 5.0부터 추가되었습니다. 모든 모델이 ApplicationRecord를 상속받습니다. 레일즈 5.0 이상 프로젝트 생성시 자동 생성됩니다.

# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

ContactApplicationRecord를 상속받고, ApplicationRecordActiveRecord를 상속받습니다.

그래서 Contact 모델은 빈 클래스지만 ActiveRecord에서 제공하는 기능을 모두 사용할 수 있습니다.

# 데이터를 읽고(find) 쓰는(create)등의 기능을 제공해주는 ActiveRecord

# ex) id1번인 Contact를 가져오기
first_contact = Contact.find(1)

# ex) DB에 새로운 Contact row 생성하기
Contact.create(name: "...", email: "...", content: "...")

지금 당장 ActiveRecord가 어떤 기능을 제공하는지 알 필요는 없습니다. 알고 싶으시다면 레일즈 가이드를 참고하세요.

5. 마이그레이션

마이그레이션이란 데이터베이스 구조에 변화(생성, 수정, 삭제 등)를 주는 작업입니다.

레일즈에서는 마이그레이션 파일을 생성&작성하고 마이그레이트 명령어를 실행하는 순서로 진행됩니다.

5-1. 마이그레이션 파일 생성

마이그레이션 파일을 생성하는 명령어입니다.

rails g migration [MigrationName]

여기서 잠깐, 모델은 DB의 테이블과 매칭되는 클래스라고 했습니다.

그렇다면 DB에 테이블은 어떻게 만들어야 할까요?

테이블 생성도 DB 구조에 변화를 주는 것이기 때문에 마이그레이션 파일을 생성&작성 해야 합니다.

그래서 레일즈는 모델을 생성할 때 마이그레이션 파일도 자동으로 생성해줍니다.

db/migrate폴더에 20160519072109_create_contacts.rb 마이그레이션 파일이 만들어진 것을 확인할 수 있습니다. (앞에 날짜는 다를 수 있습니다.)

class CreateContacts < ActiveRecord::Migration[5.0]
  def change
    create_table :contacts do |t|

      t.timestamps
    end
  end
end

즉 모델을 생성할 땐 자동으로 마이그레이션 파일이 생성되기 때문에 따로 생성하지 않아도 됩니다.

5-2. 마이그레이션 파일 작성

마이그레이션 파일은 ActiveRecord::Migration을 상속받은 클래스 안에 change 메서드를 가집니다.

change 메서드 안에 DB에 주고 싶은 변화를 루비 코드로 기술하면 됩니다.

class CreateContacts < ActiveRecord::Migration[5.0]
  def change
    # email, content 컬럼을 가진 테이블을 생성한다.
    create_table :contacts do |t|
      t.string  :email
      t.text    :content

      t.timestamps
    end
  end
end

테이블을 생성하기 위해 create_table을 사용했고 2개의 컬럼을 추가했습니다.

ActiveRecord에서 지원하는 데이터 타입은 다음과 같습니다.

  • primary_key
  • string
  • text
  • integer
  • float
  • decimal
  • datetime
  • timestamp
  • time
  • date
  • binary
  • boolean

자세한 내용은 레일즈 가이드에서 확인하실 수 있습니다.

5-3. 마이그레이트 명령어 실행

파일을 작성하는 것만으로 데이터베이스에 적용되지는 않습니다. 데이터베이스에 변화를 적용하기 위해 마이그레이트 작업을 수행해야 합니다.

다음과 같은 명령어를 입력해서 마이그레이트 작업을 수행할 수 있습니다.

rake db:migrate 레일즈 5.0 부터는 rails db:migrate도 가능합니다.

마이그레이트가 완료되면 데이터베이스에 email과 content 컬럼을 갖는 contacts 테이블이 생성됩니다.

contacts 테이블이 생성되면 레일즈의 Contact 모델 클래스와 연결되어서 본격적으로 모델 클래스를 사용할 수 있게 됩니다.

# ex
Contact.create(email: "doldol@gmail.com", content: "Hello World")
contact = Contact.find(1)
puts contact.email # => doldol@gmail.com

5-4. 데이터베이스 구조 변경하기

이미 마이그레이트된 마이그레이션 파일은 다시 마이그레이트를 실행해도 적용되지 않습니다.

예를 들어 CreateContacts 마이그레이션 파일을 한 번 마이그레이트 한 뒤 name 컬럼을 추가한 후 다시 마이그레이트를 해도 contacts 테이블에는 name 컬럼이 추가되지 않습니다.

DB를 수정하기 위해서는 새로운 마이그레이션 파일을 생성&작성해야합니다.

name 컬럼을 추가하는 마이그레이션 파일은 다음과 같이 생성할 수 있습니다.

# AddNameToContact 이름은 자유입니다.
rails g migration AddNameToContact

새로운 컬럼을 추가하기 위해 add_column메서드를 사용합니다.

class AddNameToContact < ActiveRecord::Migration[5.0]
  def change
    add_column :contacts, :name, :string
  end
end

다시 rake db:migrate 명령어를 실행하면 contacts 테이블에 name 컬럼이 추가됩니다.

# ex
Contact.create(name: "김똘똘", email: "doldol@gmail.com", content: "Hello World")
contact = Contact.find(1)
puts contact.name # => 김똘똘

마이그레이션 파일에서 사용할 수 있는 메서드는 공식 문서를 참고하세요.

5-5. DB 초기화하기

rake db:drop 명령어로 DB를 초기화 시킬 수 있습니다.

하지만 DB를 초기화하면 모든 데이터가 삭제되니 운영모드에서는 사용하지 않는 것이 좋습니다.

5-6. DB 스키마

마이그레이션 파일은 DB가 변해온 히스토리와 같습니다. 수많은 마이그레이션 파일들이 전부 실행된 후 DB의 최종 형태를 스키마라고 합니다.

db/schema.rb 파일에서 확인할 수 있습니다.

ActiveRecord::Schema.define(version: 20160519102703) do

  create_table "contacts", force: :cascade do |t|
    t.string   "email"
    t.text     "content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string   "name"
  end

end

6. 요약

  1. 데이터를 영구적으로 저장하기 위해 데이터베이스를 사용한다.
  2. 데이터베이스에 직접 접근하려면 SQL 언어를 사용해야 하는데, ORM을 사용하면 나에게 익숙한 언어로 데이터베이스에 쉽게 접근할 수 있다.
  3. 루비 온 레일즈는 ActiveRecord라는 ORM을 사용한다. 즉 SQL이 아닌 루비 코드로 데이터베이스에 접근할 수 있다.
  4. 데이터베이스의 구조(테이블, 컬럼 등)를 설계하는 작업을 Migration이라고 한다.
  5. 한 번 실행된 마이그레이션 파일은 다시 실행되지 않는다.
  6. 데이터베이스에 존재하는 테이블을 루비 클래스로 연결해주는 것을 모델이라고 한다.


저작자 표시
신고

'최신 기술 트렌드 > Ruby On Rails (Rails5)' 카테고리의 다른 글

Contact 작성 기능 구현  (0) 2016.08.03
Rails Console  (0) 2016.08.03
2-2 Model과 데이터베이스  (1) 2016.08.03
Form 헬퍼  (0) 2016.08.03
[심화] Partial로 효율적인 코드 관리  (0) 2016.08.03
[심화] Asset Pipeline에 대한 이해  (0) 2016.08.03
1 Comments
댓글쓰기 폼