Cube.dev 소개 영상

github: https://github.com/cube-js/cube.git

Cube.dev는 시맨틱레이어를 근간으로 파워풀한 BI를 제공하는 솔루션/시맨틱레이어를 오픈소스로 제공합니다.


아키텍처

Semantic layer architecture

  • 코드 우선 접근 (버전 관리, 시맨틱 레이어를 통한 구조적 접근) (데이터 모델링, 접근 제어, 캐싱, API 네가지 핵심으로 구성됨)

개념적 아키텍처


큰 흐름은 다음과 같습니다.
Semantic Layer - Agent - Semantic Layer Runtime - DB

  1. 시맨틱 레이어 정보 생성, 등록
  2. Agent가 시맨틱 레이어 정보를 통한 시맨틱 SQL을 생성 (솔루션에만 제공)
  3. 시맨틱 레이어 런타임에서 DB에 맞는 SQL로 전환
  4. 전환된 SQL을 DB에 실행

구성 아키텍처

핵심 기능

데이터 모델링

  • 메트릭 정의, 엔티티 관계 및 비즈니스 로직을 중앙 집중화 시맨틱 레이어 데이터 모델 의존
  • (YAML, Javascript 코드로 정의, 버전 관리됨)

용어 설명

  • cube
    • 비즈니스 개체(고객, 품목, 주문)를 나타내며, 각 개체 간의 관계를 정의 (이것을 기반으로 에이전트가 데이터를 탐색하는 지식 그래프로 형성)
  • view
    • 데이터 소비자가 상호작용하는 인터페이스 생성 (AI에이전트, BI사용자 및 앱을 위한 최종 데이터 제품), 큐브를 기반한 데이터 그래프

APIs

API를 통해 AI에이전트, 애플리케이션 및 도구가 표준 프로토콜로 시맨틱 레이어와 상호 작용 합니다.(REST, GraphSQL, SQL 표준을 사용)

  • REST, GraphQL
    • 사용자 정의 앱 구축 위한 API 인터페이스 제공
  • SQL
    • BI도구, 시각화 플랫폼 및 데이터 애플리케이션 SQL 데이터 소스 쿼리
    • (Cube에 연결할 수 있는 데이터 소스가 연결되면 시맨틱 소스. 기반으로 데이터에 접근 - 시맨틱 레이어 런타임에서 시맨틱 쿼리를 db 쿼리로 변환하는 내용이 들어가 있습니다.)

Cube-core에서 제공하는 주요 API 중 REST 주요 항목

  • 등록된 cube meta 조회
  • 실 데이터 조회
  • 쿼리 변환
    • 일반 SQL Cube SQL
    • Cube SQL 일반 SQL

Cube.dev REST API: https://cube.dev/docs/product/apis-integrations/core-data-apis/rest-api/reference#example

## 등록된 데이터 조회
curl -H "Authorization: TOKEN" -G http://localhost:4000/cubejs-api/v1/meta
 
## 실 데이터 조회
curl -H "Authorization: TOKEN" -G --data-urlencode 'query={"measures":["users.count"]}' http://localhost:4000/cubejs-api/v1/load
 

### Request with http method POST
### Use POST to fix problem with query length limits
curl -X POST -H "Content-Type: application/json" -H "Authorization: TOKEN" --data '{"query":{"measures":["users.count"]}}' http://localhost:4000/cubejs-api/v1/load
 
 
## 쿼리 변환
### 일반 SQL -> Cube SQL
curl -X POST -H "Authorization: TOKEN" -H "Content-Type: application/json" -d '{"query": "SELECT 123 AS value UNION ALL SELECT 456 AS value UNION ALL SELECT 789 AS value"}' http://localhost:4000/cubejs-api/v1/cubesql
 
 
### Cube SQL -> 일반 SQL
curl -H "Authorization: TOKEN" -G --data-urlencode 'query={"measures":["orders.count"]}' --data-urlencode 'format=rest' http://localhost:4000/cubejs-api/v1/sql

접근 제어

  • 모든 데이터 소비는 단일 관리 검문소를 거침 (python, javascript로 정의) AI에이전트와 인간 사용자를 구분없이 동일하게 보안 정책을 준수하도록 보장합니다.

캐싱

  • 시맨틱 레이어를 사용 결과 캐싱 measure, dimension 을 포함하는 롤업 테이블 형태로 모델에 사전 집계 정의
  • 웨어하우스에 쿼리한 결과를 Cube 전용 캐싱 엔진인 Cube Store에 저장해 백그라운드에서 사전 집계를 저장, 결과 전달 합니다.

시맨틱 레이어란?

사전적 의미
시맨틱 레이어(Semantic Layer)란 복잡한 _원시 데이터_를 비즈니스 사용자에게 친숙하고 _의미 있는 용어_로 변환해주는 중간 번역 계층

db, table, column 정보와 pk, 다른 테이블 과의 연관 관계가 정리되어 저장된 레이어

원시 데이터

CREATE TABLE items (
    item_code      VARCHAR(50),
    original_item_name     TEXT,
    category          VARCHAR(100),
    item_name      VARCHAR(255),
    food_type         VARCHAR(100),
    capacity_calories VARCHAR(100),
    ingredients       TEXT,
    nutrition_facts   TEXT,
    allergy_info      TEXT,
    manufacturer      VARCHAR(255),
    report_number     VARCHAR(100),
    remarks           TEXT,
    PRIMARY KEY (item_code, original_item_name)
);

의미 있는 용어(비즈니스 개체_ex고객, 품목, 주문 각 개체 간의 관계를 정의)

cubes:
- name: users
  sql_table: users
  title: "사용자(User) 데이터"
  description: >
    서비스에 가입한 사용자 정보를 담고 있는 기본 테이블입니다.
    사용자 생성일자, 소속 조직, 국가 정보를 기반으로
    사용자 증가 추이, 조직별 사용자 분포, 국가별 사용자 분석 등에 활용됩니다.
 
  joins:
  - name: organizations
    sql: "{CUBE}.organization_id = {organizations.id}"
    relationship: many_to_one
 
  dimensions:
  - name: organization_id
    sql: organization_id
    type: number
    title: "조직 ID"
    description: "사용자가 속한 조직(Organization)의 고유 식별자"
    primary_key: true
    meta:
      synonyms: ["회사ID", "조직코드", "organization", "org_id"]
      filterable: true
      sortable: true
 
  - name: created_at
    sql: created_at
    type: time
    title: "사용자 가입일"
    description: "사용자가 서비스에 가입한 날짜 및 시간"
    meta:
      synonyms: ["가입일", "생성일", "등록일", "회원가입일"]
      filterable: true
      sortable: true
 
  - name: country
    sql: country
    type: string
    title: "국가"
    description: "사용자가 등록한 국가 정보"
    meta:
      synonyms: ["국적", "지역", "country_name", "사용자 국가"]
      filterable: true
      sortable: true
 
  measures:
  - name: count
    type: count
    sql: id
    title: "전체 사용자 수"
    description: "등록된 전체 사용자 수를 집계합니다."
    meta:
      synonyms: ["사용자수", "회원수", "총회원", "유저수"]