본문 바로가기

My Work/Data Literacy

[Redash] Query Snippets

Redash 설정 메뉴에는 '쿼리 스니펫'이라는 기능이 숨어있다. Query Snippets는 개발자와 데이터 분석가들의 일상적인 데이터베이스 작업을 더욱 효율적으로 만들어주는 강력한 도구다. 이는 자주 사용되는 SQL 쿼리 조각을 저장하고 필요할 때마다 재사용할 수 있게 해주는 기능으로, 반복적인 쿼리 작성 작업을 크게 줄여준다. 특히 팀 전체가 이러한 쿼리 스니펫을 공유하여 사용할 수 있다는 점이 큰 장점이다.

Query Snippets이란?

  • 자주 사용되는 SQL 쿼리 조각을 저장하고 재사용할 수 있는 기능
  • 반복적인 쿼리 작성을 줄이고 효율성을 높이는 도구
  • 팀 전체가 공유하여 사용 가능

 Query Snippets의 활용은 여러 가지 측면에서 개발 프로세스를 개선한다. 먼저, 자주 사용되는 쿼리 패턴을 재사용함으로써 코드의 재사용성이 크게 향상된다. 이는 쿼리 작성에 소요되는 시간을 대폭 줄여줄 뿐만 아니라, 표준화된 방식으로 쿼리를 관리할 수 있게 해준다. 또한, 팀 구성원들이 검증된 쿼리 스니펫을 공유하고 활용함으로써 팀 전체의 협업 효율성이 높아지는 효과를 얻을 수 있다.

 

생성 방법

1. Settings > Query Snippets 메뉴 접속

 

Query Snippets 메뉴

 

2. "+ New Snippet" 버튼 클릭

 

3. 다음 정보 입력: 

  • Trigger: 스니펫을 호출할 단축어
  • Description: 스니펫에 대한 설명
  • Snippet: SQL 쿼리 코드

쿼리 스니펫 정보 입력

 

예시

예시로 날짜를 필터링하는 스니펫을 생성해보겠다. 

 

-- 날짜 필터링 스니펫
-- Trigger: date_filter
SELECT *
FROM table_name
WHERE created_at BETWEEN '{{start_date}}' AND '{{end_date}}'

 

아래 코드를 예시 사진처럼 입력하면 된다. 

 

예시 입력

 

그러면 아래와 같은 스니펫이 생성된다. 

 

스니펫 생성

 

실제로 SQL을 작성할 때, 생성한 스니펫을 작성 후 Tap 키를 누르면 자동으로 기존에 생성한 스니펫이 입력된다. 

 

스니펫 자동 생성

 

그리고 start_date와 end_date를 입력하는 form(폼)도 노출된다. 

 

스니펫 최종 적용

 

자주 쓰는 SQL

몇가지 자주 쓰는 쿼리 스니펫을 미리 알아두고 만들어두자. 

 

1. 최근 N일 데이터 조회

 

-- Trigger: recent_days-- Description: Filter data for the last N days. N is configurable.
WHERE created_at >= CURRENT_DATE - INTERVAL '{{days}} days'

 

2. 월별 집계

 

-- Trigger: monthly_group-- Description: Group and order data by month
GROUP BY DATE_TRUNC('month', created_at)
ORDER BY DATE_TRUNC('month', created_at)

 

3. 요일별 분석

 

-- Trigger: day_of_week-- Description: Add day of week number (1-7) and name
SELECT
    EXTRACT(DOW FROM created_at) as day_number,
    TO_CHAR(created_at, 'Day') as day_name

 

4. 동적 날짜 범위

 

-- Trigger: dynamic_date-- Description: Filter with dynamic date range (today, yesterday, this_month, last_month)
WHERE created_at >= CASE '{{date_range}}'
    WHEN 'today' THEN CURRENT_DATE
    WHEN 'yesterday' THEN CURRENT_DATE - INTERVAL '1 day'
    WHEN 'this_month' THEN DATE_TRUNC('month', CURRENT_DATE)
    WHEN 'last_month' THEN DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
END

 

5. NULL 처리

 

-- Trigger: handle_null-- Description: Replace NULL values with custom text
COALESCE(column_name, '{{default_value}}') as column_name

 

6. 퍼센트 계산

 

-- Trigger: calc_percent-- Description: Calculate percentage with round
ROUND((count_value * 100.0) / total_value, 2) as percentage

 

7. 시간대별 집계

 

-- Trigger: hourly_stats-- Description: Group data by hour of day
SELECT
    EXTRACT(HOUR FROM created_at) as hour,
    COUNT(*) as count
GROUP BY EXTRACT(HOUR FROM created_at)
ORDER BY hour

 

Tip! 네이빙 컨벤션

Query Snippets를 더욱 효과적으로 활용하기 위해서는 명확하고 일관된 네이밍 컨벤션을 사용하는 것이 좋다. 예를 들어, 모든 팀원이 한눈에 이해할 수 있는 직관적인 이름을 사용하고, 각 스니펫의 용도를 명확히 설명하는 주석을 추가하는 것이 좋다. 또한 팀 내에서 합의된 표준 접두어를 활용하면, 수많은 스니펫 중에서 원하는 것을 빠르게 찾을 수 있어 업무 효율성이 더욱 높아진다.

 

아래와 같이 적절한 트리거, 접두어를 활용해보자. 

 

1. 날짜 / 시간 관련

  • dt_daily : 일별 집계
  • dt_monthly : 월별 집계
  • dt_recent : 최근 N일
  • dt_week : 주간 집계
  • dt_range : 특정 기간

2. 필터 관련

  • filter_active : 활성 사용자 필터
  • filter_status : 상태값 필터
  • filter_region : 지역 필터

3. 통계 / 조인 관련

  • agg_count : 개수 집계
  • agg_sum       : 합계 계산
  • agg_avg       : 평균 계산
  • agg_percent   : 비율 계산
  • join_user : 유저 테이블 조인
  • join_order : 주문 테이블 조인
  • join_product : 상품 테이블 조인

마무리

Query Snippets의 효과적인 관리를 위해서는 지속적인 유지보수도 놓치지 말아야 할 부분이다. 팀 차원에서 정기적으로 스니펫을 검토하고 업데이트하는 습관을 들이면 좋다. 특히 더 이상 사용되지 않는 오래된 스니펫은 과감히 제거하고, 각 스니펫에 대한 상세한 문서화와 주석을 추가하여 다른 팀원들도 쉽게 이해하고 활용할 수 있도록 하는 것이 중요하다.


마지막으로, Query Snippets는 단순한 코드 조각 저장소 이상의 의미를 가진다. 이는 팀의 지식을 축적하고 공유하는 플랫폼이자, 업무 효율을 높이는 강력한 도구다. 위에서 설명한 방법들을 잘 활용한다면, Query Snippets를 통해 더욱 체계적이고 생산적인 작업 환경을 만들어낼 수 있을 것이다.