가이드
데이터와 큐브

데이터와 큐브

DataSet으로 행 데이터를 로드한 뒤, Cube 스키마로 차원과 측정값을 설정하는 방법이다.

피벗에 올리는 데이터는 DataSet, 분석 모델은 Cube이다. Control을 만들기 전에 보통 다음 순서로 준비한다.

  1. createDataSet — 테이블(또는 Star Schema)에 행 데이터를 로드한다.
  2. createCubeManager — DataSet 위에 Cube 스키마(차원·측정값)를 올린다.
  3. createControl — Book 설정의 tables[].cube 속성으로 사용할 큐브를 지정한다.

전체 생성 흐름은 개발 가이드·시작하기를 참고한다.

DataSet

createDataSet에는 테이블 옵션(PivotDataTableOptions) 또는 Star Schema 옵션(PivotStarSchemaOptions)을 전달한다. createDataSet은 비동기 함수이므로, await.then()을 사용해 Promise 처리가 완료될 때까지 대기해야 한다.

테이블 옵션

속성설명
nameDataSet에 등록할 테이블 이름. Cube의 table이 이 이름을 참조한다
source메모리 데이터. 객체 배열 또는 JSON 문자열
sourceUrlJSON/CSV 데이터를 fetch로 가져올 URL
sourceType'json' | 'csv'. sourceUrl일 때만 사용하며, 미지정 시 JSON으로 기본 설정된다
csvOptionsCSV 파서 옵션 (sourceUrl + sourceType: 'csv'일 때)
tableDataTable 옵션. 보통 fields 속성에 컬럼 스키마를 정의한다

name·source·sourceUrl 중 하나는 있어야 한다.

source (배열·JSON 문자열)

const ds = await createDataSet([
  {
    name: 'sales',
    source: [
      { 국가: '한국', 판매수량: 10 },
      { 국가: '미국', 판매수량: 20 },
    ],
    table: {
      fields: [
        { name: '국가', type: 'text' },
        { name: '판매수량', type: 'number' },
      ],
    },
  },
]);
  • 배열은 그대로 행으로 들어간다.
  • 문자열은 JSON.parse 후 행으로 들어간다. 인라인 source에는 CSV를 넣을 수 없다.

sourceUrl (파일·원격)

const ds = await createDataSet([
  {
    name: 'sales',
    sourceUrl: '/data/sales.json',
    table: {
      fields: [
        { name: '국가', type: 'text' },
        { name: '판매수량', type: 'number' },
      ],
    },
  },
]);

CSV는 sourceType: 'csv'와 함께 지정한다.

{
  name: 'sales',
  sourceUrl: '/data/sales.csv',
  sourceType: 'csv',
  // csvOptions: { delimiter: ',', hasHeader: true },
  table: { fields: [/* ... */] },
}

테이블 필드 타입

table.fields의 type은 DataTable 값 타입('text', 'number' 등)을 사용하며, 이는 Cube 스키마 타입명(str, f64, i32)과 다르므로 주의해야 한다.

Star Schema (여러 테이블)

fact 테이블과 차원 테이블을 조인하려면 type: 'star' 옵션을 같은 createDataSet 배열에 넣는다.

const ds = await createDataSet([
  { name: 'orders', sourceUrl: '/data/orders.json', table: { fields: [/* ... */] } },
  { name: 'products', sourceUrl: '/data/products.json', table: { fields: [/* ... */] } },
  {
    type: 'star',
    name: 'star',
    fact: 'orders',
    dimensions: [
      {
        table: 'products',
        foreignKey: 'product_id',
        // primaryKey 생략 시 차원 테이블 첫 컬럼
      },
    ],
  },
]);
속성설명
type'star'이면 Star Schema로 처리한다
nameStar 이름. Cube의 table에 이 이름을 넣을 수 있다
factDataSet에 등록된 fact 테이블 name
dimensionstable, foreignKey, 선택적으로 alias, primaryKey, from

Cube를 만들 때 table에는 단일 테이블 name 또는 Star name을 지정한다.

Cube

createCubeManager(ds, cubes)는 동기이다. 각 큐브에는 name·table·schema가 필수이다.

const cm = createCubeManager(ds, [
  {
    name: 'sales',
    table: 'sales',
    schema: {
      dimensions: [
        { name: '국가', type: 'str' },
        { name: '차종', type: 'str' },
      ],
      measures: [
        { name: '판매수량', type: 'f64', aggregate: 'sum' },
      ],
    },
  },
]);

PivotCubeOptions

속성설명
nameCubeManager에서 조회하는 큐브 키. Book의 tables[].cube가 이 이름을 가리킨다
tableDataSet 테이블 name 또는 Star name
schemadimensions · measures (선택 metrics)
columnar생략 시 true
filters초기 CubeFilter[]
slicers슬라이서 옵션
label / description표시용 라벨·설명

차원 (dimensions)

속성설명
name차원 이름. Book 필드 배치에서도 이 이름을 쓴다
source소스 컬럼명 또는 (row) => value. 생략 시 name으로 컬럼을 찾는다
type'str' | 'i32' | 'date'
parentDimension비-date 계층의 부모 차원
dateFieldstype: 'date'일 때 날짜 분해 레벨 목록
virtualdate 분해 시 원본 date 컬럼을 제외할지 여부

날짜 분해 예:

{
  name: '판매날짜',
  source: '판매날짜',
  type: 'date',
  dateFields: ['판매반기;half', '판매분기;quarter', '판매월;month'],
}

dateFields 항목은 레벨(year, half, quarter, month, week, day 등)이거나 "표시이름;레벨" 형식이다. date 분해로 생긴 필드는 Book의 rows / columns에 그 이름(판매분기 등)으로 배치한다.

측정값 (measures)

속성설명
name측정값 이름
source소스 컬럼명 또는 (row) => value. 생략 시 name
type'f64' | 'i32' | 'str' | 'date'
aggregate집계 함수 (필수)

aggregate 값 예: sum, avg, min, max, count, distinct, first, last, p25, p50, p75, product, stdev, stdevp, var, varp 자세한 목록은 집계 함수를 참고한다.

str / date 타입 측정값은 보통 count · distinct만 의미가 있다. schema.measures[].aggregate는 큐브 측정값의 기본 집계 함수를 지정한다.

Book에서 페이지에 배치된 값 필드의 집계 함수를 지정하려면 tables[].fields.values[].aggregate를 사용한다.

자세한 옵션은 Config · tables · fields · values · aggregate를 참고한다.

이름 연결

레이어필드의미
DataSetPivotDataTableOptions.name물리 테이블 키
StarPivotStarSchemaOptions.name논리 Star 키
Cubetable위 테이블 또는 Star name
CubenameCubeManager 키
Booktables[].cube큐브 name (cm.get(cube))

관례로 name / table / cube를 같은 문자열로 맞추는 경우가 많지만 필수는 아니다. Book 페이지의 name은 시트 이름이며 DataSet 테이블명과 다르다.

런타임 필터

초기 필터는 Cube 옵션의 filters로 지정한다. 실행 중 필터는 개별 큐브 API로 다룹니다.

const cube = cm.get('sales');
cube.addFilter({ dimension: '국가', values: ['한국'] });

See Also