쿼리 카운트 제한

각 컨트롤러 또는 API 엔드포인트는 최대 100개의 SQL 쿼리를 실행할 수 있으며, 테스트 환경에서는 이 임계값을 초과할 경우 오류가 발생합니다.

실패한 테스트 해결

테스트가 100개 이상의 SQL 쿼리를 실행하여 실패하는 경우, 이 문제를 해결하는 두 가지 방법이 있습니다.

  • 실행되는 SQL 쿼리의 수를 줄입니다.
  • 컨트롤러 또는 API 엔드포인트에 대해 쿼리 제한을 해제합니다.

쿼리 제한을 해제하는 것은 기존의 컨트롤러 또는 엔드포인트가 문제인 경우에만 시도해야 합니다. 이 경우 SQL 쿼리의 수를 줄이는 것은 많은 노력이 필요할 수 있기 때문입니다. 새로 추가된 컨트롤러와 엔드포인트는 100개 이상의 SQL 쿼리를 실행할 수 없으며, 이 규칙에는 예외가 허용되지 않습니다. 만약 특정 작업을 수행하는 데 많은 수의 SQL 쿼리가 필요하다면, 웹 요청에서 직접 처리하는 것보다는 Sidekiq에서 이 작업을 수행하는 것이 좋습니다.

쿼리 제한 해제

컨트롤러에 대해 쿼리 제한을 해제해야 하는 경우에는 먼저 이에 관한 이슈를 생성해야 합니다. 이 이슈는 (가급적 이슈 제목에) 해당 컨트롤러나 엔드포인트를 언급하고 database, performanceDiscussion과 같은 팀별 라벨을 포함해야 합니다.

이슈가 생성된 후, 해당하는 코드에서 쿼리 제한을 해제할 수 있습니다. Rails 컨트롤러의 경우 가능한 빠른 시점에 실행되는 before_action 후크를 만드는 것이 좋습니다. 그 후 호출된 메서드는 Gitlab::QueryLimiting.disable!('이곳에 이슈 URL을 입력하세요')를 호출해야 합니다. 예를 들면:

class MyController < ApplicationController
  before_action :disable_query_limiting, only: [:show]
  
  def index
    # ...
  end
  
  def show
    # ...
  end
  
  def disable_query_limiting
    Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/...')
  end
end

before_action을 사용하면 해당 컨트롤러 메소드를 수정할 필요가 없으므로 Merge 충돌 가능성이 줄어듭니다.

Grape API 엔드포인트의 경우 특정 엔드포인트 이전에 후크를 실행할 수 있는 신뢰할 수 있는 방법이 아쉽게도 없습니다. 따라서 해당하는 엔드포인트에 직접 allowlist 호출을 추가해야 합니다.

get '/projects/:id/foo' do
  Gitlab::QueryLimiting.disable!('...')
  
  # ...
end