- 위젯 유형
- 23
- 차트 종류
- 15
- Redmine
- 4 · 5 · 6 · 7
- 데이터베이스
- MySQL, MariaDB, PostgreSQL
- 코어 패치
- 없음
드래그 앤 드롭 빌더
크기 조정과 순서 변경이 가능한 그리드로, 작업하는 동안 자동으로 저장됩니다. 원하는 내용을 보여 줄 때까지 KPI, 차트, 표를 배치하세요. 레이아웃 파일도, 페이지 새로 고침도 필요 없습니다.
15가지 차트 유형
막대, 가로 막대, 누적 막대, 선, 다중 선, 영역, 원형, 도넛, 레이더, 극좌표, 게이지, 깔때기, 히트맵, 트리맵, 진행률 링. Apache ECharts로 그리며 라이트 및 다크 모드를 지원합니다.
저장된 쿼리를 시각화
위젯을 저장된 쿼리에 연결하면 사용자 정의 항목, 관람자, 하위 프로젝트를 포함한 필터를 그대로 이어받습니다. 쿼리 하나를 클릭 한 번으로 전체 대시보드로 만들 수도 있습니다.
SQL로 집계
GROUP BY, COUNT, SUM, AVG가 데이터베이스에서 실행되므로 10만 건의 일감도 객체로 불러오지 않고 개수만 셉니다. 결과는 사용자, 위젯, 적용된 필터별로 캐시됩니다.
보는 사람 기준의 권한 범위
모든 조회는 Issue.visible(user), TimeEntry.visible(user), Query.visible(user)에서 시작하므로, 보는 사람이 구성원이 아닌 프로젝트의 데이터가 차트에 합산되는 일은 없습니다.
필터, 새로 고침, 드릴다운
필터 바 하나로 대시보드 전체의 범위를 바꾸고, 대시보드별 새로 고침 간격으로 벽면 디스플레이를 최신 상태로 유지하며, 모든 막대, 조각, 셀을 클릭하면 그 뒤의 일감 목록으로 이동합니다.
Redmine 안에서 실행되는 모습을 확인하세요
여기의 모든 스크린샷은 plugins/에 플러그인만 넣은 기본 Redmine 6 설치 환경에서 촬영했습니다. 대시보드는 Redmine 자체의 헤더와 메뉴 아래에 표시됩니다. 실제로 그곳에서 실행되기 때문입니다.
보드 만들기


위젯


공유 및 전환


쿼리가 곧 보고서입니다
데이터를 두 번 설명할 필요가 없습니다. 평소처럼 일감 목록을 필터링하고 저장하면, 그 저장된 쿼리가 위젯이 집계하는 범위가 됩니다. Redmine이 목록 자체를 그릴 때 쓰는 것과 같은 관계를 사용합니다.
| 단계 | 할 일 | 결과 |
|---|---|---|
| 1. 쿼리 저장 | 일감 목록을 필터링(사용자 정의 항목, 관람자, 하위 프로젝트)하고 저장을 클릭합니다 | 지정한 대상과 공유되는 이름 있는 쿼리 |
| 2. 위젯에 연결 | 위젯 대화 상자에서 해당 쿼리를 선택합니다 | 데이터 소스와 적절한 기본 그룹화가 자동으로 설정됩니다 |
| 3. 또는 보드 전체 생성 | 쿼리에서 생성을 클릭합니다 | 해당 쿼리에 연결된 KPI 타일과 차트로 구성된 대시보드가 한 번의 요청으로 생성됩니다 |
SQL이 아닌 드롭다운으로 설정
위젯은 데이터 소스, 차원, 측정값, 집계로 구성됩니다. 일감을 상태, 우선순위, 유형, 담당자 또는 일·주·월·연 단위로 묶은 날짜 항목으로 그룹화하고, 개수를 세거나 추정 시간을 합산하거나 진척도의 평균을 구합니다. 차트를 만들기 위해 팀의 누구도 SQL을 작성하지 않습니다. 작성할 SQL이 없으므로 보는 사람의 권한을 넘어서는 쿼리도 존재할 수 없습니다.

하나의 양식으로 모든 위젯 설정
KPI, 막대, 도넛 등 모든 위젯은 같은 간단한 양식으로 설정합니다: 제목과 유형, 데이터 소스, 필터용 저장된 쿼리(선택 사항), 측정값, 그리고 Top-N을 포함한 그룹화. 유형을 바꾸면 양식도 그에 맞게 바뀝니다.




관리자를 위한 하나의 설정 페이지
관리 › 플러그인 › Redmine Charts에서 사용자별 결과 캐싱, 캐시 TTL(5~86400초, 기본값 300), 기본 라이트 또는 다크 테마, 기본 자동 새로 고침 간격(0이면 꺼짐)을 설정합니다. 이 페이지는 Redmine 자체의 플러그인 설정 화면입니다.
위젯 유형 23종, 그리고 직접 추가할 여지
모든 유형은 레지스트리 기반 메타데이터이므로, 차트마다 직접 작성한 양식이 아니라 위젯 자체의 선언으로부터 설정 UI가 자동으로 구성됩니다.
| 분류 | 유형 | 설정 항목 |
|---|---|---|
| 차트 | 막대, 가로 막대, 누적 막대, 선, 다중 선, 영역, 원형, 도넛, 레이더, 극좌표, 게이지, 깔때기, 히트맵, 트리맵, 진행률 링 | 데이터 소스, 차원, 측정값, 집계 |
| KPI / 숫자 | 자체 필터가 적용된 단일 집계 수치 | count · sum · avg · min · max |
| 표 | 같은 권한 범위의 데이터를 보여 주는 페이지 나눔 그리드 | 열 선택 및 필터 |
| 콘텐츠 | Markdown, 메모, HTML, iframe, 활동 피드, 최근 일감 | 자유 텍스트 또는 Redmine 자체 피드 |
Apache ECharts로 렌더링
15가지 차트가 라이트와 다크 테마에 맞게 표시되고, 크기가 바뀌면 다시 그려지며 벽면 디스플레이에서도 잘 읽힙니다. 번들이 미리 빌드되어 패키지에 포함되어 있으므로 플러그인을 설치할 때 Node나 빌드 과정이 필요 없습니다.
모든 구간에서 드릴다운
막대, 조각, 히트맵 셀을 클릭하면 정확히 해당 일감만 필터링된 Redmine 일감 목록이 열립니다. 언제든 수치 뒤의 행을 확인할 수 있으므로 수치를 검증할 수 있습니다.
전역 필터와 자동 새로 고침
필터 바 하나로 보드의 모든 위젯 범위를 한 번에 바꾸고, 대시보드별 새로 고침 간격으로 복도의 화면을 최신 상태로 유지합니다. 0으로 설정하면 새로 고침이 꺼집니다.
템플릿과 블루프린트
보드를 재사용 가능한 템플릿으로 저장하거나, 팀별로 복제하거나, JSON 블루프린트로 내보내 다른 인스턴스로 가져올 수 있습니다. 스테이징에서 운영 환경으로 옮길 때 다시 만들 필요가 없습니다.
하나의 플러그인, 모든 팀을 위한 보드
딜리버리 리드, 지원 데스크, 개인 개발자가 각자 이미 가지고 있던 저장된 쿼리로 몇 분 만에 만든 보드입니다.





기본 제공 데이터 소스 2개, 그리고 직접 추가하는 소스
일감과 작업 시간은 차원과 측정값이 미리 등록된 상태로 제공되며, 둘 다 Redmine 자체의 공개 범위를 따릅니다. 다른 플러그인이 추가한 소스도 똑같이 취급됩니다.
| 데이터 소스 | 차원 | 측정값 |
|---|---|---|
| 일감 | 상태, 우선순위, 유형, 프로젝트, 담당자, 작성자, 범주, 버전, 생성일, 수정일, 완료 기한 | 일감 수, 추정 시간, 진척도 |
| 작업 시간 | 프로젝트, 사용자, 작업 분류, 작업일 | 시간, 항목 수 |
| 직접 추가 | 등록한 모든 항목 | 등록한 모든 항목 |
확장은 패치가 아니라 등록입니다
데이터 소스는 이름, 차원, 측정값, 권한 범위가 적용된 base_scope를 가진 클래스이고, 위젯 유형은 해시입니다. 자체 플러그인의 init.rb에서 RedmineCharts.register_data_source 또는 register_widget_type으로 등록하면 즉시 설정 UI에 나타나며 필터링, 캐싱, 드릴다운을 그대로 이어받습니다. 이를 위해 이 플러그인의 어떤 부분도 수정할 필요가 없습니다.
볼 수 없는 데이터는 집계되지 않습니다
대시보드는 수치가 새어 나가기 쉬운 통로이므로, 모든 조회는 마지막에 권한을 확인하는 대신 처음부터 보는 사람의 범위에서 시작합니다.
공개 범위가 먼저, 그룹화는 그다음
Issue.visible(user), TimeEntry.visible(user), Query.visible(user)가 행 하나를 세기도 전에 관계를 제한합니다. 구성원이 아닌 프로젝트의 합계는 어떤 위젯에도 나타날 수 없습니다. 해당 행이 처음부터 집합에 포함되지 않기 때문입니다.
세분화된 4가지 권한
대시보드 보기, 생성, 전체 관리, 템플릿 관리 권한을 역할별로 부여할 수 있습니다. 그리고 누군가 해당 프로젝트에서 Charts & Dashboards 모듈을 켜기 전까지는 모두 꺼져 있습니다.
구성원 정보를 통한 공유
보드를 사용자, 그룹, 역할 또는 프로젝트 전체에 공유하세요. 모든 요청에서 viewable_by?와 editable_by?를 Redmine 자체 구성원 정보로 다시 확인합니다. 시간이 지나면 어긋나는 별도의 접근 목록을 쓰지 않습니다.
서버 밖으로 나가는 데이터 없음
프론트엔드는 이미 있는 세션과 CSRF 토큰을 사용해 귀사 Redmine에 있는 이 플러그인의 JSON API와만 통신합니다. 외부 서비스도, 라이선스 확인 통신도, 텔레메트리도 없습니다.
대규모 인스턴스에서도 버티도록 설계
10만 건의 일감을 세기 위해 10만 개의 객체를 불러올 필요는 없습니다. 이 플러그인은 그렇게 하지 않습니다.
| 고려 사항 | 처리 방식 |
|---|---|
| 집계 | GROUP BY, COUNT, SUM, AVG를 SQL에서 실행하며, 개수를 세기 위해 행을 객체로 만들지 않습니다 |
| 값이 많은 차원 | 차원에 값이 수천 개 있어도 Top-N 묶기로 응답 크기를 작게 유지합니다 |
| 반복 조회 | 결과는 Rails.cache를 통해 사용자, 위젯 수정 시각, 적용된 필터별로 캐시됩니다. TTL은 설정할 수 있으며 Redis도 그대로 사용할 수 있습니다 |
| 느린 위젯 하나 | 위젯은 각각 독립적으로 로드되므로 무거운 쿼리 하나가 보드 전체를 붙잡아 두지 않습니다 |
| JS 번들 누락 | 대체 수단으로 Rails가 모든 위젯 데이터를 서버 측에서 렌더링하므로, 페이지가 빈 화면이 되지 않고 기능만 축소됩니다 |
우연이 아닌 의도된 이식성
여러 버전과 데이터베이스 지원은 설계 단계부터 고려되었습니다. 마이그레이션, JSON 저장, 날짜 구간 처리는 모두 그 차이를 견디도록 작성되었습니다.
| 고려 사항 | 지원 | 방식 |
|---|---|---|
| Redmine | 4.x, 5.x, 6.x, 7.x | requires_redmine version_or_higher 4.0.0을 선언하며, 시간이 지나 맞지 않게 될 코어 재정의가 없습니다 |
| Rails | 5.2 → 8.0 | 마이그레이션은 8.0까지의 모든 릴리스가 이해하는 5.2 기준으로 작성되었습니다 |
| Ruby | 2.5+ | Redmine 4의 최소 요구 사항과 일치 |
| 데이터베이스 | MySQL, MariaDB, PostgreSQL | JSON은 일반 텍스트 열에 저장되어 모든 데이터베이스에서 DDL이 동일하며, Rails 버전에 맞는 형식을 고르는 직렬화기를 사용합니다 |
| 날짜 그룹화 | 일, 주, 월, 연 | 이식 가능한 CAST(col AS DATE)로 그룹화한 뒤 Ruby에서 구간으로 묶습니다. 데이터베이스 종속 SQL이 없습니다 |
| 마이그레이션 재실행 | 안전 | 방어적으로 작성되어, 중단된 업그레이드를 다시 실행할 수 있습니다 |
첫날부터 스크립트로 제어 가능
모든 엔드포인트는 /redmine_charts/api 아래에 있으며 JSON을 반환하고 UI와 정확히 같은 권한을 적용합니다. 따라서 CI에서 보드를 프로비저닝하거나 팀별로 하나씩 생성할 수 있습니다.
| 메서드 | 경로 | 기능 |
|---|---|---|
| GET | /dashboards | 호출자가 볼 수 있는 모든 대시보드 |
| POST | /dashboards | 대시보드 생성 |
| GET | /dashboards/:id | 위젯을 포함한 대시보드 조회 |
| PATCH | /dashboards/:id | 이름, 레이아웃 또는 설정 수정 |
| POST | /dashboards/:id/duplicate | 위젯을 포함해 복제 |
| GET | /dashboards/:id/export | JSON 블루프린트 내보내기 |
| POST | /dashboards/import | 블루프린트로 보드 생성 |
| POST | /dashboards/:id/widgets | 위젯 추가 |
| GET | /widgets/:id/data | 권한 범위가 적용된 집계 위젯 데이터 |
| GET | /meta/data_sources | 사용할 수 있는 데이터 소스, 차원, 측정값, 저장된 쿼리 |
현재 제공 기능과 향후 계획
로드맵 항목은 새 데이터 소스, 위젯 유형, 내보내기 서비스처럼 기존 기능에 더해지는 방식으로 설계되어 있어 어떤 것도 마이그레이션을 요구하지 않습니다. 기능이 아닌 로드맵으로 따로 표시했으니, 현재 제공되는 기능을 기준으로 구매를 결정하시면 됩니다.
| 기능 | 상태 |
|---|---|
| 대시보드: 생성, 복제, 기본값 설정, 내보내기 및 가져오기 | 제공 중 |
| 자동 저장되는 드래그 앤 드롭 크기 조정 그리드 | 제공 중 |
| KPI, 표, 전체 ECharts 차트 세트 | 제공 중 |
| SQL 없는 시각적 위젯 설정 | 제공 중 |
| 저장된 쿼리 재사용 및 원클릭 보드 생성 | 제공 중 |
| 보드 전체를 갱신하는 전역 필터 | 제공 중 |
| 차트 → 일감 목록 드릴다운 | 제공 중 |
| 사용자별, 권한 범위가 적용된 SQL 집계 및 캐싱 | 제공 중 |
| 공유, 템플릿, 라이트 및 다크 테마 | 제공 중 |
| 여러 버전·데이터베이스 지원, 서버 측 대체 렌더링 | 제공 중 |
| PDF, PNG, Excel 내보내기 | 계획됨 |
| 매우 무거운 보고서를 위한 백그라운드 작업 | 계획됨 |
| WebSocket 실시간 업데이트 | 계획됨 |
| 예약 및 이메일 스냅샷 | 계획됨 |
| 키오스크 / 상황판 모드 | 계획됨 |
| AI 자연어 보고서 빌더 | 계획됨 |
| 캘린더, 번다운, 간트 요약 위젯 | 계획됨 |
3단계로 설치
셸 접근 권한과 rake 작업 실행 권한이 필요합니다. 플러그인을 설치하기 전에 항상 백업하세요.
cd /path/to/redmine # unzip the package from your email or download link unzip redmine_charts-1.0.0.zip -d plugins/ bundle install
bundle exec rake redmine:plugins:migrate NAME=redmine_charts RAILS_ENV=production # optional: the built-in dashboard templates bundle exec rake redmine_charts:seed_templates RAILS_ENV=production touch tmp/restart.txt
# Project → Settings → Modules → Charts & Dashboards # then grant the dashboard permissions to the roles that need them # a Dashboards entry appears in the top menu for anyone who holds one
Redmine 코어 파일을 패치하거나 재정의하나요?
설치하려면 Node.js나 빌드 과정이 필요한가요?
복잡한 쿼리를 포함해 기존에 저장된 쿼리가 모두 동작하나요?
접근 권한이 없는 프로젝트의 수치를 볼 수 있나요?
어떤 데이터베이스를 지원하나요?
어떤 Redmine 및 Rails 버전에서 실행되나요?
자체 데이터 소스나 차트 유형을 추가할 수 있나요?
버전 1.0에 의도적으로 포함하지 않은 것은 무엇인가요?
가격
맞춤 Redmine 솔루션이 필요하신가요?
기존 플러그인에 없는 기능을 찾고 계신가요?
RedmineKit은 맞춤 Redmine 플러그인 개발, 플러그인 커스터마이징, 워크플로 자동화, 타사 시스템 통합 등 비즈니스에 맞춘 솔루션을 제공합니다.
필요한 내용을 알려 주세요. 요구 사항을 검토한 후 예상 비용과 일정을 포함한 적합한 솔루션을 제안해 드립니다.
