Skip to content

Rails로 간단한 게시판을 만들어보자 - 모델 1편

1. Rails의 모델은 어떤 역할을 하는가?

모델은 비즈니스로직과 이를 수행하는데 필요한 여러가지 로직들이 정의되는 공간이다.
대표적으로 DB에서 데이터를 읽고 쓰는것이 있다.
이밖에도 데이터의 유효성검사, 모델간의 관계 설정 등을 담당한다.



2. ORM 그리고 ActiveRecord

ORM은 객체와 관계형 데이터베이스의 데이터를 매핑해주는 기술을 말한다.
ActiveRecord는 Rails에서 ORM을 구현하기 위해 사용되는 구현체이다. Java의 JPAHibernate의 관계와 같다.
ORM과 관련된 자세한 내용은 검색해보면 많이 나오는 관계로 생략하겠다.



3. 모델을 생성하는 방법

# rails g model modelName [field:type ...]
$ rails g model Post title:string body:text

위 명령은 Post 모델에 필요한 파일들을 생성한다. 한번에 필드를 나열해서 정의할 수도 있고, 생략한 다음 나중에 정의해도 된다. 명령을 실행하기 전에 눈여겨 볼 점은 지난번과 마찬가지로 이름의 형태이다.
앞서 살펴본 컨트롤러의 경우는 복수형(plural)을 사용하는 것이 컨벤션이었다면, 모델의 경우는 단수형(singular)을 사용해야한다.
그 이유는 바로 Rails가 모델에 매핑되는 테이블 이름모델 이름의 복수형으로 자동 생성하기 때문이다.
명령어를 실행하면 다음과 같은 결과를 볼 수 있다.

$ rails g model Post title:string body:text
Running via Spring preloader in process 44409
      invoke  active_record
      create    db/migrate/20210723132121_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml

총 4개의 파일이 생성되었다는 메시지를 확인할 수 있는데, 기능 구현에 필요한 파일은 모델 파일(post.rb)마이그레이션 파일(20210723132121_create_posts.rb)이다.



3.1 모델 파일

class Post < ActiveRecord::Base
end
명령어를 실행해서 생성한 post.rb의 코드이다.
코드에는 필드에 관한 내용이 아무것도 없지만, 실행되는 시점에는 ActiveRecord가 매핑을 해준다.
그래서 Post.title처럼 값을 불러오는 것이 가능하다. 나중에는 모델간의 관계, 유효성 검사로직, 비즈니스 로직 등의 내용을 작성할 떄 사용된다. 구체적인 사용법은 나중에 CRUD 관련된 내용을 설명할 때 다룰 생각이다.



3.2 마이그레이션 파일

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :title
      t.text :body
      t.timestamps
    end
  end
end
20210723132121_create_posts.rb이라는 이름의 마이그레이션 파일의 코드이다.
마이그레이션 파일에는 테이블을 생성하기 위해 필요한 내용들이 정의되어 있다.
테이블 다소 난잡한 이름을 가진 파일인데, 눈썰미가 있는 사람이라면 파일명에 타임스탬프가 포함되었다는 것을 눈치챘을 것이다.
그 이유는 마이그레이션 파일이 순서대로 처리되도록 하기위함이다.
예를 들어, A테이블과 A의 서브테이블인 B가 있다고 가정해보자.
만약 20210723_A.rb 라는 마이그레이션 파일과 20210724_B.rb라는 파일이 있다면 마이그레이션을 수행할 때 오류가 발생하지 않는다.
A테이블을 먼저 생성하고 B를 생성하는건 자연스럽기 때문이다.
그러나 20210723_B.rb20210724_A.rb와 같은 순서로 파일을 생성했다면 오류가 발생하게 된다.
20210723_B.rb파일을 실행하는 시점에는 의존할 테이블인 A를 찾을 수 없기 때문이다.
간단히 위해서 change 라는 메서드의 내용



4. DB에 반영하기

$ rake db:migrate
== 20210723132121 CreatePosts: migrating ======================================
-- create_table(:posts)
  -> 0.0014s
== 20210723132121 CreatePosts: migrated (0.0015s) =============================

모델과 마이그레이션 파일을 생성했다고 해서 DB에 테이블이 생기는것은 아니다.
DB에 앞서 진행한 내용들을 적용하기 위해서는 rake db:migrate 명령어를 실행해야한다.
위의 내용은 rake db:migrate를 실행했을 때의 결과내용이다.
posts 라는 복수형 이름의 테이블이 생성되었다는 사실을 알 수 있다.

# schema.rb
ActiveRecord::Schema.define(version: 20210723132121) do
  create_table posts, force: true do |t|
    t.string   title
    t.text     body
    t.datetime created_at
    t.datetime updated_at
  end
end

rake db:migrate 명령을 실행하면 위와 같은 내용의 schema.rb파일이 생성된다.
실제로 DB에 관한 내용을 처리할 때는 schema.rb의 내용을 기반으로 작업을 수행하게 된다.
간혹 마이그레이션 파일의 내용을 수정하고 rake db:migrate 명령을 실행했음에도 테이블에 변화가 없는 경우가 있었다.
이런 경우 schema.rb 파일에 수정한 내용이 반영되어있지 않았을 가능성이 크다.
rake db:migrate:reset 명령어를 실행하면 schema.rb를 다시 생성하므로 문제를 해결할 수 있다.



Reference

https://guides.rubyonrails.org/v4.1/getting_started.html


작성자: 성승익

작성일: