전체 글 (190) 썸네일형 리스트형 ruby 특징 1. String+String 가능. String *int 가능. 다른 건 불가능. 2. to_s to_i to_f ,,,바꾸어준다. 3. 값의 비교는 Java와 반대이다. 루비에서는 ==(일반 비교)가 값의 비교이고 equal?가 id값의 비교이다. 4. reference type 만 있다 a = 3을 만들면 Fixnum class에 저장이 되고, 특정 범위가 넘어서면 Bignum class 에 저장이 된다. 5. 클래스 안에 정의되는 변수들은 @ 를 붙여서 만든다. 6. 외부에서 생성자를 통해 만든 변수(인스턴스)를 통해서 클래스 안에 정의된 변수들에는 접근이 불가능하다. private 이 default이다. 7. For I in list or for I in range(1..10) Range를 표현.. find_in_batches vs each_slice 모든 ids값을 가지고 오면 쿼리 오류가 발생할 수 있다. 그 이유에 대해서는 https://dexlee.tistory.com/109?category=1031550 여기에 에러 메시지와 함께 설명을 해놓았다. 그래서 이런 경우, 배치 함수를 사용해서 데이터를 가져와야 속도도 빠르고 안전하다. 1. find_in_batches(), in_batches() 두 함수의 약간의 차이점에 대해서는 다루지 않고 공통점에 대해서 다루고, 문제점을 정의하겠다. 이 두 함수는 실무에서 사용이 제한적이어야만 한다. 왜냐하면 모든 ids값을 가지고 limit을 사용해 데이터를 자른다. 1) 예시 BATCH_SIZE = 4 ids = (1..10).to_a sheets = [] Sheet.where(id: ids).find_.. batches를 사용하는 이유 1. 큰 크기의 ids 큰 크기의 ids(성능에 따라 다르겠지만 대략 100만개 이상)를 넘기면 쿼리를 처리하는 과정에서 오류가 발생할 수 있다. ActiveRecord::StatementInvalid: Mysql2::Error::ConnectionError: MySQL server has gone away from /Users/xxx/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query' Caused by Mysql2::Error::ConnectionError: MySQL server has gone away from /Users/xxx/.rbenv/versions/2.6.6/lib/r.. preload vs includes vs eager_load vs joins 이 4가지의 차이점을 살펴보겠다. 1. preload 연관관계에 있는 테이블을 미리 로드해준다. includes와 default는 같지만 약간의 차이가 있다. 연관관계 로드할 때, 항상 query를 분리해서 요청한다. store = '도매' wholesale_stores = WholesaleStore.preload(store_number: [building_floor: :building]).where('store LIKE ?', "%#{store}%") 이렇게 호출하면 쿼리가. WholesaleStore Load (44.5ms) SELECT `wholesaleStore`.* FROM `wholesaleStore` WHERE (store LIKE '%도매%') StoreNumber Load (30.6ms).. Model 정리 1. model&.other_model & : return empty string if don’t have any value there 만약 비어있는 값일 때, 에러를 내지 않는다. Ex) wholesale_store&.ssm_store_number 2. Model.where(id: id).first 리턴 값이 list이다. 그러므로 상대 쪽에 있는 유일한 값(PK)을 가져오고 싶을 땐 first를 써줘야 한다. 만약 배열로 받는 것이 싫다면 find를 써서 하나만 받아오는 방법도 있다. 3. Model.find(id: id) return variable 즉, list가 아닌 단일 값 리턴이다. 4. model.where(other model: {col: data}) https://stackoverflo.. [ruby on rails] n+1 해결한 기억나는 경험 다른 SI 업체에 대량의 데이터를 보내주는 작업인데, DB to DB로 보냈었다. 그때, 데이터를 연관관계에 의해서 데이터를 보냈는데, 그 연관관계에 있는 데이터에서 크기가 큰 ids를 추가하다 보니 그때마다 쿼리를 날렸었다. 하지만 이 데이터는 최초 단 한 번 보내는 것이고, 데브에서 실 서버 데이터로 테스트를 했을 땐, 별 문제가 없어서, 실서버 적용했을 때에도 문제가 없을 거라 생각했다. 하지만.. 실서버 배포하는 날 문제가 발생하였고, 1시간이 넘도록 끝까지 전송이 안되었었다. 크기가 큰 ids를 받는 쿼리가 루프에 루프를 타며 디비에서 데이터를 가져오는데 부하가 발생했던 것이다. 그래서, 전송하던 것을 바로 멈추고 코드 리팩토링에 들어갔고, 연관관계에 넣었던 조건식들을 없애고 n+1 문제를 발생.. [ruby on rails] n+1 문제 해결 경험 ruby on rails를 다루며 n+1 문제를 굉장히 많이 경험을 해보았고, 이 문제에 대한 해결은 디비에 요청을 최소화하기 위해 한 번 요청을 보낼 때, 연관관계에 있는 필요한 데이터를 한 번에 가져오는 것이다. 이때, 두 가지 방법으로 문제를 해결했다. 1. 첫 번쨰 방법 : preload() or includes() 두 함수의 장단점 약간의 차이점은 있지만, 날아가는 쿼리는 동일하다. 연관관계에 있는 모든 값들을 미리 가져온다. 그래서 한 모델에서 연관관계에 있는 모델에 직접 접근할 때 사용하면 굉장히 편하게 쓸 수 있다. 1) 언제 사용? 한 모델에 연관관계에 있는 모델에 적접 접근할 때 사용하면 굉장히 편하게 사용할 수 있다. 2) 예시 store = '도매' wholesale_stores =.. 기존의 레거시를 볼 때 가져야하는 마음가짐 최근(21.12.21)에 우아한 형제들 김범준 대표의 인터뷰를 보았다. 개발자라면 굉장히 공감되는 말을 해주셔서 현재 가지고 있는 이 마음가짐을 잊지 않기 위해 기록해본다. 나는 보통 기존의 레거시를 보고 잘 안되어 있다고 느끼면 먼저 비판을 하고, 어떻게 고쳐나가야 할지 생각을 하였었다. 그런데 김범준 대표님이 하신 "새로운 사람 입장에서 기존 것에 비판하기가 쉽다. 하지만 기존의 것이 지금 보면 부족할지 몰라도 그게 어제의 최선이었다."라는 말이 너무 공감되면서 나 자신이 부끄러웠다. 이 영상을 본 후, 더 이상 비판하고 싶지 않다고 생각하였고, 그 때 당시 상황에서 최선으로 개발한 코드로 생각하고, 현재에는 어떻게 리팩터링을 해야 좋을지를 고민하는데 더 시간을 많이 쓰기로 생각하였다. 이러한 마음가.. 이전 1 ··· 9 10 11 12 13 14 15 ··· 24 다음