노래하듯 이야기하고, 춤추듯 정복하라.

[Ruby & Rails] Faker젬을 사용해 더미데이터 입력하기 본문

프로그래밍/Ruby & Rails

[Ruby & Rails] Faker젬을 사용해 더미데이터 입력하기

hyeoke 2018. 8. 17. 05:42

# 서두

안녕하세요 오랜만에 포스팅다운 포스팅을 해보려합니다.

도움이 될진 모르겠지만, Faker 젬을 매우 유용하게 써보긴 처음입니다.


# Faker Gem 

:Git => https://github.com/stympy/faker

:Gem => https://rubygems.org/search?utf8=%E2%9C%93&query=faker


# 사용법

우선 프로젝트 폴더 내부

/lib/tasks 폴더 안에 임의의 rake 파일을 생성합니다. 파일명은 아무거나 해도 됩니다.


필자는 my_task.rake 라고 파일명을 명명했습니다.

다음 Gemfile 파일에 페이커 젬을 추가해줍니다.

# Gemfile
gem 'faker'

다음 터미널에서 bundle install 해줍니다.


# my_task.rake 파일 코딩하기

# 메인기능을 테스트하기 위한 더미데이터를 넣습니다.
# rake 명령어를 사용해야 합니다.
# User -> Proudcts -> Manuals -> Reviews 순으로 데이터를 넣어주세요.
# 명령어는 각 task 주석에서 볼 수 있습니다.
# 명령어를 터미널창에 순서대로 입력해주세요.

# "1" Add Users: add_users
phone = ['010-2323-2323', '010-7323-1113', '010-9003-2323', '010-1723-2543', '010-1003-4823', '010-2236-4829']
task :add_users => [:environment] do
  (1..10).each do
  pass = Faker::Internet.password(8)
    User.create({
      :email => Faker::Internet.email,
      :nickname => Faker::Internet.user_name(5..8),
      :phone => phone.sample,
      :password => pass,
      :password_confirmation => pass
      })
  end
end

# "2" Add Products: 명령어 => rake add_products
task :add_products => [:environment] do
  category = ['피부', '화장', '헤어', '바디']
  age = ['10대', '20대초반', '20대후반', '30대초반', '30대후반', '40대이상']
  skintype = ['건성', '지성', '복합성', '중성', '민감성']
  price = [20000, 30000, 31000, 15600, 23000, 22200, 34000, 65300, 20500, 8000, 9000, 8500, 31000, 153000, 2000, 15200 ]
  bool = [true, false]
  skincolor = [1,2,3,4,5,6,7,8,9,10,22,21,23,24,25,14,15,16,17,18]

  (1..20).each do
    Product.create({:category => category.sample, :age => age.sample, :skintype => skintype.sample,
                    :brand => Faker::Lorem.word, :name => Faker::Lorem.word, :price => price.sample,
                    :image => File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample),
                    :contents => Faker::Lorem.paragraph,
                    :allergy => bool.sample, :atopy => bool.sample, :pimple => bool.sample,
                    :bb => bool.sample, :lip => bool.sample, :eyebrow => bool.sample, :eyeline => bool.sample, :color => bool.sample,
                    :skincolor => skincolor.sample})
  end
end

# "3" Add Manuals: 명령어 => rake add_manuals
task :add_manuals => [:environment] do
  category = ['피부', '화장', '헤어', '바디']
  age = ['10대', '20대초반', '20대후반', '30대초반', '30대후반', '40대이상']
  skintype = ['건성', '지성', '복합성', '중성', '민감성']
  price = [20000, 30000, 31000, 15600, 23000, 22200, 34000, 65300, 20500, 8000, 9000, 8500, 31000, 153000, 2000, 15200 ]
  bool = [true, false]
  skincolor = [1,2,3,4,5,6,7,8,9,10,22,21,23,24,25,14,15,16,17,18]

  (1..20).each do
    Manual.create({:category => category.sample, :title => Faker::Lorem.word,
                   :image => File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample),
                   :content => Faker::Lorem.paragraph,
                   :age => age.sample, :skintype => skintype.sample,
                   :allergy => bool.sample, :atopy => bool.sample, :pimple => bool.sample,
                   :bb => bool.sample, :lip => bool.sample, :eyebrow => bool.sample, :eyeline => bool.sample, :color => bool.sample,
                   :skincolor => skincolor.sample})
  end
end

# "4" Add Reviews: 명령어 => rake add_reviews
task :add_reviews => [:environment] do
  products = Product.all
  users = User.all

  (1..80).each do
    product = products.sample
    user = users.sample
    Review.create({
      :user_id =>  user.id,
      :product_id => product.id,
      :rating => [0,1,2,3,4,5].sample,
      :review => Faker::Lorem.sentence
      })
  end
end


# 코드 핵심파트 설명

더미데이터가 필요한 모델별로 더미데이터 입력 task를 분리해서 코딩해 주었습니다.

그래야 활용이 편하고 시각적으로 안정적입니다!


처음에

[:environment] 이부분을 빠뜨렸는데요. 

그 결과 rake something_task 형식으로 task를 실행했을 때 모델을 인식하지 못했습니다.  

반드시 [:environment] 코드를 확인해주세요!


# Faker 젬 사용시 주의점

- Faker::Internet.username -> user_name

페이커 젬을 사용할 시 git을 보고 사용하시면 되는데 git의 내용에서 작동하지 않는 것들이 있습니다.

우선 첫번째로 Faker::Internet.username인데요. 이대로 입력하시면 에러가 발생합니다.

-> Faker::Internet.user_name 으로 사용해주세요!


- Faker::Avatar.image

이것또한 작동하지 않았습니다. 그래서 제가 찾은 해결방법은 바로 아래 코드입니다.

:image => File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample)

프로젝트 디렉토리에 sampleimages 폴더를 만든 후, 귀찮더라도 5~10개 정도의 이미지를 넣어줍니다.

그리고 위의 File.open 메서드를 이용하여 폴더안에서 랜덤하게 이미지를 가져와 저장해 줍니다.


Comments