제가 만든 QualityHub: AI 기반 품질 인텔리전스, 귀하의 릴리스를 위해

발행: (2026년 2월 1일 오후 08:10 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

위 링크에 포함된 본문을 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다. (코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)

🎯 문제

Renault에서 개발자로 일하면서 매일 이 질문에 직면했습니다:

“이 릴리스를 프로덕션에 배포할 수 있을까?”

우리는 테스트 결과, 커버리지 메트릭, SonarQube 보고서를 가지고 있었지만 이 간단한 질문에 답할 단일 진실의 원천이 없었습니다.

그래서 저는 QualityHub를 만들었습니다 – 품질 메트릭을 분석하고 즉시 go/no‑go 결정을 제공하는 AI‑기반 플랫폼입니다.

🚀 QualityHub란?

QualityHub는 오픈‑소스 품질 인텔리전스 플랫폼으로, 다음을 수행합니다:

  • 📊 Aggregates any framework (Jest, JUnit, JaCoCo…) 의 테스트 결과
  • 🤖 Analyzes AI를 활용한 품질 메트릭
  • Decides 프로덕션에 배포해도 되는지 판단
  • 📈 Tracks 아름다운 대시보드에서 시간에 따른 추세를 추적

스택

구성 요소기술
백엔드TypeScript, Express, PostgreSQL, Redis
프론트엔드Next.js 14, Tailwind CSS
CLITypeScript with parsers for Jest, JaCoCo, JUnit
배포Docker Compose (self‑hostable)
라이선스MIT

💡 작동 방식

1. 범용 포맷 – qa-result.json

특정 도구를 강제하는 대신, QualityHub는 오픈 표준 포맷을 사용합니다:

{
  "version": "1.0.0",
  "project": {
    "name": "my-app",
    "version": "2.3.1",
    "commit": "a3f4d2c",
    "branch": "main",
    "timestamp": "2026-01-31T14:30:00Z"
  },
  "quality": {
    "tests": {
      "total": 1247,
      "passed": 1245,
      "failed": 2,
      "skipped": 0,
      "duration_ms": 45230,
      "flaky_tests": ["UserAuthTest.testTimeout"]
    },
    "coverage": {
      "lines": 87.3,
      "branches": 82.1,
      "functions": 91.2
    }
  }
}

이 포맷은 모든 테스트 프레임워크와 호환됩니다.

2. CLI 파서

CLI가 테스트 결과를 자동으로 변환합니다:

# Jest (JavaScript/TypeScript)
qualityhub parse jest ./coverage

# JaCoCo (Java)
qualityhub parse jacoco ./target/site/jacoco/jacoco.xml

# JUnit (Java/Kotlin/Python)
qualityhub parse junit ./build/test-results/test

3. 위험 분석 엔진

백엔드가 결과를 분석하고 위험 점수(0‑100)를 계산합니다.

분석된 위험 요인

  • 테스트 통과율
  • 코드 커버리지(라인, 브랜치, 함수)
  • 불안정 테스트
  • 커버리지 추세
  • 코드 품질 메트릭(가능한 경우)

샘플 출력

{
  "risk_score": 85,
  "status": "SAFE",
  "decision": "PROCEED",
  "reasoning": "Test pass rate: 99.8%. Coverage: 87.3%. No critical issues.",
  "recommendations": []
}

4. 아름다운 대시보드

QualityHub dashboard

시간에 따라 메트릭을 추적하고, 추세를 확인하며, 정보에 기반한 결정을 내립니다.

🔧 빠른 시작

자체 호스팅 (5 분)

# Clone repo
git clone https://github.com/ybentlili/qualityhub.git
cd qualityhub

# Start everything with Docker
docker-compose up -d

# ✅ Backend: http://localhost:8080
# ✅ Frontend: http://localhost:3000

CLI 사용

# Install
npm install -g qualityhub-cli

# Initialize
qualityhub init

# Parse your test results
qualityhub parse jest ./coverage

# Push to QualityHub
qualityhub push qa-result.json

완료! 메트릭이 대시보드에 즉시 표시됩니다.

🎨 Why I Built This

The Pain Points

  • Fragmented tools – 테스트를 위한 Jest, 커버리지를 위한 JaCoCo, 품질을 위한 SonarQube… 각각 고유한 UI와 포맷을 가짐.
  • No single answer – “배포해도 될까?” 라는 질문에 여러 도구를 확인하고 직감에 의존해야 함.
  • No history – 시간에 따른 품질 추세를 추적하기 어려움.
  • Manual process – 자동화 없음, CI/CD 연동 없음.

The Solution

QualityHub aggregates everything into one dashboard and uses AI to make the decision for you.

🏗️ 아키텍처

┌─────────────┐
│     CLI     │ ← Parse test results
└──────┬──────┘
       │ POST /api/v1/results

┌─────────────────────────────┐
│     Backend (API)           │
│  • Express + TypeScript     │
│  • PostgreSQL + Redis       │
│  • Risk Analysis Engine     │
└──────────────┬──────────────┘


┌─────────────────────────────┐
│   Frontend (Dashboard)       │
│  • Next.js 14                │
│  • Real‑time metrics         │
└─────────────────────────────┘

Source:

📊 기술 심층 분석

1. 파서 아키텍처

각 파서는 기본 클래스를 확장합니다:

export abstract class BaseParser {
  abstract parse(filePath: string): Promise;

  protected buildBaseResult(adapterName: string) {
    return {
      version: '1.0.0',
      project: {
        name: this.projectInfo.name,
        commit: process.env.GIT_COMMIT || 'unknown',
        // Auto‑detect CI/CD environment
        timestamp: new Date().toISOString(),
      },
      metadata: {
        ci_provider: this.detectCIProvider(),
        adapters: [adapterName],
      },
    };
  }
}

이렇게 하면 새 파서를 추가하는 것이 매우 간단해집니다. pytest 지원이 필요하나요? BaseParser를 상속하고 parse()를 구현하면 됩니다.

2. 위험 점수 알고리즘 (MVP)

현재 버전은 규칙 기반 점수 매기기를 사용합니다:

let score = 100;

// Test failures
if (tests.failed > 0) {
  score -= tests.failed * 5;
}

// Coverage thresholds
if (coverage.lines < 80) {
  score -= (80 - coverage.lines) * 0.5;
}
if (coverage.branches < 70) {
  score -= (70 - coverage.branches) * 0.5;
}
if (coverage.functions < 75) {
  score -= (75 - coverage.functions) * 0.5;
}

// Flaky tests
if (flakyTests.length > 0) {
  score -= flakyTests.length * 3;
}

// Ensure 0‑100 range
score = Math.max(0, Math.min(100, score));

향후 계획: 과거 릴리스 데이터를 학습하는 AI 기반 모델로 교체합니다.

3. red analysis (Claude API) for contextual insights

4. 데이터베이스 스키마

단순하고 효율적입니다:

CREATE TABLE projects (
    id UUID PRIMARY KEY,
    name VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE qa_results (
    id UUID PRIMARY KEY,
    project_id UUID REFERENCES projects(id),
    version VARCHAR(50),
    commit VARCHAR(255),
    branch VARCHAR(255),
    timestamp TIMESTAMP,
    metrics JSONB,          -- Flexible JSON storage
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE risk_analyses (
    id UUID PRIMARY KEY,
    qa_result_id UUID REFERENCES qa_results(id),
    risk_score INTEGER,
    status VARCHAR(50),
    reasoning TEXT,
    risks JSONB,
    recommendations JSONB,
    decision VARCHAR(50)
);

JSONB는 스키마 마이그레이션 없이도 유연한 메트릭 저장을 가능하게 합니다.

🚀 다음은?

v1.1 (예정)

  • 🤖 AI‑Powered Analysis Claude API와 함께
  • 📊 Trend Detection (시간에 따라 커버리지가 감소)
  • 🔔 Slack/Email Notifications
  • 🔌 GitHub App (PR에 대한 코멘트)

v1.2 (미래)

  • 📈 Advanced Analytics (벤치마킹, 예측)
  • 🔐 SSO & RBAC 기업용
  • 🌍 Multi‑language support
  • 🎨 Custom dashboards

💡 Lessons Learned

  1. Open Standards Win
    qa-result.json오픈 표준으로 만든 것이 핵심이었습니다. 이제 누구나 파서나 통합을 만들 수 있습니다.

  2. Developer Experience Matters
    CLI 극도로 간단해야 합니다:

    qualityhub parse jest ./coverage  # Just works

    설정 파일도 없고, 설정도 필요 없습니다—그냥 작동합니다.

  3. Self‑Hosting is a Feature
    많은 기업이 메트릭을 외부 SaaS에 전송할 수 없습니다. Docker Compose를 사용하면 셀프 호스팅이 매우 간단해집니다.

🤝 Contributing

QualityHub는 100 % 오픈‑소스 (MIT License)입니다.

기여하고 싶으신가요?

  • 🧪 파서 추가 (pytest, XCTest, Rust…)
  • 🎨 대시보드 개선
  • 🐛 버그 수정
  • 📚 문서 작성

기여 가이드를 확인하세요.

🔗 링크

  • GitHub:
  • CLI:
  • npm:

🎯 지금 바로 시도해 보세요

# Self‑host in 5 minutes
git clone https://github.com/ybentlili/qualityhub.git
cd qualityhub
docker-compose up -d

# Or just the CLI
npm install -g qualityhub-cli
qualityhub parse jest ./coverage

💬 어떻게 생각하시나요?

이걸 사용하시겠어요? 어떤 기능을 보고 싶으신가요?

유용하다고 생각하시면 GitHub에서 ⭐를 남겨 주세요!

❤️와 TypeScript로 제작

Back to Blog

관련 글

더 보기 »