표준화된 multi-provider 인증 라이브러리 (미들웨어). 인증 서비스를 제공하고 싶은 provider는 omniauth strategy 클래스를 extend한 strategy를 작성해서 제공하면 된다. (파악하고 나니까 omniauth는 oauth2 Flow에서 레일즈 app을 찌르는 케이스를 미들웨어로 처리하기 위한 gem이다. 각 provider가 이걸 상속받아서 일관된 인터페이스로 여러 provider 인증 추가 가능.) 예를 들면 페이스북으로 로그인 하기 => https://github.com/simi/omniauth-facebook 네이버로 로그인하기 => https://github.com/kimsuelim/omniauth-naver 커뮤니티에서 관리중인 Strategy 리스트 omni..
배경 연동된 외부 재고 관리 시스템에서 주문을 마감하고 쌓인 정보를 가져가는 시각을 "오후 10시로 고정" 에서 "관리자가 시간을 설정할 수 있도록" 바꿔야 하는 요구사항이 있었다. 따라서 이와 같이 관리자가 설정한 스케줄 (주문 마감) 정보를 테이블에 저장하면 매일 새벽 5시 (서버가 제일 한가한 시간) 마다 한번씩 cronjob이 돌면서 해당 날짜에 설정된 스케줄 데이터가 있는지 확인하고 있다면 해당 시각으로 주문 정보 가져가세요~ api 를 요청하는 job을 실행하도록 만들었다. 이때 이 cronjob을 어떤 툴을 이용해서 구현하면 좋을지 고민이었다. 선택 기준 (1) 중복 실행되지 않도록 job은 idempotent 하게 구현해야 하는 원칙이 있어서, 여러번 실행돼도 상관 없게 짜야하지만 많을 때..
지난 2분기에는 "물류센터 작업자의 수고로움을 덜 수 있도록 한번의 처리 요청으로 전체 대상을 처리할 수 있도록 해달라" 라는 요구사항과 관련된 태스크를 많이 처리하게 되었다. 개중에는 전체 처리 시간이 너무 오래걸려 request - response flow 안에서 동기적으로 처리하기 무리인 것들이 있었는데 이런 경우는 클라이언트에 응답은 바로 주고, 작업은 job으로 비동기 실행하도록 했다. 그런데 이때 작업자에게 노티할 수 있도록 슬랙으로 시작, 완료 알람도 보내야하고 실행하는 동안 몇건 성공했고, 몇건을 어떤 이유로 실패했는지도 전달하고 싶었다. (기획자분이 그렇게까지 요구하진 않았지만...) 어떻게 복잡하지 않게, 그렇지만 정확하게 여러 job들을 하나의 단위로 묶고, 그와 관련된 메타 데이터들..
block 객체가 아니다. 그냥 코드 블럭, 그런데 이제 argument를 넘겨 받고 결과를 리턴할 수 있는 익명 함수 역할 하는. def f result = yield 3 p result end f { |x| x * 7 } #=> 21 syntax do / end 혹은 { } curly bracket yield 메소드 안에서 block을 호출하는데 쓰인다. 한 메소드 안에서 yield를 여러번 호출 할 수도 있고, yield와 함께 block에 n개의 인자를 넘겨줄 수도 있다. 그리고 block의 리턴값이 yield 문 evaluated value가 된다. def one_two_three yield 1 yield 2 yield 3 end one_two_three { |number| puts number..
참고하기 : sidekiq wiki Sidekiq runs on 3 components The Rails Application Sidekiq worker process(es) => sidekiq 프로세스가 멀티쓰레드으로 돌면서 background에서 큐에 들은 worker/job 수행 Redis => 큐 Sidekiq handles concurrency by using multiple threads in its process. This way, it can process multiple jobs at once, each thread processing one job at a time. By default, Sidekiq uses 10 threads per process. You can configure ..
N+1쿼리를 방지하기 위해 rails AR에서 제공하는 4가지 association data load 방법을 정리해보자. joins 이름처럼 SQL join 쿼리로 변환된다. joins = inner join, left_outer_joins = left outer join SQL join에서 되는 건 다 된다. where, group, having, select... 특히 다른 로드 방식과 비교해서 select나 group 사용해서 원하는 대로 custom한 쿼리를 작성하고 싶을 때 쓴다. irb(main):003:0> result = Book.joins(:reviews).where(reviews: {eval: :good}).group(:author).select("books.author, COUNT(*..