Bucket Place/Ruby on Rails

[Ruby on Rails] 데이터베이스 수정 및 데이터 이관

Cloud Travel 2014. 4. 30. 17:00


  시작하며... 


 예전에 migration을 이용하여 데이터베이스를 수정하는 방법에 대해서 알아봤습니다. 이번에는 테이블 내용을 변경하면서 이 변경된 형태로 데이터를 이관하는 방법에 대해서 알아봅시다.



  테이블 수정하기 


 테이블을 수정하기 위해서는 테이블 수정에 참여시킬  migration 파일을 하나 생성해야 합니다. migration은 지금까지 새로운 scaffold, controller를 추가했듯이 generate를 사용하여 생성합니다. 여기서 주의해야할 점이 있는데 Rails에서 받아들이는 migration 형식은  add_[NAME]_to_[TABLE] 과  remove_[NAME]_to_[TABLE_NAME] 밖에 없다는 것입니다. 즉, add와 remove만이 가능하다는 것이죠. (현재 제가 사용하듯이 상위 버전에서는 Add와 Remove인것엔 변화는 없지만 낙타형으로 작성해도 되게 바뀌었습니다. 하지만 생성되는 파일의 결과에는 변함이 없습니다.)


 이제 실질적으로 Add를 하는 방식에 대해서 알아봅시다.

 > rails add_part_number_to_product part_number:string


이 명령을 실행하면 migrate에  [time]_add_part_number_to_product.rb 가 생성될 것이다. 이 파일을 열어서 추가적으로 조건을 더 입력해주시면 됩니다. 새로 추가해주는 것에 대해서는 데이터이관시 default값이 있는 것이 좋기 때문에 dfault value를 적어주시는 것이 좋습니다. 예를 들어 다음과 같이...

> vi db/migrate/[time]_add_part_number_to_product.rb


class AddPartNumberToProducts < ActiveRecord::Migration
  def change
    add_column :products, :part_number, :string, default:"1"
  end 
end

 다음으로는 이를 적용시키기 위해서 다음을 실행시켜줍니다.

> rake db:migrate


 이 결과로 일단 테이블은 수정이 됩니다.


 반대의 결과로 삭제하는 것을 한번해보도록 합시다. 이번에는 낙타형으로 적어보았습니다.

> rails RemovePartNumberFromProducts part_number:string


 이 결과로  [time]_remove_part_number_from_products.rb 파일이 생성됩니다. 결과를 확인해 보셔도되고 바로 rake를 실행해서 적용시켜도 됩니다.

> rake db:migrate



  테이블 수정에 따른 추가적 사항


 테이블을 수정하게 되면 테이블 그 자체를 나타내는 모델과 연결되어있던 컨트롤러에도 변화가 있어야 합니다. 예를 들어 모델에서는 변경된 값을 이용하여 데이터를 새로 저장할 수도 있고, 컨트롤러에서는 가져온 값을 사용하여 새로운 값을 창조해 낼 수 있습니다.

 

 이 부분은 여러분의 몫이기 때문에 적을 것이 없습니다. 단지! 테이블이 변경되었으니 모델과 컨트롤러를 변경시켜야 한다는 것을 잊지 말아주세요. 만약에 컨트롤러에서 나온 값이 보여줄 필요가 있다면 뷰에 보여주는 내용까지 추가를 해야겠죠!



  데이터 이관


 새로운 데이터 형식에 맞춰서 이전 데이터 값을 이관시키는 작업이 필요할 수도 있습니다.(위에서 정한 디폴드 값을 사용한다면 딱히 이 과정은 필요가 없겠내요). 이번에도 하나의 migration을 생성해야 되는데 이번에는 이름의 형식은 없지만, 알기 편하게 맨 앞에는 combine을 prefix로 붙여주는 것을 추천합니다.


 예를 들어 다음과 같은 데이터 이관을 위한 migration을 생성했습니다.

> rails generate migration combine_products_in_list


 데이터 이관시에는 change를 사용하여서 원하는 결과를 엊지 못하기 때문에 up과 down함수를 이용합니다.

class CombineProductInList < ActiveRecord::Migration
  def up  
  end 

  def down
  end 
end

 이와 같이 우선 함수를 정의 해줍시다. up() 함수는 데이터 이관이 완료되었을때 화면을 보여주고, down() 함수는 롤 백했을 경우에 대해서 작성해주시면 됩니다. 각각은 아이템을 순회하면서 원하는 형식으로 새롭게 된 부분을 수정하거나 삭제된 부분에 대해서 교정하는 코드를 작성해주시면 됩니다. 롤백을 위한 down()함수는 옵션이라고 볼 수도 있습니다.



  마무리


 간단하게 데이터테이블 수정 및 이관에 대해서 알아보았다. 더 자세한내용은 레일즈 레퍼런스 페이지를 참조해보길 바란다.