지난 포스트에 이어 이번에는 rails의 환경설정 파일을 이용해서 DB에 연결하고 간단한 CRUD 기능을 만들어 보겠습니다.

프로젝트 디렉토를 살펴보시면 /config/databese.yml파일이 있습니다. 파일을 열어보시면 3가지 타입의 환경설정이 있습니다. 'development', 'test', 'production' 보시는 그대로 서로 다르게 설정하여 환경에 적절하도록 하용할 수 있습니다. 이러한 설정들은 /config/environment.rb에서 지정하실 수 있습니다. 파일을 여시고

ENV['RAILS_ENV'] ||= 'development'

위와 같이 설정하여 databese.yml파일안에 있는 'development'환경을 사용하도록 하시면 됩니다.
참고로 저는  local에 mysql를 설치하여 진행하고 있습니다.

development:
  adapter: mysql
  database: rubyShop_development
  username: root
  password: 1234
  host: localhost
  encoding: utf8

DB에 접속할 수 있는 환경설정은 마무리 하였습니다.
이제 Rails의 액티브 레코드와 스캐폴딩(Scaffolding)을 활용하여 CRUD를 만들어 보겠습니다.
엑티브 레코드의 개념도 멋지지만 더 맘에 드는 것은 스캐폴딩 기능입니다. 전 개인적으로 교육학을 배우면서 Vygotsky의 근접발달영역 (Zone of Proximal Development : ZPD)와 Scaffolding을 관심있게 들었습니다. 스캐폴딩이라는 단어는 그때 처음 접했습니다. 그때도 이 단어가 가지는 의미가 참 좋다는 생각을 했습니다. 시간이 훌쩍 지나고 나서 다시 만난 이 개념을 Rails는 프로그램에 멋지게 적용해 주었습니다.

우선 Model역활을 하는 녀석을 만들어 볼 생각입니다. 우선 대분류 역할을 하는 녀석입니다.

ruby script/generate model BigCategory

커맨드창에서 위와 같이 적어주시면 관련 파일들이 자동으로 생성됩니다.

exists app/modes/
exists test/unit/
exists /test/fixures/
create /app/model/big_categories.rb
create /test/unit/big_categories_test.rb
create /test/fixtures/big_categories.yml
exists /db/migrate
create /db/migrate/001_create_big_categoreis.rb

test, model, 마이그레이션과 관련된 파일들이 생성되었습니다. 우선 파일 이름들을 살펴보셔야 할것 같습니다. 전 모델명으로 'BigCategory'라고 적었는데 만들어진 모델파일명은 'big_category.rb'입니다. 이 후에 실제로 DB에 table를 만들때 table의 이름을 'big_categories'로 하게 됩니다. 일종의 규칙이라고 생각하시면 됩니다.
( XML미로를 헤매는 것보다는 처음 규칙을 익힐때 조금 익숙하지 않아서 늦어질 수 있지만 이 후에는 간결함과 명확함으로 더 편하게 느껴지는 Rails 접근방법은 매력적인 부분이라고 생각합니다. )
001_create_big_categoreis.rb을 열어서 몇가지 설정을 하게 됩니다.

class CreateBigCategories < ActiveRecord::Migration
  def self.up
    create_table :big_categories do |t|
      t.column 'name', :string
      t.column 'show_order', :integer
    end
  end
  def self.down
    drop_table :big_categories
  end
end

코드만으로도 감을 잡으셨을 거라고 생각합니다. 이 녀석은 무언가를 했을때 DB에 접근하여 자동으로 table를 만들거나 삭제하는 역할을 합니다. 그 table은 이름이 'big_categories'가 되고  필드로 'name'과 'show_order'를 가지게 됩니다. 'name'은 varchat이고 'name'은 int입니다. 자 이제 이녀석을 이용해서 table를 만들어 보겠습니다.

rake db:migrate

커맨드라인에서 위와 같이 실행하신 이후에 DB에 접근하시면 table이 생성되어 있는 것을 확이 하실 수 있습니다.
물론 DB에 직접 접근하셔서  table를 만드셔도 됩니다. 하지만 초반에 이러한 설정들을 잘 만들어 놓으시면 이 후에 큰 도움이 됩니다. ^^  실제로 위와 같은 방법으로 모델을 증가시키게 되면 관련 파일들이 계속해서 증가하게 됩니다. 만약 'small_category'모델을 추가하게 되시면 002_create_small_cetegories.rb파일이 생기게 됩니다. 보시듯 앞의 숫자가 하나씩 증가하고 있습니다. 이 숫자는 이후에 rake명령을 하실때 자유롭게 사용하실 수 있습니다.
가령 'rake db:migrate VERSION=0'이라고 하시면 table은 모두 사라집니다. 'rake db:migrate VERSION=1'이라고 하시면 big_categories만 생성되게 됩니다.

DB에 table과 model를 만드었으니 이제는 컨트롤러와 뷰를 추가할 차례입니다.
이전 포스트에서 컨트롤러와 뷰를 추가해서 로그인을 만들었습니다. 이번에는 scaffolding을 이용하여 model과 연결도니 컨트롤러와 view를 만들어 보겠습니다.

ruby script/generate scaffold BigCategory
또는
ruby script/generate scaffold BigCategory big_categories

첫줄처럼 해주면 기본적으로 big_categories_contoller.rb라는 컨트롤러와 View에 해당하는 파일이 생성됩니다. 컨트롤러 이름을 변경해주고 싶다면 후자처럼 지정해 주실 수있습니다. 이 역시도 일종의 규칙입니다. scaffold는 모델과 컨트롤러, 뷰를 모두 한꺼번에 생성해줍니다. 따라서 이미 만들어 놓은 파일이 있다면 덮어쓸지에 대한 질문이 나옵니다. 선택적으로 결정하시면 됩니다.

왜 스캐폴딩은 컨트롤러 이름을 복수형으로 할까??
스캐폴딩을 생성할 때, 다음과 같이 하면
ruby script/generate scaffold Photo
Photo란 이름의 모델과 PhotosController란 이름의 컨트롤러각 생성된다. 스캐폴딩 제너레이터는 기본적으로 모델 이름과 컨트롤러 이름, 두 개의 매개변수를 받으면 컨트롤러 이름은 생략할 수 있다. 컨트롤러 이름을 생략하면 모델 이름의 복수형을 컨트롤러 이르므로 대신 사용하기 때문에 위와 같은 결과가 나온다. 대부분의 경우 레일즈 컨트롤러는 여러 객체들의 컬렉션을 처리하므로 이러한 작명은 이치에 들어맞는다.
모델 이름은 보통 단수형으로 사용한다. 그러나 Admin과 같은 단어를 컨트롤러 이름으로 사용하려면 직접적으로 컨트롤러 이름을 명시해 주어야 한다. 즉 컨트롤러 이름을 복수형으로 사용하려면 스캐폴딩 제너레이터에서 컨트롤러 이름을 생략하고 단수형으로 사용하려면 모델 이름과 컨트롤러 이름을 명시적으로 지정해준다. 스캐폴딩에 대한 보다 자세한 명령은 다음의 명령으로 알아 볼 수 있다.
ruby script/generate scaffold
- Ruby on Rails(초고속 웹 개발의 시작, 한및미디어)

모든 과정이 끝났습니다. 이제 웹 브라우저를 통해서  CRUD테스트를 해 보겠습니다.
컨트롤러 이름을 'big_categories_controller.rb'로 지정했고, 리스트를 보길 원하기 때문에 URL은 'big_categories/list'입니다.

아무런 프로그램을 하지 않았지만 정상적으로 CRUD가 작동함을 확인 하실 수 있습니다.
이제 남은 작업은 디자인을 적용하는 일입니다. ^^

Posted by 달빛변신

댓글을 달아 주세요