들어가며
팀 내에 분업을 하다보면, 데이터가 잘 공유되는 것이 중요합니다. 유저는 몇명인지, 하루에 몇명이 사용하는지, 우리가 세운 가설이 동작하고 있는지 등이요. 하지만, DB 는 보통 개발자의 몫이고, 실제로 확인하고 설계하는 것은 PM/PD 의 역할입니다. 매번 주요 데이터를 조회해서 전달을 해주기가 어렵고, 좋은 협업이 아닙니다. 팀 내 누구나 데이터에 접근 가능하게 하는 구조가 필요합니다. 그것이 바로 대시보드가 필요한 이유입니다. 오늘은 DB 를Grafana 대시보드로 표현하는 과정을 써봅니다.
0. 원리 시각화
먼저 전체 원리를 그려봅니다. 일반적인 애플리케이션의 흐름과 Grafana 시각화 흐름이 동일하다는 것에 주목했습니다.
DB 가 있고, DB 를 직접 요청하는 WAS 가 있고, WAS 에 API 요청하는 Client 가 있습니다.
애플리케이션을 그렇게 구성했듯, Grafana 도 동일합니다. 똑같은 DB 가 있고, 그 DB 에 SELECT 를 날리는 Grafana 서버가 있습니다. 그리고 조회 결과물을 활용해서 대시보드 화면을 그리는 Client 가 존재하죠.
시각화 해보면 아래와 같습니다.
1. DB 계정 생성 및 권한 부여
최종 목적은 Grafana 가 저희의 DB 에 접근 가능하게 만드는 것입니다. DB 는 권한이 중요하고, 함부로 UPDATE 나 DELETE 권한을 주면 데이터 유실 위험이 생깁니다. 역할을 하는 만큼 최소한의 권한만 부여해야 합니다.
Grafana 에서 DB 를 조회해서 대시보드를 만들 것이기 때문에, SELECT 권한만 부여합니다. SELECT 용 계정이 없기 때문에 새로 DB 계정을 만들고 권한을 부여합니다.
CREATE USER 'grafana_readonly'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON detoxmate_prod.* TO 'grafana_readonly'@'%';
FLUSH PRIVILEGES;
권한이 잘 부여됐는지 학인까지 합니다.
SHOW GRANTS FOR 'grafana_readonly'@'%';
2. Grafana 에서 MySQL Data Source 연동
Grafana 를 위한 DB 계정이 생성되었고, 이제 Grafana 에서 연동을 합니다.
Grafana 에서 Data sources 탭으로 갑니다. Add new data source 버튼을 통해 mysql 을 연결합니다.
연결이 완료되었다면, 아래 리스트에 추가됩니다. 이제 Grafana 가 저희 DB 에 SELECT 할 수 있는 상태가 된 것입니다.

3. 대시보드 만들기
이제 대시보드를 만들어봅시다. Dashboard 탭에서 아래처럼 표를 만들 수 있습니다.

어떤 대시보드를 만들 것인가?
이제부터 중요한 것은, 기술보다는 비즈니스 감각입니다. 어떤 데이터를 대시보드화해서 봐야할까? 팀 내에서 보고자하는 지표를 선정합니다. 팀의 가설이 무엇인지, 주요 지표가 무엇인지에 따라 다릅니다.
저희 가설은 이렇습니다.
- 타겟 유저가 지인과 그룹을 만들고 인증을 시작했으면, 2주 내 평균 스크린타임이 감소할 것이다.
그렇다면 핵심적으로 봐야할 지표는 이렇습니다.
- 유저별 평균 스크린타임 감소율
그리고 서비스에 유저가 유입되고 실제로 사용하는지를 보조적으로 봐야합니다.
- 누적 유저 수
- 누적 그룹 수
- 일일 인증 수
저희는 이렇게 4가지 지표를 보기로 했고, 대시보드를 구성했습니다.

query 에 무엇을 넣어야 하는가?
이제 각각 대시보드를 구체적으로 어떻게 구성하는지 보도록 할게요.
표현하고자 하는 데이터가 어떤 것이냐에 따라서 구성 방법이 다릅니다. 가령 바 그래프를 표현하려면, x 축은 시간, y 축은 수가 되겠죠.
즉, query 결과로 이런 테이블이 나와야 합니다.
| time | value |
| 2026-07-01 | 3 |
| 2026-07-02 | 7 |
| 2026-07-03 | 10 |
실제 query 는 이런 식으로 써서, 2개의 column 을 가진 table 을 뽑습니다.
SELECT
day AS time,
SUM(new_users) OVER (ORDER BY day) AS value
FROM (
SELECT
DATE(created_at) AS day,
COUNT(*) AS new_users
FROM users
GROUP BY DATE(created_at)
) daily
ORDER BY time
마치며
현업에서 일하면서 백엔드 개발자가 구성한 대시보드를 수도 없이 보았습니다. 실제로 인프라를 구축해본 적은 없지요. 뒷단에 어떻게 돌아가고 있을지 상상하는게 어려웠습니다. 인프라란 그런 영역인 것 같습니다. 상상하기 어려워서 막연한 두려움이 있지만, 해보면 생각보다 간단한 작업인 경우가 많더라고요. AI 를 활용하면, Step by Step 으로 가이드를 받기도 쉬우니, 난이도가 한결 쉬워진 것 같습니다. 비즈니스적으로 필요한 요구사항을 하나씩 수행해 봐야겠습니다.
'서버' 카테고리의 다른 글
| Promtail, Loki, Grafana 로그 파이프라인 디버깅 기록 (0) | 2026.07.05 |
|---|---|
| DB 테이블 스키마 변경 전략 (0) | 2026.02.22 |
| Node.js 에서 Date 객체 Time Zone 다루기 (0) | 2026.02.09 |
| Characterization Test 로 안전하게 리팩터링 하기 (0) | 2026.02.07 |
| NestJS 철학 이해하기 1 : Layered Architecture (0) | 2026.02.01 |