dscc-gen을 사용하여 데이터 스튜디오 커뮤니티 시각화 만들기

1. 소개

Google 데이터 스튜디오를 사용하면 아름다운 데이터 시각화를 지원하는 동적인 대화형 대시보드를 무료로 구축할 수 있습니다. 커뮤니티 시각화는 JavaScript로 데이터 스튜디오 보고서와 통합되는 커스텀 시각화를 빌드할 수 있는 데이터 스튜디오의 기능입니다.

학습할 내용

이 Codelab에서는 다음 내용을 알아봅니다.

  • Google 데이터 스튜디오 커뮤니티 시각화의 작동 방식
  • 명령줄 템플릿 도구를 사용하여 커뮤니티 시각화를 빌드하는 방법
  • JavaScript 시각화 라이브러리를 사용하여 커뮤니티 시각화를 빌드하는 방법
  • 커뮤니티 시각화를 데이터 스튜디오 대시보드에 통합하는 방법

필요한 항목

이 Codelab을 완료하려면 다음이 필요합니다.

  • 인터넷, 웹브라우저, 터미널, 즐겨 사용하는 텍스트 편집기에 액세스할 수 있습니다.
  • Google 계정
  • Google Cloud Storage 버킷에 대한 액세스
  • JavaScript, Node.js, 명령줄에 대한 기본 지식

이 Codelab에서는 다음을 가정합니다.

  • 이미 커뮤니티 시각화를 빌드했습니다 (TODO 링크 첫 번째 Codelab).
  • Google Cloud Storage에 익숙함

시작하려면 오른쪽 상단에 있는 14575f934e800122.png 아이콘을 클릭하여 이 보고서 의 사본을 만드세요. Codelab을 진행하면서 다른 탭에서 열어 두세요.

2. 간단한 설문조사

이 Codelab을 선택한 이유는 무엇인가요?

<ph type="x-smartling-placeholder"></ph> 일반적인 데이터 시각화에 관심이 있습니다. 데이터 스튜디오에 대해 자세히 알아보기 나만의 커뮤니티 시각화를 구축하고 싶습니다. 데이터 스튜디오를 다른 플랫폼과 통합하려고 합니다. Google Cloud 솔루션에 관심이 있습니다.

이 Codelab/튜토리얼을 어떻게 사용할 계획인가요?

<ph type="x-smartling-placeholder"></ph> 읽고 연습 활동을 완료하세요 스키스루만 사용

데이터 스튜디오 사용 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 들어본 적 없음 이것이 무엇인지 알지만 사용하지는 않습니다. 정기적으로 사용합니다. 전문 사용자입니다.

본인의 배경을 가장 잘 설명하는 항목은 무엇인가요?

<ph type="x-smartling-placeholder"></ph> 개발자 비즈니스 / 데이터 분석가 데이터 과학자 / 데이터 엔지니어 재무 분석가 마케팅 / 소셜 미디어 / 디지털 분석 전문가 비즈니스 분석가 디자이너 기타

다음 페이지로 이동하여 설문조사 정보를 제출하세요.

3. dscc-gen을 사용한 커뮤니티 시각화 개발

dscc-gen

dscc-gen은 커뮤니티 시각화 및 커뮤니티 커넥터를 위한 독자적인 템플릿과 워크플로를 제공하는 명령줄 도구입니다. 커뮤니티 시각화 템플릿은 시각화 코드 변경사항을 즉시 확인할 수 있는 워크플로와 시각화를 검증, 빌드, 배포하는 스크립트를 제공합니다.

설정

dscc-gen은 배포 스크립트에서 gsutil을 사용하고 npm 및 webpack을 사용하여 커뮤니티 시각화 자바스크립트 코드를 빌드합니다.

  1. 로컬 컴퓨터에 npm 설치
  2. gsutil 빠른 시작을 통해 Google Cloud Storage 버킷 설정
  3. 프로젝트를 찾을 로컬 디렉터리로 이동합니다.

4. 새로운 dscc-gen 커뮤니티 시각화 프로젝트 시작

터미널을 열고 다음 명령어를 실행합니다.

npx @google/dscc-gen viz

dscc-gen에 프로젝트 이름('dev')을 묻는 메시지가 표시됩니다. GCS 스토리지 위치 및 'prod' 스토리지 위치를 지정합니다 gs 프로토콜을 사용하여 위치를 URI로 입력합니다. 예: gs://my-gs-project/example-dev입니다. '위치' Cloud Storage 버킷이거나 해당 버킷 내의 폴더일 수 있습니다. 두 저장소 위치는 서로 달라야 합니다. 도구에서 입력한 값에 대한 액세스 권한이 있는지 확인합니다. 위치가 존재하지 않으면 자동으로 생성됩니다.

dscc-gen에서 새로운 커뮤니티 시각화를 만들면 시작 방법에 대한 안내가 인쇄됩니다. 터미널이 다음과 같이 표시됩니다 (입력은 굵은 기울임꼴로 표시됨).

$ npx @google/dscc-gen viz
npx: installed 345 in 14.957s
? Project name barchart
? What is your GCS dev directory? gs://community-visualizations-codelab/barchart-dev
? What is your GCS prod directory? gs://community-visualizations-codelab/barchart-prod
Installing dependencies...

Created new community viz: barchart

cd barchart and npm run start to begin working on your viz!

src/의 파일(특히 index.js, index.json, index.css)을 수정하여 시각화를 작성합니다.

dist/의 파일을 사용하면 브라우저에서 로컬로 시각화를 미리 볼 수 있습니다. webpack.config.js는 시각화를 로컬에서 실행하는 데 사용됩니다. README.md은 템플릿 파일 및 명령어의 개요를 제공합니다.

5. 로컬에서 시각화 미리보기

추천 안내에 따라 터미널에서 다음 명령어를 실행합니다.

cd <folder name>

npm run start

브라우저가 다음과 같은 웹페이지로 열립니다.

219993dfb676d4.png

다음 단계에서 자세히 알아보세요.

6. [정보] dscc-gen 워크플로의 작동 방식

dscc-gen 시각화 템플릿에는 작동 중인 시각화와 템플릿 사용 방법에 대한 안내가 포함되어 있습니다. 주요 기능은 다음과 같습니다.

로컬 메시지 업데이트: 샘플 메시지가 템플릿에 포함되어 있지만 지원하려는 사용 사례를 반영하지 않을 가능성이 높습니다. 빌드하려는 시각화를 반영하는 샘플 데이터를 다운로드해야 합니다.

로컬 개발 워크플로: 로컬 데이터 업데이트의 데이터를 사용하여 로컬에서 코드를 작성하고 테스트합니다.

빌드 및 시각화를 배포할 수 있습니다. 코드를 빌드하고 시각화를 Google Cloud Storage 버킷에 업로드할 수 있습니다

데이터 스튜디오에서 시각화 로드: 데이터 스튜디오 보고서에 시각화를 추가합니다.

7. 구성 정의

구성 파일은 시각화를 사용하는 보고서 편집자와 시각화 개발자 간의 계약입니다. 시각화가 데이터 스튜디오에 로드되면 사용할 수 있는 옵션을 정의합니다.

이 막대 그래프 시각화의 경우 구성에는 측정기준 1개와 측정항목 1개, 보고서 편집기에서 막대 그래프 스타일을 변경할 수 있는 스타일 요소가 포함됩니다.

src/index.json의 콘텐츠를 다음으로 바꿉니다. 대괄호를 모두 포함했는지 확인하세요. 다시 입력할 때는 대괄호와 중괄호, 중첩 구조의 차이점에 유의하세요.

index.json

{
  "data": [
    {
      "id": "concepts",
      "label": "Concepts",
      "elements": [
        {
          "id": "dimension",
          "label": "Dimensions",
          "type": "DIMENSION",
          "options": {
            "min": 1,
            "max": 1
          }
        },
        {
          "id": "metric",
          "label": "Metric",
          "type": "METRIC",
          "options": {
            "min": 1,
            "max": 1
          }
        }        
      ]
    }
  ],
  "style": [
    {
      "id": "barStyling",
      "label": "Bar Styles",
      "elements": [
        {
          "id": "barColor",
          "label": "Bar Color",
          "type": "FILL_COLOR",
          "defaultValue": {
            "color": "#1E555C"
          }
        }
      ]
    }
  ]  
}

8. 업데이트된 메시지 다운로드

로컬에 저장된 데이터를 업데이트하려면 다음을 실행합니다.

npm run update_message

터미널이 다음과 같이 표시됩니다.

barchart $ npm run update_message
> @ update message /Users/Code/barchart
> dscc-scripts viz update_message -f object

Copying file://build/index.js [Content-Type=application/javascript]...
Copying file://build/index.css [Content-Type=text/css]...
Copying file://build/manifest.json [Content-Type=application/json]...
Copying file://build/index.json [Content-Type=application/json]...
\ [4 files][ 48.5 KiB/ 48.5 KiB]
Operation completed over 4 objects/48.5 KiB.
Viz deployed to gs://community-visualizations-codelabs/barchart-dev

이 명령어는 수신된 데이터를 로컬 시각화로 출력하는 시각화를 데이터 스튜디오에 배포합니다. 스크립트는 위에 강조표시된 시각화의 배포 위치를 출력합니다. 이 위치를 사용하여 데이터 스튜디오에서 시각화를 로드합니다.

시각화를 로드하려면 앞서 복사한 보고서를 엽니다.

  1. '보고서 수정'으로 이동
  2. '커뮤니티 시각화 및 구성요소'를 클릭합니다. 툴바에서

e927f8fbd49979a5.png

  1. '더 둘러보기'를 클릭합니다.

c236b0cfcc68ce2c.png

  1. '나만의 시각화 만들기'를 클릭합니다.
  2. 매니페스트 경로 (터미널에 출력된 gs://... 위치)를 입력하고 제출을 클릭합니다.

26588c6c8382a3b.png

  1. 렌더링된 카드를 클릭하여 보고서에 추가합니다.

시각화는 다음과 같은 JSON을 렌더링해야 합니다.

a08a61345fe12837.png

마우스 오른쪽 버튼을 클릭하고 모두 선택하여 전체 메시지를 복사하고 src/localMessage.js의 내용을 방금 복사한 내용으로 바꿉니다. 파일을 저장합니다.

브라우저에서 로컬로 실행되는 시각화가 더 이상 표시되지 않으며 콘솔을 보면 오류가 표시됩니다.

9. 막대 그래프용 JavaScript 작성

먼저 다음 명령어를 실행하여 d3.js를 종속 항목으로 추가합니다.

npm install d3

그런 다음 src/index.js를 다음 코드로 바꿉니다. 마지막 단계의 변경사항은 굵은 글씨로 표시됩니다.

src/index.js

const d3 = require('d3');
const dscc = require('@google/dscc');
const local = require('./localMessage.js');

// change this to 'true' for local development
// change this to 'false' before deploying
export const LOCAL = true;

const drawViz = (message) => {
  const margin = { left: 20, right: 20, top: 20, bottom: 20 };
  const height = dscc.getHeight() - 10;
  const width = dscc.getWidth();

  const chartHeight = height - margin.top - margin.bottom;
  const chartWidth = width - margin.left - margin.right;

  // remove existing svg
  d3.select("body")
    .selectAll("svg")
    .remove();

  // make a canvas
  const svg = d3
    .select("body")
    .append("svg")
    .attr("width", width)
    .attr("height", height);

  // make an svg for the bar chart
  const chartSvg = svg
    .append("svg")
    .attr("x", margin.left)
    .attr("y", margin.top)
    .attr("width", chartWidth)
    .attr("height", chartHeight);

  // xScale to distribute bars
  const xScale = d3
    .scaleBand()
    .domain(message.tables.DEFAULT.map(d => d.dimension[0]))
    .range([0, chartWidth])
    .paddingInner(0.3);

  // yScale to size bars
  const yScale = d3
    .scaleLinear()
    .domain([0, d3.max(message.tables.DEFAULT.map(d => d.metric[0]))])
    .range([0, chartHeight]);

  // add bars
  const bars = chartSvg
    .append("g")
    .attr("class", "bars")
    .selectAll("rect.bars")
    .data(message.tables.DEFAULT)
    .enter()
    .append("rect")
    .attr("x", d => xScale(d.dimension[0]))
    .attr("y", d => chartHeight - yScale(d.metric[0]))
    .attr("width", xScale.bandwidth())
    .attr("height", d => yScale(d.metric[0]));

  // add text
  const text = svg
    .append("g")
    .selectAll("text")
    .data(message.tables.DEFAULT)
    .enter()
    .append("text")
    .attr(
      "x",
      d => xScale(d.dimension[0]) + xScale.bandwidth() / 2 + margin.left
    )
    .attr("y", height - margin.bottom / 4)
    .attr("text-anchor", "middle")
    .text(d => d.dimension[0]);
};

// renders locally
if (LOCAL) {
  drawViz(local.message);
} else {
  dscc.subscribeToData(drawViz, {transform: dscc.objectTransform});
}

로컬 서버가 여전히 실행 중인 경우 브라우저를 확인합니다. 이제 로컬 개발 웹페이지에 아래와 같은 막대 그래프가 표시됩니다.

2cb9f9d8d1bd2063.png

10. 매니페스트 업데이트 (선택사항)

시각화 매니페스트에는 시각화에 대한 메타데이터 및 시각화 JavaScript, 구성, CSS의 위치가 포함됩니다. 매니페스트의 값을 업데이트합니다. 이 값은 시각화에 대한 최종 사용자 정보를 제공하는 데 사용됩니다.

src/manifest.json을 수정하여 시각화를 설명합니다. 샘플 매니페스트는 다음과 같습니다.

src/manifest.json

{
  "name": "Bar Chart",
  "organization": "[My name]",
  "description": "Bar chart",
  "logoUrl": "https://storage.googleapis.com/community-visualizations-codelabs/barchart/bar_chart.png",
  "organizationUrl": "https://github.com/googledatastudio/",
  "supportUrl": "http://github.com/googledatastudio/community-visualizations",
  "privacyPolicyUrl": "http://github.com/googledatastudio/community-visualizations",
  "termsOfServiceUrl": "http://github.com/googledatastudio/community-visualizations",
  "packageUrl": "",
  "devMode": "DEVMODE_BOOL",
  "components": [
    {
      "id": "Bar chart",
      "name": "Bar chart",
      "description": "My first Community Visualization",
      "iconUrl": "https://storage.googleapis.com/community-visualizations-codelabs/table/table_icon.png",
      "resource": {
        "js": "YOUR_GCS_BUCKET/index.js",
        "config": "YOUR_GCS_BUCKET/index.json",
        "css": "YOUR_GCS_BUCKET/index.css"
      }
    }
  ]
}

11. 시각화 배포

src/index.js에서 const LOCAL을 'false'로 변경합니다. 브라우저에서 시각화가 작동을 멈춥니다. 변경된 코드 줄은 굵게 표시되어 있습니다. 이 부울은 코드에서 'local'을 사용해야 하는지 여부를 구성합니다. 데이터 파일 또는 데이터 스튜디오에서 수신한 데이터가 포함됩니다.

src/index.js (abridged)

const d3 = require('d3');
const dscc = require('@google/dscc');
const local = require('./localMessage.js');

// change this to 'true' for local development
// change this to 'false' before deployment
export const LOCAL = false;

const drawViz = (message) => {...}

그런 다음 터미널에서 다음을 실행합니다.

npm run build:dev
npm run push:dev

build:dev 명령어는 JavaScript 종속 항목을 축소되지 않은 출력으로 묶고 매니페스트의 값을 대체하여 캐싱을 사용 중지하고 'dev'를 가리키도록 합니다. 앞서 구성한 버킷이 있습니다

push:dev 명령어는 시각화 리소스를 'dev'에 업로드합니다. 버킷을 만들고, 버킷 위치를 콘솔에 출력합니다.

데이터 스튜디오 보고서를 새로고침합니다. 막대 그래프가 표시됩니다. 속성 패널에서 데이터 및 스타일 옵션을 변경해 보세요. 데이터를 변경하면 막대가 변경됩니다. 그러나 막대 색상 스타일 선택기는 아직 작동하지 않습니다.

12. 막대 그래프에서 보고서 편집기 색상 선택 기능 사용

로컬에서 코드를 수정하려면 먼저 src/index.js의 const LOCAL 변수를 true로 업데이트합니다. 그런 다음 styleVal()라는 새 함수를 추가하고 drawViz()에서 코드를 업데이트합니다. src/index.js는 다음과 같아야 합니다.

src/index.js

const d3 = require('d3');
const dscc = require('@google/dscc');
const local = require('./localMessage.js');

// change this to 'true' for local development
// change this to 'false' before deploying
export const LOCAL = false;

// parse the style value
const styleVal = (message, styleId) => {
  if (typeof message.style[styleId].defaultValue === "object") {
    return message.style[styleId].value.color !== undefined
      ? message.style[styleId].value.color
      : message.style[styleId].defaultValue.color;
  }
  return message.style[styleId].value !== undefined
    ? message.style[styleId].value
    : message.style[styleId].defaultValue;
};

const drawViz = message => {
  const margin = { left: 20, right: 20, top: 20, bottom: 20 };
  const height = dscc.getHeight() - 10;
  const width = dscc.getWidth();

  const chartHeight = height - margin.top - margin.bottom;
  const chartWidth = width - margin.left - margin.right;

  // remove existing svg
  d3.select("body")
    .selectAll("svg")
    .remove();

  // make a canvas
  const svg = d3
    .select("body")
    .append("svg")
    .attr("width", width)
    .attr("height", height);

  // make an svg for the bar chart
  const chartSvg = svg
    .append("svg")
    .attr("x", margin.left)
    .attr("y", margin.top)
    .attr("width", chartWidth)
    .attr("height", chartHeight);

  // xScale to distribute bars
  const xScale = d3
    .scaleBand()
    .domain(message.tables.DEFAULT.map(d => d.dimension[0]))
    .range([0, chartWidth])
    .paddingInner(0.3);

  // yScale to size bars
  const yScale = d3
    .scaleLinear()
    .domain([0, d3.max(message.tables.DEFAULT.map(d => d.metric[0]))])
    .range([0, chartHeight]);

  // get the user-selected bar color
  let barColor = styleVal(message, "barColor");

  // add bars
  const bars = chartSvg
    .append("g")
    .attr("class", "bars")
    .selectAll("rect.bars")
    .data(message.tables.DEFAULT)
    .enter()
    .append("rect")
    .attr("x", d => xScale(d.dimension[0]))
    .attr("y", d => chartHeight - yScale(d.metric[0]))
    .attr("width", xScale.bandwidth())
    .attr("height", d => yScale(d.metric[0]))
    .attr("fill", barColor);

  // add text
  const text = svg
    .append("g")
    .selectAll("text")
    .data(message.tables.DEFAULT)
    .enter()
    .append("text")
    .attr(
      "x",
      d => xScale(d.dimension[0]) + xScale.bandwidth() / 2 + margin.left
    )
    .attr("y", height - margin.bottom / 4)
    .attr("text-anchor", "middle")
    .attr("fill", barColor)
    .text(d => d.dimension[0]);
};

// renders locally
if (LOCAL) {
  drawViz(local.message);
} else {
  dscc.subscribeToData(drawViz, {transform: dscc.objectTransform});
}

src/index.js를 저장한 다음 로컬 브라우저 세션으로 돌아갑니다. 로컬에서 실행되는 것을 확인한 다음 const LOCAL을 false로 변경합니다.

다음을 실행하여 업데이트된 파일을 Google Cloud Storage에 업로드합니다.

npm run build:dev
npm run push:dev

데이터 스튜디오 보고서를 새로고침합니다. 이제 막대의 색상을 변경할 수 있습니다.

fd4e436a6e8dd58b.gif

13. 프로덕션 배포

프로덕션 배포

시각화가 만족스러우면 src/index.js의 const LOCAL이 false인지 확인한 다음 실행합니다.

npm run build:prod
npm run push:prod

파일이 '프로덕션'에 배포됩니다. GCS 버킷 위치입니다. 또한 캐싱이 사용 설정되고 번들 JavaScript가 적절하게 축소됩니다.

이전과 마찬가지로 배포 위치가 콘솔에 출력됩니다. 이 '매니페스트 경로' 사용 'prod'를 로드하세요 시각화를 볼 수 있습니다.

축하합니다. dscc-gen 도구를 사용하여 첫 번째 커뮤니티 시각화를 빌드했습니다.

14. 다음 단계

시각화 확장

커뮤니티 시각화 최대한 활용하기

추가 리소스

다음은 이 Codelab에서 다룬 자료를 자세히 살펴보는 데 도움이 되는 다양한 리소스입니다.

리소스 유형

사용자 기능

개발자 기능

문서

고객센터

개발자 문서

뉴스 및 업데이트

데이터 스튜디오에서 가입하기 > 사용자 설정

개발자 메일링 리스트

질문하기

사용자 포럼

Stack Overflow [google-data-studio]데이터 스튜디오 개발자 포럼

동영상

YouTube의 데이터 스튜디오

제공 예정

예시

보고서 갤러리

오픈소스 저장소