옛글/Ruby on the Rails
DB의 index와 rails가 기억하는 index가 틀려 duplicate 에러가 나는 경우
ActiveRecord::Base.connection.tables.each do |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) end
Rails autoloader :zeitwerk 방식 *업데이트 중
지난번 Rails 5.2에서 6.0으로 업그레이드를 진행하면서, 기존에 사용했던 방식에 에러가 발생! [Controller] A B C C는 B를 상속, B는 A를 상속하는 상황에서, B에 before_action 내에서 A의 함수를 호출 시, 5.2에서는 문제 없이 진행되나, 6.0에서는 에러를 발생(A의 함수를 가지고 오지 못하는 케이스)가 있었음. 결국 C의 입장에서 before_action을 실행했을 때 A의 함수를 가지고 오지 못하는 문제점을 살펴보다, 6.0부터는 autoloader가 default로 true이고, 방식이 :classic이 아닌, :zeitwerk을 사용하는 부분에서 해당 에러가 발생하는 것을 확인함. (application.rb에 config.autoloader = :clas..
Rails upgrade 5.2 to 6.0
Rails 5.2.0 to 6.0.0 * 6.0 에서 ActionText를 사용할 수 있다! 흥미로움 1. Rails 6은 Ruby 2.5.0 이상 버전에서 동작 2. rails app:update 를 실행 3. config.load_defaults in config/application.rb 변경하기 config.load_defaults 6.0 application.rb에 Rails.autoloaders.logger = method(:puts) 입력 시 레일즈 시작할때 autoloads되는 것들을 볼 수 있음. https://edgeguides.rubyonrails.org/6_0_release_notes.html Ruby on Rails 6.0 Release Notes — Ruby on Rails Gu..
Mac Postgres install and command
brew install pg ps auxwww | grep postgres pg_ctl -D /usr/local/var/postgres status pg_ctl -D /usr/local/var/postgres start pg_ctl -D /usr/local/var/postgres stop OR brew services start postgresql brew services stop postgresql if "Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib" error, ln -s /usr/local/opt/readline/lib/libreadline.6.dylib /usr/local/opt/readline/lib/libreadlin..
Rails 구글 크롬 노티피케이션(푸쉬) FCM(Firebase)로 붙이기
Chrome push notification을 기존 GCM이 아닌 FCM으로 붙여보자. 먼저 클라이언트 쪽 세팅을 해준다. 1. index.html firebase 관련 javascript를 CDN을 통해 import 한다. 2. manifest.json을 추가한다. GCM Sender ID는 따로 수정하지 않는다. { "gcm_sender_id": "103953800507",} 3. firebase_init.js 를 만든다. var config = { apiKey: "[서버의 API KEY]", authDomain: "[콘솔의 프로젝트 이름].firebaseapp.com", databaseURL: "https://[콘솔의 프로젝트 이름].firebaseio.com", messagingSenderId: ..
[Ruby on rails] ElasticSearch 를 붙여보자
검색을 위한 ElasticSearch를 Rails에 붙여봅시다. ElasticSearch이 무엇이며 왜 사용해야 하는지부터 알아봅시다. (https://www.elastic.co) ! 설치와 실행이 간편하다! ElasticSearch는 Java기반으로 빠른 검색이 가능하다.! Lucene Libarary를 사용하여 Restful 방식으로 검색이 가능하다 ! CSV, XML, JSON 등 다양한 포맷을 지원한다. ! Multi-tenancy 를 지원하여 여러개의 Index에 한번에 질의가 가능하다. 한 마디로 검증이 되어 있는 검색엔진이기에 서비스에 "검색"을 붙일 때 해당 엔진을 사용하여 좀 더 빠르고 쉽게 검색이 가능하다는 장점이 있습니다. 데이터베이스에 직접적으로 쿼리로 검색을 하는 것이 아닌, El..
[Ruby on rails] Sidekiq이 버벅거린다면, Rails sidekiq process 갯수 늘리기
동접자가 많아지고 백그라운드 잡이 많아지면 점점 서버가 느려지고 백그라운드 잡이 실패하는 경우도 생깁니다. Redis Server > Sidekiq > Background Job (내부에서 Mysql 쿼리문을 던짐) > 반복 인 경우, 몇백개의 작업이 동시에 실행되면 Mysql database에 동시 접속 가능한 Pool의 갯수가 작을 경우 default로 설정된 타임아웃(5초)로 인해 Background Job이 실패를 하는 경우가 있습니다! 첫번째로는 일단 Mysql의 pool을 늘려주어야 합니다. Mysql에 쿼리를 보내면 처리하는 종업원의 수를 늘려봅니다. 실서버의 /shared/config/database.yml을 만져줍시다. production:adapter: mysql2...: ... poo..
[Ruby on rails] 서버 속도 (+MYSQL)를 개선해보자!
최근에 한 프로젝트가 엄청나게 느린 퍼포먼스를 보였습니다. 한땀한땀 속도를 늘리기 위해 수정 된 내용을 공유해봅니다. 일단 퍼포먼스의 측정은 Newrelic을 사용했습니다. Newrelic 에서 이전 데이터를 제공하지 않아, 데이터는 첨부가 불가능하지만, 유저가 사용하는 부분에서 1초를 넘는 것이 허다했습니다. Newrelic 에서 Application 단의 Transactions 의 "Slowest average response time"을 보면 어떤 부분에서 오랜 시간이 걸리는지 확인이 가능합니다. 위 사진을 보면, 어떤 Controller 에서 Action 별로 시간이 오래 걸리는 순으로 나타납니다. 전반적으로 10ms 이하의 속도여야 하지만, 현실은 ... 5초를 넘어가는 경우도 있었습니다. 위의..