Bucket Place/Ruby on Rails

[Ruby on Rails] Database 다루기: Scaffold / Migration

Cloud Travel 2014. 4. 29. 13:41


  들어가면서... 


 데이터베이스의 테이블을 생성하고 데이터를 생성, 삭제 그리고 수정하는 방법에 대해서 알아보도록 합시다. 이 모든 기능의 시작점은  Scaffold 에 있다고 볼 수 있습니다. Scaffold를 생성하여 이로 인해 자동으로 수행되는 일에 대해서 알아보도록 합시다.


 오늘의 목표는 책의 리스트를 보여주는 것에 있고, 자동으로 생성되는 컨트롤러와 뷰를 다루는데 있다. 만들 테이블의 모습은 다음과 같다. 또한 앞서 밝혔듯이 사용한 데이터베이스는 SQLite 3이다.

 

 앞으로 나아가기전에 새로운 책리스트(book_list) 프로젝트를 생성하도록 하자.

 > rails new book_list



  Scaffold 


  Scaffold 가 무엇인지에 대해서 한번 간단히 짚고 넘어가보자. 여러번의 실험을 통해서 내가 내린 결론은 다음과 같다.

  - ORM과 연동시켜 클래스를 생성하면서 이에 대한 테이블을 생성해주는 것

  - 생성된 클래스에 대해서 생성, 삭제 그리고 수정에 대한 뷰들과 컨트롤러를 같이 생성해주는 것

    (여기서 생성된 컨트롤러와 뷰를 통해서 바로바로 실험이 가능한 형태까지 된다.)

  - Migration을 생성하여 데이터베이스 테이블 직접적인 생성 및 변경에 직접적으로 영향을 주어 데이터베이스 스키마를 변경


 프로젝트의 폴더로 이동하여 일단  Scaffold 를 생성해보도록 하자. Controller를 생성했을 때와 같이  rails generate ~ 를 이용하면된다.

 > rails generate scaffold [CLASS_NAME] Attribute1:type Attribute2:type ....

 example)

 > rails generate scaffold Book name:string description:text image_url:string \

   price:decimal review_count:decimal

 

  Scaffold로 생성한 클래스에 대해서 복수형으로 Table이 생성된다. 위에서 예문을 실행할 경우 클래스 이름은 Book이고 이에 대한 테이블의 이름은 books가 된다. 또한, 위의 예문을 실행하면 다음과 같은 스크립트 파일들이 자동으로 생성되는 것을 볼 수 있다.

 

 생성된 파일들을 살펴보면 생성된 클래스를 위한 Controller가 하나 생성되었고, 책 리스트를 모두 보여주는 index.html.erb와 책을 생성하는 new.html.erb, 수정하는 edit.html.erb, 자세히 보는 show.html.erb와 같은 뷰들도 생성되어 있다. 아직까지 실질적으로 테이블이 생성된 상태는 아니다!


 테이블 생성에 대해서 우리가 눈여겨봐야 할 파일은 바로 맨 위에서 생성된  [time]_create_[class_name].rb 파일이다. 이 파일은 migration 파일이라고 부른다.



  Migration 

 

 Migartion 은 구체적으로 테이블의 상태를 정의할 수 있으며, 이를 반영시키는 역할을 한다. 파일을 열어보면 방금 정의한 테이블의 정의를 볼 수 있다. 여기서 구체적으로 수정을 할 수 있다. 예를 들어, 위의 테이블에서 가격을 7자리수로 설정하였다.

 

 db/migrate/20140429024033_create_books.rb

class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t| 
      t.string :name
      t.text :description
      t.string :image_url
      t.decimal :price, precision: 7
      t.decimal :review_count

      t.timestamps
    end 
  end 
end

 이제 데이터베이스 테이블을 생성하기 위해서 다음의 명령을 사용하면된다.

> rake db:migrate

 

 다음의 화면을 띄우면서 테이블이 생성된다. 테이블을 수정하고 변경하는 것은 추후에 다시 알아보도록한다.

 

   자동 생성된 페이지 구경하기


 이제 서버를 구동시키고 자동 생성된 페이지를 구경해보자.


 페이지의 주소는 localhost:3000/[controller_name]이 된다. 위와 같이 한경우에는 http://localhost:3000/books 가 된다. 그러면 index.html.rb에 정의된 뷰가 보이게 된다. 현재 저장된 책 리스트를 쭉 보여주는 뷰이지만, 현재는 책 리스트가 없기 때문에 다음과 같은 기본 페이지가 보일 것이다.

 

 여기서 New book을 클릭하면 new.html.erb 가 나오며, 폼에 맞춰 작성을 하면 하나의 책 리스트가 추가된다. 필자는 YES24의 오늘의 책의 내용을 복사해서 추가하였다.


 그러면 다음과 같은 페이지로 변경된 메인 페이지를 볼 수 있을 것이다.

 이제 뷰를 약간 수정하여 Image url을 Image tag를 이용하여 실제 이미지를 보이게 바꿔보자.

 > vi app/views/books/index.html.erb

<h1>Listing books</h1>

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Description</th>
      <th>Image</th>
      <th>Price</th>
      <th>Review count</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>

  <tbody>
    <% @books.each do |book| %>
      <tr>
        <td><%= book.name %></td>
        <td><%= book.description %></td>
        <td><img src="<%= book.image_url %>"/></td>
        <td><%= book.price %></td>
        <td><%= book.review_count %></td>
        <td><%= link_to 'Show', book %></td>
        <td><%= link_to 'Edit', edit_book_path(book) %></td>
        <td><%= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Book', new_book_path %>


 그러면 이제 그림이 실질적으로 보이는 페이지가 된다. 각각의 뷰를 수정하면서 원하는 페이지를 구성해보자.



  마치며...


 하나의 테이블을 Scaffold를 이용하여 생성하면 그에 관련된 페이지들이 자동으로 생성되는 놀라운 일을 경험하였다. 이제 CSS수정을 하는 방법을 알면 기본적으로 페이지 구성이 자동적으로 되는 모습을 볼 수 있을 것 같다.


 PHP에 비해 페이지가 자동으로 생성되서 그런지 많이 편한거 같다-ㅅ-;;