데이터 시각화 서비스 만들기

1인 지식 기업을 꿈꾸는 30, 40대 직장인을 위한 실무 프로젝트
React, Meteor, D3.js, Chart, Data Visualization

[Chart 추천 서비스] React + Meteor + Redux + Typescript + EUI 환경 구성

Chart 추천 서비스

기획한 Chart Recommendation 서비스를 위한 React, Meteor, Typescript, SCSS, Elastic UI(eui), Redux 기반 환경을 구성하는 과정을 정리한다. 


  - Meteor create을 통한 react환경

  - Typescript, SCSS 지원

  - redux-observable을 이용한 Redux 환경 설정

  - Elastic UI 및 react-final-form 설치

  - react+meteor+eui+scss boilerplate 소스




React기반의 Meteor, Typescript, SCSS 프로젝트 생성


Node.js 8.12.0 사용, 현재 meteor 버전은 1.8.0.1 이다. 

$ meteor create --react react-meteor-redux-boilerplate

$ cd react-meteor-redux-boilerplate

// 최신 버전 설치

$ meteor update 

// 정상 작동하는지 확인 

$ meteor run


scss, typescript 컴파일러 설치

$ meteor add fourseven:scss

$ meteor add barbatus:typescript


typescript를 위한 @types 및 패키지 설치

$ meteor npm install --save-dev @types/meteor 

$ meteor npm install --save-dev @types/node

$ meteor npm install --save-dev @types/react

$ meteor npm install --save-dev @types/react-dom


$ meteor npm install --save-dev react-router-dom 

$ meteor npm install --save-dev typescript

$ meteor npm install --save-dev tslint

$ meteor npm install --save-dev tslint-react


root에 tsconfig.json 및 tslint.json 추가

// tsconfig.json

{

    "compilerOptions": {

        "target": "es6",

        "allowJs": true,

        "jsx": "preserve",

        "moduleResolution": "node",

        "types": [

            "node"

        ]

    }

}


// tslint.json

{

    // "extends": [

    //     "tslint:latest",

    //     "tslint-react"

    // ],

    "rules": {

        "quotemark": [

            true,

            "single",

            "jsx-double"

        ],

        "ordered-imports": false,

        "no-var-requires": false

    }

}


.css, .jsx, .js 를 .scss, .tsx, .ts 확장자로 코드는 다음과 같이 변경한다. 

// import

import React from 'react'; 

=> 

import * as React from 'react';


// import path: 절대경로를 상대경로 변경

import App from '/imports/ui/App';

=> 

import App from '../imports/ui/App';


// class Props, State 타입지정

class Info extends Component {

=> 

class Info extends React.Component<{links: any}, undefined> {


// export 

export default InfoContainer = withTracker(() => {

=>

const InfoContainer = withTracker(() => {

...

export default InfoContainer;



package.json 의 start 파일 변경

"mainModule": {

  "client": "client/main.tsx",

  "server": "server/main.ts"

}




Meteor Pub/Sub 환경 설정


필요없는 패키지 제거

$ meteor remove autopublish


imports/api/links.ts 에 publish 설정

// link.ts

if (Meteor.isServer) {

  Meteor.publish('links', () => Links.find());

}


// Info.tsx 에 react-meteor-data의 withTracker안에 subscribe 설정

export default withTracker(() => {

       const handle = Meteor.subscribe('links');

return {

links: Links.find().fetch(),

loading: !handle.ready()

}

})(Info);


두번째로 필요없는 패키지 제거

$ meteor remove insecure


deny/allow를 설정

  - allow: true로 설정된 것만 가능하고 그외는 모두 불가능하다. (가능한 것이 적으면 allow 설정)

  - deny: true로 서정된 것만 불가능하고 그외는 모두 가능하다.  (불가능한 것이 적으면 deny 설정)

// api/links.ts의 allow 설정 예

if (Meteor.isServer) {

  Meteor.publish('links', () => Links.find());

  Links.allow({

    insert (userIdstringdocany) {

      console.log('insert doc:', doc);

      return (userId && doc.owner === userId);

    },

    remove(userIdstringdocany) {

     console.log('delete doc:', doc);

      return (userId && doc.owner === userId);

    }

  });

}


사용자 로그인 및 Collection을 위한 simple schem 패키지 설치

$ meteor add accounts-password

$ meteor npm install --save bcrypt

$ meteor npm install --save simpl-schema



폴더 구조를 바꾼다. 

client

imports

  - api: collection

  - client

    - layouts: layout container unit

    - pages: panel unit

    - sdk: shared components, libs

  - startup

    - client

    - server

server




Redux 환경 설정


redux 기본 패키지 설치, react-router-redux는 react-router v4로 오면서 connected-react-router 패키지로 변경되었다. 

$ meteor npm install --save redux react-redux connected-react-router

$ meteor npm install --save-dev @types/react-redux


// typesafe-action 설치

$ meteor npm install --save typesafe-actions


// rxjs 기반 side effect 패키지인 redux-observable 설치

$ meteor npm install --save redux-observable rxjs


// state 성능 향상 reselect 설치 

$ meteor npm install --save reselect


redux-observble 환경에서의 store 생성 및 acction, reducer, epic 개발은 다음의 블로그를 참조한다. 




Elastic UI 환경 설정


먼저 final-form, react-final-form 설치

$ meteor npm install --save final-form react-final-form


styled-components, moment  패키지 설치

$ meteor npm install --save styled-components moment


elastic UI(이하 eui) 설치하기. eui는 yarn으로만 설치됨을 주의한다.

  - react-final-form의 third part component로 Eui wrapper component 개발하기는 다음 블로그를 참조한다.

$ meteor npm i -g yarn

$ meteor yarn info

yarn info v1.12.3


// 기존것 제거 하고 yarn으로 다시 설치 

$ rm -rf node_modules

$ rm package-lock.json


// package.json 내용 설치

$ meteor yarn 

meteor yarn add  @elastic/eui


client/main.tsx에 사용할 테마 css를 import 한다. 

import '@elastic/eui/dist/eui_theme_light.css';


주의할 부분은 eui를 yarn으로 설치한 후 추가 패키지를 위해 "meteor npm install <package>" 할 경우 다시 "meteor yarn" 명령을 수행해 주어야 한다. 이 문제는 eui가 yarn만을 지원하고 meteor가 yarn에 대한 지원이 미흡한데 있지 않을까 싶다. 추정일 뿐이고 누가 해결하면 알려주시면 좋겠다.


최종 meteor run 을 수행하면 로그인 화면이 나온다. 계정을 생성하고 로그인 하면 이제 Link에 대한 CRUD를 수행할 수 있다.



[Chart 추천 서비스] Voyager 기술 스택과 신규 서비스 SRS

Chart 추천 서비스

Voyager 기술 스택을 살펴보고, 새로 디자인 하려는 기술스택을 정리해 보자. 


  - Voyager 기술 스택 알기

  - 새로운 기술 스택 준비하기 




Voyager 기술 스택


기술 스택 이해를 위해 voyager의 의존성 패키지를 살펴보자. 


  - Typescript

  - React

  - React third part components: datetime, dnd, file-download, modal, spinners, split-pane, tabs, tether

  - Redux: redux-action-log, redux-thunk, redux-undo, reselect

  - common packages: moment, font-awesome

  - vega: vega-datasets, vega-expression, vega-lite, vega-tooltip, vega-typings, vega-util

  - compassql

  - webpack 빌드


React 개발시 사용하는 환경에서 개발되었음으로 알 수 있다. Voyager 설명과 사용방법은 Gitbook을 사용하고 있다. 


  - 로컬 데이터 로딩, URL입력으로 불러오기: JSON, CSV, TSV 파일형식 지원

  - 데이터 Field 자동 분류: quantitative(숫자), temporal(날짜), categorical(문자)

  - quantitative에 대해 min, max, mean등의 함수 적용

  - temporal에 대해 year, month, date, hours등의 함수 적용





Lime 기술 스택


라임은 Voyager의 기능을 흡수하고 내가 사용하고 싶은 UX 를 가미한 서비스이다. 라임은 다음의 기술 스택으로 만들어 보려한다. 


  - React + Redux

  - Meteor

  - MongoDB

  - vega-lite, compassQL


라임 서비스의 SRS(Software Requirements Specification, 소프트웨어 요구사항 명세)는 다음과 같다.


  - 데이터는 Voyager에서 지원하는 형태와 동일하다. 이후 데이터에 대한 수집, 클렌징 작업은 또 하나의 프로젝트가 될 정도의 규모이므로 여기서는 배제한다. 

  - 차트를 디자인한 후, 직접 Vega-lite의 JSON 환경설정을 에디팅 할 수 있도록 한다. 에디터는 Vega-editor를 사용한다. 

  - 원하는 차트 형태가 나왔다면 데이터와 차트 설정을 저장할 수 있다. 

  - 저장한 차트 목록에서 원하는 것을 대시보드화 할 수 있다. 즉, 차트 -> 대시보드 기능을 가진다. 

  - 각 차트와 대시보드는 다른 애플리케이션에 embedding하여 표현할 수 있다. 

  - 대시보드는 생성한 Vega차트를 표현하거나, Text, Image등의 Widget을 제공하여 사용자 정의 정적 표현을 할 수 있다. 


차트 생성


대시보드 생성


어짜피 혼자 개발하는 것이니 한장 짜리 SRS로 시작해 본다.




<참고>

- Voyager Github

- Voyager GitBook

[Chart 추천 서비스] Voyager 소개와 개념

Chart 추천 서비스

워싱턴 대학의 Interactive Lab실에서 개발한 차트 추천시스템인 Voyager를 다시 디자인하여 Chart 추천시스템을 만들어 보도록 한다. 먼저 Voyager에 대한 다음을 이해하고 가자.


  - Voyager에 대해 알아본다.

  - Voyager 아키텍쳐와  구성요소를 안다.

  - Vega, Vega-lite에 대해 안다.

  - 첨부 동영상을 통해 일반적이 Data Visualization에서 해결하고 싶은 문제에 대해 이해한다. 




Voyager 란?


워싱턴 대학의 인터렉티브 랩실은 데이터 비쥬얼라이제션 관련 연구와 오픈소스를 개발하고 있다. 이중 D3.js기반의 차트 라이브러리인 Vega 와 Vega의 경량버전인 Vega-lite를 개발하였고, 해당 차트를 기반으로 데이터특성에 따른 차트 추천서비스인 Voyager를 개발하였다. 


Voyager의 특징

  - 데이터 특성에 따른 자동 차트 추천

  - 사용자가 직접 차트 구성


즉, 자동 추천에서 인사이트를 얻지 못한다면 사용자가 직접 차트를 드래그앤드롭 방식으로 만들어 확인해 볼 수 있다. 개발자인 햄의 설명을 들어보자.


Voyager에서 보여지는 차트는 Vega-lite를 기반이며 이는 쉬운 문법을 통해 차트를 자동 생성해 준다. 또한 Vega 전용 웹 에디터를 제공하고 있어 직접 수정하며 체험해 볼 수 있다. Voyager와 에디터는 Standalone으로 로컬에 설치해 사용할 수도 있다. Voyager의 추천 핵심 엔진은 CompassQL이다. 위 동영상에 이어 좀 더 자세한 설명을 보도록 하자. 

  - Vega-lite: a Concise Grammer of Graphics

  - CompassQL: Visualization Query Language & Engine

  - Voyager 2: 

  - Altair: Python 버전 Vega 



시간이 되면 Voyager 2 관련 논문도 보자. 위 동영상에서 미래의 모습으로 

  - Natural Language Interfaces: Configuration 을 좀 더 친화적으로...?

  - Automated Design for Interactive Dashboard: 대시보드 자동생성

  - Suggestions for Plotting APIs: Configuration시 Linting 을 좀 더 잘 해주기




Voyager Architecture

위 Vega-lite 소개 동영상중에 다음 그림을 보자.
  - 사용자가 지정하고 Specification 
  - Voyager는 Vega-lite 설정을 자동으로 만들고
  - CompassQL을 통해 추천 Recommendation 스펙도 생성한다.



Voyager의 연구 소개자료를 참조하여 Voyager의 Layered 아키텍쳐 그림을 보자. 


  - layer-1: Vega-lite로 차트 제공

  - layer-2: CompassQL 로 차트 추천 엔진 배치

  - layer-3: Application인 Voyager 2 제공 (Voyager는 2015년 소개된 v1이고, Voyager 2는 2017년 소개된 v2 이다)


중간의 설명을 요약해 보면

  - 수동적인 차트 추천과 차트 추천을 보완하는 대화식 시스템을 연구한다

  - 데이터에서 추천을 (Specification and Recommendation) 위한 차트 사양을 만들기 위해 새로운 언어와 시스템을 만든다.

  - Vega-lite: 차트를 그리기 위한 문법언어

  - CompassQL: 쿼리 및 추천 엔진 (논문)

  - Voyager: Vega-lite와 CompassQL을 사용한 서비스 개발





Vega & Vega-lite

D3.js 와 Typescript 기반으로 개발되었고, Vega의 복잡한 문법을 좀 더 친화적으로 가볍게 만든 차트 문법을 제공하는 Vega-lite가 있다. Vega-lite문법으로 차트를 설정하면 최종적으로 Vega 문법으로 변환되어 차트가 그려진다. 

  - 현재 v3.0.0-rc10 활동이 활발하다

  - 테스트 해본 결과 20만건의 데이터를 그리는데 4~5초 가량 걸리고 Canvas기반으로 그려진다. 

  - Vega와 Vega-lite 기반으로 Voyager, Polestar, Altair, Lyra, Wikipidia 등에서 사용하고 있다. 



Vega-lite 소개 영상을 보도록 하자. 

  - 베가 라이트는 상호 작용하는 멀티 View 그래픽을 정의하기 위해 표현이 간결한 언어를 가지고 데이터 분석 탐색을 용이하게 하는 것이 목표이다. 

     (facilitate exploratory data analysis with an expressive yet concise language to specify interactive multi-view gaphics)

  - 즉, Single View도 있고, Multi View도 있지만, 특히 Multi View가 상호작용토록 자동으로 만들어준다. 

  - 설정에서 여러 컴포넌트를 조합할 수 있다. (selection)

  - Multi View가 상호작용하는 동작 설명 (single, project, bind, multi, interval, hover, nearest)




흥미로운 주제로 Multi Chart에 대한 Reactive System 구현에 대한 동영상과 페이퍼도 참조해 보자. 

  - Vega & Vega-lite 둘다 나옴

  - 한 컴포넌트의 Selection이 다른 컴포넌트에 영향을 주는 관계 (Interactive relation)





<참조>

- 워싱턴대의 Vage 관련 소개 페이지

- Vega 홈페이지

- Vega-lite 홈페이지

- Vega Editor

- Voyage 데모 페이지

- Altair 홈페이지

- Voyager 관련 논문 

2015-Voyager-InfoVis.pdf

2017-Voyager2-CHI.pdf

Reactive Vega Architecture Paper 

2015-ReactiveVega-InfoVis.pdf

- 햄의 Voyager 연구자료

research-statement-1.pdf

- CompassQL 논문

2016-CompassQL-HILDA.pdf