타다 (TADA) 서비스의 데이터 웨어하우스
- 태초부터 현재까지 -
이창현 (Max)
2019.10.19 데이터야 놀자
Slide 2
Slide 2 text
● 데이터 엔지니어 @ VCNC
● 서버 개발자 9개월 + 데이터 엔지니어 2년 5개월
● 궁금한 것들 찾아보고 개발 블로그에 적는 걸 좋아함
● 산업기능요원 복무 완료한 지 1개월
발표자 소개
2019.10.19 데이터야 놀자
Slide 3
Slide 3 text
● 타다 (TADA) 서버 최초 커밋
○ 회의 때 노트북을 잘 챙겨가면, 두고두고 우려먹을 껀덕지가 생김
TMI
2019.10.19 데이터야 놀자
Slide 4
Slide 4 text
VCNC
● Value Creators & Company
2019.10.19 데이터야 놀자
Slide 5
Slide 5 text
타다 (TADA)
● 새로운 이동의 기준을 제시하는 모빌리티 플랫폼
● 2019년 10월 8일 : 타다 베이직 런칭 1주년
2019.10.19 데이터야 놀자
Slide 6
Slide 6 text
오늘 나눌 이야기
● 런칭 후 ~ 약 1년간 데이터 웨어하우스 변천사 (+ 배운 것들)
현재
인수 런칭 직후 과도기
(아쉬운 점) (아쉬운 점)
2019.10.19 데이터야 놀자
Slide 7
Slide 7 text
오늘 나눌 이야기
● 이런 분들께 도움이 되었으면
○ 데이터 웨어하우스가 무엇인지 궁금하신 분들
○ 데이터 웨어하우스를 구성 할 / 구성 중이신 분들
2019.10.19 데이터야 놀자
Slide 8
Slide 8 text
런칭 직후
2019.10.19 데이터야 놀자
Slide 9
Slide 9 text
약간의 배경 설명
Icon made by Chanut from www.flaticon.com
4명
2019.10.19 데이터야 놀자
Slide 10
Slide 10 text
약간의 배경 설명
Icon made by Freepik from www.flaticon.com
4명 -> 1명
2019.10.19 데이터야 놀자
Slide 11
Slide 11 text
약간의 배경 설명
Icon made by Freepik from www.flaticon.com
4명 -> 1명 = 발표자
2019.10.19 데이터야 놀자
Slide 12
Slide 12 text
신규 서비스
● 데이터를 어떻게 조회할 지 + 조회하게 만들 지 고민
2019.10.19 데이터야 놀자
Slide 13
Slide 13 text
기쁜 소식 : 서버 DB 로 Aurora MySQL 선택
● RDBMS 라서 직접 SQL 가능 (비트윈은 메인 DB 로 HBase)
● Amazon Aurora 라서 Read Replica 띄우는게 간단
● Read Replica 띄우고 Holistics 연결
2019.10.19 데이터야 놀자
Slide 14
Slide 14 text
Holistics?
● 유료 BI (Business Intelligence) 서비스
● 여러가지 기능 제공 -> (약간의) 돈으로 엔지니어의 시간을 교환!
광고 X
2019.10.19 데이터야 놀자
Slide 15
Slide 15 text
BI 서비스 : Holistics 를 예시로
● 다양한 데이터 소스 연결
○ 데이터 소스 마다 적합한 연결 방식 제공 (e.g. VPC 내의 RDBMS -> SSH Reverse Tunneling)
https://www.holistics.io/integrations/
광고 X
2019.10.19 데이터야 놀자
Slide 16
Slide 16 text
BI 서비스 : Holistics 를 예시로
● 다이나믹 필터
○ SQL 적고 구멍 뚫어두면 -> 이후 대시보드 조회하는 유저가 원하는 값으로 SQL Formatting
https://docs.holistics.io/docs/filters
광고 X
2019.10.19 데이터야 놀자
Slide 17
Slide 17 text
BI 서비스 : Holistics 를 예시로
● 브라우저에서 UI 설정만으로 쿼리 결과를 다양하게 시각화
○ Pivot Table, Line Chart, Combination Chart, Cohort Retention ...
광고 X
2019.10.19 데이터야 놀자
Slide 18
Slide 18 text
BI 서비스 : Holistics 를 예시로
● 원하는 스케줄 / 방식으로 데이터 추출 및 전달
○ 이메일, 슬랙, 구글 시트 (직접 Sheets API 써서 개발하려면 은근 번거로움), SFTP
○ e.g. 구글 시트로 Raw 데이터 추출 -> (구글 시트만 쓸 줄 알면) 원하는 형태로 대시보드 제작
광고 X
2019.10.19 데이터야 놀자
Slide 19
Slide 19 text
다양한 솔루션
https://www.softwareadvice.com/bi/#top-products
Apache Superset
● (유료 제품) Mode Analytics, Chartio, Periscope Data, Holistics 등
● (오픈소스) Apache Superset, Redash 등
● 필요와 상황에 따라 적절히 선택
2019.10.19 데이터야 놀자
Slide 20
Slide 20 text
Read Replica
● 분석 Workload 분리
2019.10.19 데이터야 놀자 https://techblog.timers-inc.com/entry/2016/03/02/135607
Slide 21
Slide 21 text
Read Replica
● Console 에서 클릭 몇 번으로 Read Replica 생성
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-replicas-adding.html
. . .
2019.10.19 데이터야 놀자
Slide 22
Slide 22 text
Read Replica
● (Holistics 가 제공하는) SSH Reverse Tunneling 스크립트만 실행 하면 -> 설정 끝!
https://docs.holistics.io/docs/tunnel-setup
2019.10.19 데이터야 놀자
Slide 23
Slide 23 text
● 기존 테이블 -> SQL -> 새로운 테이블 추가하기 힘듦
○ 새로운 테이블 -> Read Replica 가 아닌 Master 에 + Read 가 아닌 Write 권한 필요
○ Master 의 schema 변경 -> 서버 배포 파이프라인 중 일부 (Liquibase 로 관리)
○ 서버 개발 프로세스에 엮이기보다, 독립적으로 진행하고 싶은 마음
■ 서버 개발 = 핵심 비즈니스 로직 / 협업 / 신중한 배포
■ 분석은 이와는 별개의 작업
런칭 직후 : 아쉬운 점
2019.10.19 데이터야 놀자
Slide 24
Slide 24 text
런칭 직후 : 아쉬운 점
● SQL 표현력이 아쉬움
○ Aurora MySQL 2.x (2.04.6 이 최신) ~ MySQL 5.7 Compatible
○ Analytic Function 은 MySQL 8.0.2 부터 지원
■ e.g. 유저의 직전 호출 시각 -> Analytic Function 이 없다면 힘듦 어찌 저찌 할 수는 있음
○ Array, Struct 타입도 지원하지 않음
■ e.g. 유저의 리뷰 항목들
2019.10.19 데이터야 놀자
Slide 25
Slide 25 text
런칭 직후 : 아쉬운 점
● 여러 데이터 소스 JOIN 할 수 없음
○ 용도에 따라 분리한 서버 DB 2개 + S3 에 쌓이는 JSON 로그
○ 각각을 BI 서비스에 연동하는 건 가능하지만, 그들을 JOIN 하는건 불가능
2019.10.19 데이터야 놀자
Slide 26
Slide 26 text
런칭 직후 : 정리
● Amazon Aurora (MySQL) Read Replica (+ Holistics)
○ 코드 1줄 없이 설정 + SQL 만으로 빠르게 리포트 / 대시보드 생성 가능
○ 새로운 테이블 추가 힘듦, SQL 표현력 아쉬움, 여러 데이터 소스 JOIN 불가능
○ 아직 데이터 웨어하우스는 아님
● 리포트 / 대시보드 작업
2019.10.19 데이터야 놀자 Icon made by Freepik from www.flaticon.com
Slide 27
Slide 27 text
● 다양한 리포트 / 대시보드 작업을 혼자서 처리하기 위한 최선의 선택
런칭 직후 : 정리
2019.10.19 데이터야 놀자
Slide 28
Slide 28 text
과도기
2019.10.19 데이터야 놀자
Slide 29
Slide 29 text
데이터 웨어하우스 (Data Warehouse)
2019.10.19 데이터야 놀자 https://addepto.com/implement-data-warehouse-business-intelligence/
Slide 30
Slide 30 text
데이터를 한 곳으로
● 별도의 RDBMS 를 띄우고 -> Spark 로 데이터를 모으고 -> BI 서비스에 연결
2019.10.19 데이터야 놀자
Slide 31
Slide 31 text
Apache Spark
● Uniform Data Access
○ CSV / JSON / Parquet / JDBC 등 다양한 데이터 소스를 거의 똑같이 생긴 API 로 Read / Write
2019.10.19 데이터야 놀자 https://databricks.com/spark/about
● 팀에서 예전부터 쓰고 있었음
Apache Spark
http://engineering.vcnc.co.kr/
2019.10.19 데이터야 놀자
Slide 34
Slide 34 text
MySQL 8 / PostgreSQL 10
● Amazon RDS
○ 역시나 매니지드 서비스 -> 쉽게 데이터베이스 띄울 수 있음
2019.10.19 데이터야 놀자
Slide 35
Slide 35 text
MySQL 8 / PostgreSQL 10
● 처음에 MySQL 8 쓰다가 -> PostgreSQL 10 로 이동
○ MySQL 8.0.11 에서 TEXT 타입으로 partition by 했을 때 틀린 결과가 나온 경험 (TEXT -> CHAR 하면 됨)
○ PostgreSQL 은 Array, Composite 타입 제공
○ date_trunc 함수 등 소소하지만 분석에 도움이 되는 기능들이 많음
2019.10.19 데이터야 놀자
Slide 36
Slide 36 text
Spark 로 RDBMS UPSERT
● Spark 로 Write 할 때는 Append / Overwrite 만 가능
2019.10.19 데이터야 놀자
Slide 37
Slide 37 text
Spark 로 RDBMS UPSERT
● 원하는건 UPSERT
○ 기존 테이블에 해당 Primary Key 의 record 가 없으면 -> INSERT
○ 기존 테이블에 해당 Primary Key 의 record 가 존재하면 -> UPDATE
● 여러가지 방법이 가능
○ Dataset#foreachPartition 으로 뭉치 단위로 INSERT
○ 적절한 단위로 (Partition) Read -> 임시 테이블로 Write -> UPSERT SQL 실행 -> 임시 테이블 Drop
2019.10.19 데이터야 놀자
Slide 38
Slide 38 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
서버 DB 데이터 웨어하우스
2019.10.19 데이터야 놀자
Slide 39
Slide 39 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
서버 DB 데이터 웨어하우스 임시 테이블
spark application 에서 df.write.jdbc(...)
2019.10.19 데이터야 놀자
Slide 40
Slide 40 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
서버 DB 데이터 웨어하우스 임시 테이블
DBMS 에서 insert … on duplicate ...
2019.10.19 데이터야 놀자
Slide 41
Slide 41 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
서버 DB 데이터 웨어하우스
DBMS 에서 drop table ...
2019.10.19 데이터야 놀자
Slide 42
Slide 42 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
서버 DB 데이터 웨어하우스
배치 (Batch) 실행 사이
시간 동안 데이터 변화
2019.10.19 데이터야 놀자
Slide 43
Slide 43 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
서버 DB 데이터 웨어하우스 임시 테이블
spark application 에서 df.write.jdbc(...)
2019.10.19 데이터야 놀자
Slide 44
Slide 44 text
● 임시 테이블 Write -> 기존 테이블에 UPSERT
update
insert
Spark 로 RDBMS UPSERT
서버 DB 데이터 웨어하우스 임시 테이블
DBMS 에서 insert … on duplicate ...
2019.10.19 데이터야 놀자
Slide 45
Slide 45 text
● 임시 테이블 Write -> 기존 테이블에 UPSERT
Spark 로 RDBMS UPSERT
서버 DB 데이터 웨어하우스
DBMS 에서 drop table ...
2019.10.19 데이터야 놀자
Slide 46
Slide 46 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
○ DataFrame 의 schema 정보를 써서 UPSERT SQL 생성
○ MySQL / PostgreSQL 이 크게 다르지 않음
MySQL
PostgreSQL
2019.10.19 데이터야 놀자
Slide 47
Slide 47 text
Spark 로 RDBMS UPSERT
● 임시 테이블 Write -> 기존 테이블에 UPSERT
○ 작업이 멱등적이라 좋음
2019.10.19 데이터야 놀자
Slide 48
Slide 48 text
Spark 로 RDBMS UPSERT
● 적절한 단위 (Partition) 에 대한 고민
○ 테이블의 TIMESTAMP 타입 컬럼의 값과 비즈니스 로직을 적절히 활용
○ Partition 나누는 기준 = record 의 insert 시각
○ 비즈니스 로직을 고려하여 -> Partition 에 더 이상의 변화가 없을 때 까지 UPSERT
● e.g. 유저의 호출이 하나의 record 로 쌓이는 ride 테이블
○ 호출 시각 (created_at) 기준으로 Partitioning
○ 상태 (status) 컬럼 값이 DROPPED_OFF (하차) 혹은 CANCELED (취소) 가 될 때 까지 UPSERT
● 관련하여 생각을 정리한 개인 블로그 포스트
2019.10.19 데이터야 놀자
Slide 49
Slide 49 text
로그 수집
● Kinesis Data Firehose
○ 코드 없이 AWS Console 설정만으로 Kinesis Data Stream -> S3
https://speakerdeck.com/vcnc/eksreul-hwalyonghan-tada-seobiseu-gucuggi?slide=25
2019.10.19 데이터야 놀자
Slide 50
Slide 50 text
로그 수집
● Kinesis Data Firehose
○ Kinesis Data Stream 선택
○ Record transform : X (서버 -> Kinesis Data Stream 으로 넣은 ndjson 그대로)
○ Record format conversion : X (서버 -> Kinesis Data Stream 으로 넣은 ndjson 그대로)
○ Destination : Amazon S3 / Amazon Redshift / Amazon Elasticsearch Service / Splunk
○ Buffer size / Buffer interval : 둘 중 어느 하나 먼저 만족되면 -> S3 에 새로운 JSON 파일 Put
○ 일단 쌓고 나중에 생각
● 필요하다면 transform, format conversion 가능
○ 데이터 전처리 / Format 변환 (e.g. Kinesis Data Stream 에는 JSON -> S3 에는 Parquet 로)
2019.10.19 데이터야 놀자
Slide 51
Slide 51 text
과도기 : 아쉬운 점
● 탄력적인 Scale-In / Out 이 힘듦
○ 퇴근 시간 지나면 사용률이 현저히 낮아짐
○ 가끔 매우 큰 데이터를 처리하는 쿼리 실행 필요 e.g. 6개월치 차량 위치 데이터로 이동거리 패턴 분석
○ RDBMS 라는 특성상 Scale-In / Out 이 어려움
2019.10.19 데이터야 놀자
Slide 52
Slide 52 text
과도기 : 정리
● 데이터 웨어하우스로 Amazon RDS
○ 여러 소스의 데이터를 한 곳으로 모으면서 -> JOIN 가능
○ 개선된 SQL 표현력
○ 서버와 별도의 데이터베이스 -> 새로운 테이블 추가가 용이
○ 리소스 관리가 힘듦
● 리포트 / 대시보드 작업
. . . . . . .
2019.10.19 데이터야 놀자 Icon made by Freepik from www.flaticon.com
RDBMS -> 매니지드 (Managed) 데이터 웨어하우스
● 고려했던 친구들
○ Presto (EMR Cluster 가 도와주지만 일단 운영이 필요하긴 함)
○ Amazon Redshift (scale in/out 하려면 명시적인 resize 작업 필요)
○ Amazon Athena
○ Google BigQuery
2019.10.19 데이터야 놀자
Slide 57
Slide 57 text
RDBMS -> 매니지드 (Managed) 데이터 웨어하우스
● Amazon Athena 도전
○ 서버 로그는 단일 data class 라서 근본적으로 STRUCT : 비즈니스 로직 추가 -> 컬럼 추가 발생 가능
○ (Athena 의 기반이 되는) Presto 0.172 버전은 STRUCT 타입의 schema update 를 허용하지 않음
2019.10.19 데이터야 놀자
Slide 58
Slide 58 text
RDBMS -> 매니지드 (Managed) 데이터 웨어하우스
● Amazon Athena 도전
○ schema 관리는 Glue Data Catalog 사용 권장 -> 테이블 / 파티션 schema 각각 관리 필요
○ Crawler 를 쓸 수도 있지만 -> 단순히 schema 업데이트를 위해 쓰기에는 과하다는 생각
2019.10.19 데이터야 놀자
Slide 59
Slide 59 text
RDBMS -> 매니지드 (Managed) 데이터 웨어하우스
● Amazon Athena 도전
○ Console 기능이 아쉬움
○ e.g. SQL 을 실행해야지만 처리되는 데이터 크기를 (= 과금 기준) 알 수 있음
2019.10.19 데이터야 놀자
Google BigQuery
● BigQuery is a serverless, highly-scalable, and cost-effective cloud data
warehouse with an in-memory BI Engine and machine learning built in.
2019.10.19 데이터야 놀자
Slide 62
Slide 62 text
인프라 관리 X
● Google 이 해줌
2019.10.19 데이터야 놀자
Slide 63
Slide 63 text
높은 확장성 (highly-scalable)
● e.g. 차량 궤적 데이터 처리
○ 아래 SQL -> 수백 GB / 수백억 records 처리
2019.10.19 데이터야 놀자
Slide 64
Slide 64 text
높은 확장성 (highly-scalable)
● 쿼리 실행 -> Execution details
짧은 소요 시간 x 수백배의 컴퓨팅 (?) 시간
2019.10.19 데이터야 놀자
Slide 65
Slide 65 text
높은 확장성 (highly-scalable)
● Classical UI 로 보면 좀 더 많은 정보
○ console.cloud.google.com 에서 console -> bigquery 로 수정
○ 최대 수천 units
2019.10.19 데이터야 놀자
Slide 66
Slide 66 text
저장+쿼리한 만큼 과금
● 스토리지 + 쿼리 처리량 만큼 과금 (Amazon Athena 도 비슷)
● Amazon RDS 때는 인스턴스 타입 시간당 가격 x 시간으로 과금
2019.10.19 데이터야 놀자
Slide 67
Slide 67 text
Partitioned Table
● DATE or TIMESTAMP 타입 컬럼에 대한 Partitioning 제공
○ TIMESTAMP 타입 컬럼으로 Partitioning 해도 -> 실제 Partitioning 은 UTC 기준 DATE 단위로
○ (국내 서비스니까) Asia/Seoul 기준 DATE 컬럼을 달고 (= date_kr) 그 컬럼으로 Partitioning
○ SQL 성능 UP + Partition 단위로 데이터 Load 할 수 있어 배치 (Batch) 작업에 편리
2019-10-19
...
2019-10-01
...
2019-01-01
where
date(created_at, ‘Asia/Seoul’) = ‘2019-10-01’
2019-10-19
...
2019-10-01
...
2019-01-01
where
date_kr = ‘2019-10-01’
2019.10.19 데이터야 놀자
Slide 68
Slide 68 text
Partitioned Table
● Amazon RDS 시절 Spark 로 데이터 옮길 때도 이미 Partition 단위로 처리
○ 본래 Spark Application 의 코드 패턴과 거의 유사 : Partition UPSERT 대신 Partition 교체
○ 작은 테이블 (처리 시간 10분 미만) -> 매번 전체 테이블 Overwrite
○ 큰 테이블 -> Date Partitioned 테이블로 만들고 Partition 단위로 교체
2019.10.19 데이터야 놀자
Slide 69
Slide 69 text
BigQuery 의 장점과 사용법에 대해 더 궁금하시다면…!
https://www.slideshare.net/zzsza/bigquery-147073606
2019.10.19 데이터야 놀자
Slide 70
Slide 70 text
현재 : 정리
● Google BigQuery 로 이전
○ 매니지드 데이터 웨어하우스 -> 인프라 관리 비용 ZERO
○ 높은 확장성 + 강력한 SQL 표현력 + 편리한 Console -> 더 많은 팀원들의 + 더 많은 데이터 분석
○ + Firebase Analytics SDK 으로 찍는 라이더 앱 / 드라이버 앱 로그는 자동으로 BigQuery 에 쌓임
● 리포트 / 대시보드 작업
. . . . . . .
2019.10.19 데이터야 놀자 Icon made by Freepik from www.flaticon.com
Slide 71
Slide 71 text
현재 : 아키텍처
데이터 분석가
w/ Scheduled Queries
w/ Cloud Composer
2019.10.19 데이터야 놀자
Slide 72
Slide 72 text
결론
2019.10.19 데이터야 놀자
Slide 73
Slide 73 text
SQL 로 원하는 데이터 조회 가능
● SQL 모르는 개발자 외 팀원들은?
Slide 74
Slide 74 text
Feat. 데이터 부트캠프 (= SQL 세션)
2019.10.19 데이터야 놀자
Slide 75
Slide 75 text
분석 쿼리 유저
1~2
5~10
49
런칭
직후
과도기
현재
(2019.10.01 ~ )
2019.10.19 데이터야 놀자
Slide 76
Slide 76 text
240개 / 380일 ~ 0.6개 / 일
140개 / 120일 ~ 1.2개 / 일
리포트 / 대시보드
(BigQuery 이전 후)
2019.10.19 데이터야 놀자
Slide 77
Slide 77 text
좋은 데이터 웨어하우스 (+ SQL 활용력)
● 데이터-드리븐 (Data-Driven) 팀으로 나아가는데 있어 중요한 역할을 하는 듯
2019.10.19 데이터야 놀자
Slide 78
Slide 78 text
데이터 엔지니어로서 느낀 점
● 좋은 데이터 웨어하우스?
○ 팀이 풀고자 하는 미션 + 처한 상황에 따라 선택은 달라질 것
■ e.g. Cloud Storage / BigQuery 면 스토리지 비용 2배? AWS -> GCP 데이터 옮기는거 별론데?
○ Google BigQuery -> 현재 저희 상황에 적합할 뿐
○ 다른 상황 / 다른 팀 -> 더 좋은 다른 데이터 웨어하우스가 있을 지도
2019.10.19 데이터야 놀자
Slide 79
Slide 79 text
데이터 엔지니어로서 느낀 점
● 다양한 환경의 가능한 데이터 웨어하우스들의 장단점 파악하는 능력 중요 + 필요
○ AWS -> Amazon Redshift, Amazon Athena, Amazon Aurora Serverless 등
○ Azure -> SQL Data Warehouse 등
○ GCP -> Google BigQuery 등
○ On-Premise 혹은 매니지드 서비스 원치 않음 -> Presto, Apache Druid 등
○ 그 외의 다양한 선택지들
2019.10.19 데이터야 놀자
Slide 80
Slide 80 text
● 개인적 아쉬움
○ 다양한 선택지들을 미리 파악하고 있었더라면
○ 돌이켜보니 길었던 과도기 -> 이전한 뒤 100여개 리포트 / 대시보드 SQL 도 이전
○ 그래도 일련의 시행 착오가 성장에는 큰 도움이 하핫
데이터 엔지니어로서 느낀 점
2019.10.19 데이터야 놀자
Slide 81
Slide 81 text
결론
● 좋은 데이터 웨어하우스 -> 데이터 드리븐 팀으로 나아가는데 큰 역할
● 데이터 엔지니어 -> 좋은 데이터 웨어하우스에 대해 끊임없이 고민 + 탐색
2019.10.19 데이터야 놀자
Slide 82
Slide 82 text
그리고
2019.10.19 데이터야 놀자
Slide 83
Slide 83 text
We Are Hiring
● 힘들지만 재밌게 문제를 해결하고 있고, 문제 -> 시도 -> 해결 -> 성장 -> 문제 -> 시도 -> 해결 -> 성장 -> ...
● 팀도 커졌고,
● 앞으로 풀 재밌는 문제들도 많으니, 배치 작업 고도화, 스트리밍 아키텍처 고민, 시뮬레이터, MLOps ...
● 함께하실 분들은 -> 타다 채용
● tadacareer.vcnc.co.kr
● [email protected]
광고 O
2019.10.19 데이터야 놀자
Slide 84
Slide 84 text
Thanks to
발표자 지원 + 발표 준비에 큰 도움을 주신 SOCAR 변성윤님 (a.k.a @zzsza)
2019.10.19 데이터야 놀자