13  대시보드: 첫 번째 경계 붕괴

2020년 3월, 코로나19가 전 세계를 강타했을 때 존스 홉킨스 대학교의 한 학부생이 만든 웹사이트가 전 세계의 관심을 끌었다. 실시간으로 업데이트되는 코로나19 확진자 수, 사망자 수, 회복자 수를 한 눈에 보여주는 대시보드였다.

이 대시보드는 단순해 보였다. 지도 위에 동그라미가 그려져 있고, 숫자가 실시간으로 바뀌는 것이 전부였다. 하지만 이 “단순한” 웹페이지가 전 세계 정부와 언론이 참고하는 표준 정보원이 되었다. 문서와 애플리케이션의 경계가 흐려지는 첫 번째 신호탄이었다.

그림 13.1: 대시보드와 전통 문서의 차이점

13.1 대시보드는 문서인가, 애플리케이션인가?

13.1.1 전통적 분류의 한계

과거 우리의 디지털 분류 체계는 명확했다:

문서(Documents) - HWP, 워드 파일 - PDF, 파워포인트 - 읽기 전용 - 정적 콘텐츠

애플리케이션(Applications) - 웹사이트, 모바일 앱 - 설치 필요한 소프트웨어 - 상호작용 가능 - 동적 기능

그런데 대시보드는 어디에 속할까? - 웹 브라우저에서 열린다 → 애플리케이션? - 정보를 전달한다 → 문서? - 실시간 업데이트된다 → 애플리케이션? - 클릭하면 반응한다 → 애플리케이션?

13.1.2 마이크로소프트 엑셀의 진화로 보는 경계 붕괴

엑셀의 40년 진화사를 통해 이 혼란을 이해할 수 있다:

1985년 엑셀 1.0: 단순한 스프레드시트

| A1: 이름    | B1: 나이 | C1: 점수 |
| 김철수      | 25       | 85       |
| 이영희      | 23       | 92       |

명확히 “문서”였다. 종이 장부의 디지털 버전에 불과했다.

1993년 엑셀 5.0: VBA 매크로 추가

Sub 자동계산()
    Range("D1").Value = "평균: " & Application.Average(Range("C:C"))
End Sub

갑자기 “프로그래밍”이 가능해졌다. 문서가 코드를 실행한다?

2010년 엑셀 2010: 파워피벗과 차트 혁신

=SUMPRODUCT((월별매출[연도]=2010)*월별매출[금액])

이제 대용량 데이터를 처리하고 동적 차트를 만든다. 이건 데이터베이스 애플리케이션인가?

2023년 엑셀 365: Python 통합

# 엑셀 셀 안에서 Python 코드 실행
import pandas as pd
df = xl("A1:C100", headers=True)  # 엑셀 데이터를 pandas로
result = df.groupby('카테고리')['매출'].sum()

이제 엑셀에서 머신러닝, 웹 크롤링, API 호출까지 가능하다. 이건 완전한 개발 환경이다.

질문: 2023년의 엑셀은 여전히 “문서”인가?

13.1.3 구글 스프레드시트의 실시간 협업

구글은 한발 더 나아갔다. 스프레드시트에 실시간 협업을 도입했다:

// 구글 앱스 스크립트로 스프레드시트가 웹 애플리케이션이 됨
function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var range = e.range;
  
  // 데이터가 바뀌면 자동으로 Slack에 알림
  sendSlackNotification("데이터가 업데이트되었습니다: " + range.getValue());
  
  // 동시에 웹 대시보드도 업데이트
  updateDashboard(sheet.getDataRange().getValues());
}

이제 스프레드시트는: - 여러 사람이 동시에 편집 - 데이터 변경 시 자동으로 외부 시스템 연동 - 실시간 차트 업데이트 - 웹 API 역할까지 수행

이건 문서인가, 애플리케이션인가?

13.2 대시보드의 탄생: flexdashboard에서 Quarto까지

13.2.1 R 생태계의 혁신

R 커뮤니티에서 놀라운 일이 일어났다. 2016년 RStudio에서 발표한 flexdashboard 패키지는 R 마크다운으로 대시보드를 만들 수 있게 해주었다.

---
title: "코로나19 현황"
output: flexdashboard::flex_dashboard
---

Column {data-width=650}
-----------------------------------------------------------------------

### 확진자 현황


::: {.cell}

```{.r .cell-code}
library(plotly)
# 실제 데이터가 있을 때 사용하는 예시 코드
# p <- plot_ly(data, x = ~date, y = ~confirmed, type = 'scatter', mode = 'lines')
# ggplotly(p)

# 데모용 간단한 차트
demo_data <- data.frame(
  date = seq.Date(from = as.Date("2024-01-01"), to = as.Date("2024-12-31"), by = "month"),
  confirmed = c(100, 150, 200, 180, 220, 250, 300, 280, 350, 400, 380, 420)
)

p <- plot_ly(demo_data, x = ~date, y = ~confirmed, type = 'scatter', mode = 'lines+markers')
p

:::

13.2.2 지역별 분포

# 지역별 데이터 예시 (실제 사용시에는 실제 데이터로 대체)
map_data <- data.frame(
  lat = c(37.5665, 35.1796, 35.8722, 36.4203),
  lng = c(126.9780, 128.8706, 127.3831, 127.3845),
  confirmed = c(1500, 800, 600, 400),
  region = c("서울", "부산", "대구", "세종")
)

leaflet(map_data) %>% 
  addTiles() %>%
  addCircleMarkers(~lng, ~lat, radius = ~sqrt(confirmed/100),
                   popup = ~paste(region, ":", confirmed, "명"))

저자가 이 패키지를 처음 접했을 때의 충격은 이루 말할 수 없었다. “웹 개발자가 아닌데 대시보드를 만들 수 있다고?”

HTML, CSS, JavaScript를 전혀 몰라도 마크다운 문서를 작성하는 것만으로 전문적인 대시보드가 완성되었다. 문서 작성 방법으로 애플리케이션을 만드는 첫 번째 성공 사례였다.

13.2.3 Quarto 대시보드의 진화

2022년 Posit(구 RStudio)에서 Quarto를 발표했을 때, 대시보드 기능은 아직 없었다. 하지만 2024년 Quarto 1.4에서 대시보드 기능이 추가되면서 새로운 차원이 열렸다:

---
title: "실시간 매출 대시보드"
format: dashboard
server: shiny  # 여기가 핵심!
---

이제 Quarto 문서가: - 정적 HTML (전통적 문서) - 인터랙티브 위젯 (애플리케이션 기능)
- 실시간 서버 연동 (웹 애플리케이션) - 반응형 레이아웃 (모바일 앱)

모든 것을 동시에 지원한다. 경계가 완전히 무너진 것이다.

13.3 실전 사례: 코로나19 대시보드 만들기

archive 폴더에서 발견한 기존 코로나19 대시보드를 현대적 관점에서 재해석해보자.

13.3.1 데이터 준비

library(tidyverse)
library(coronavirus)
library(plotly)
library(DT)
library(gt)

# 코로나19 데이터 로드
data(coronavirus)
coronavirus_tbl <- coronavirus %>% 
  as_tibble() %>%
  janitor::clean_names()

# 전 세계 통계
world_summary <- coronavirus_tbl %>% 
  group_by(type) %>% 
  summarise(total = sum(cases), .groups = 'drop')

# 한국 통계  
korea_summary <- coronavirus_tbl %>%
  filter(str_detect(country, "Korea")) %>%
  group_by(type) %>% 
  summarise(total = sum(cases), .groups = 'drop')

13.3.2 ValueBox: 숫자가 살아 움직이다

기존 문서에서는 숫자가 죽어있다. “확진자: 500,000명”이라고 적으면 그게 끝이다. 하지만 대시보드에서는 숫자가 살아 있다:

confirmed_count <- world_summary %>% 
  filter(type == "confirmed") %>% 
  pull(total)

list(
  icon = "virus",
  color = "danger", 
  value = scales::comma(confirmed_count)
)

이 ValueBox는: - 아이콘으로 시각적 임팩트 제공 - 색상으로 감정적 반응 유도
- 실시간 데이터 업데이트 (서버 연결 시) - 클릭하면 상세 정보 표시 (인터랙션)

단순한 “숫자 표시”를 넘어 사용자 경험을 설계하고 있다.

13.3.3 지도 시각화: 정보가 공간과 만나다

library(leaflet)

coronavirus_tbl %>%
  filter(type == "confirmed", date == max(date)) %>%
  group_by(country, lat, long) %>%
  summarise(total_cases = sum(cases), .groups = 'drop') %>%
  leaflet() %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~long, lat = ~lat,
    radius = ~sqrt(total_cases/10000),
    popup = ~paste0("<b>", country, "</b><br>", 
                   "확진자: ", scales::comma(total_cases)),
    fillOpacity = 0.7,
    color = "red"
  )

이 지도는 문서인가, 애플리케이션인가? - 확대/축소/이동 가능 → 애플리케이션 - 정보를 전달 → 문서
- 마커 클릭 시 팝업 → 애플리케이션 - 브라우저에서 실행 → 애플리케이션 - 마크다운으로 작성 → 문서

답: 더 이상 구분이 무의미하다.

13.4 한국 사례: 정부 대시보드의 진화

13.4.1 질병관리청의 변신

2020년 초 질병관리청의 코로나19 브리핑을 기억하는가? 담당자가 PPT 슬라이드를 넘겨가며 어제 확진자 수, 지역별 분포를 발표했다. 전형적인 “발표용 문서”였다.

하지만 몇 달 후 질병관리청 웹사이트에는 실시간 업데이트되는 대시보드가 나타났다: - 실시간 확진자 수 업데이트 - 지역별 인터랙티브 지도 - 연령대별 현황 차트 - 백신 접종 현황 추적

같은 정보를 전달하지만, 사용자 경험은 하늘과 땅 차이였다.

13.4.2 선거관리위원회의 개표 시스템

대한민국 선거관리위원회의 개표 시스템은 세계적 수준이다: - 실시간 개표 결과 업데이트 - 시/도/구/동 단위 드릴다운 - 모바일 최적화된 반응형 디자인 - API로 언론사에 데이터 제공

이 시스템이 “문서”인가 “애플리케이션”인가를 묻는 것은 이제 의미가 없다. 중요한 것은 정보를 얼마나 효과적으로 전달하느냐이다.

13.5 기업에서의 활용: 보고서의 종말?

13.5.1 전통적 보고서 vs 대시보드

전통적 월간 매출 보고서:

제목: 2024년 10월 매출 현황
작성자: 김분석
작성일: 2024.11.05

요약:
- 총 매출: 1,250,000,000원
- 전월 대비: +15.2%
- 주요 성장 동력: 모바일 앱 매출 증가

[그래프 이미지 첨부]

대시보드 버전:

# 실시간 데이터 연결
sales_data <- read_db("SELECT * FROM sales WHERE date >= '2024-10-01'")

# ValueBox: 핵심 지표
list(
  value = scales::comma(sum(sales_data$amount)),
  title = "이번 달 매출",
  icon = "currency-dollar",
  color = if_else(growth_rate > 0, "success", "danger")
)

# 인터랙티브 차트
plot_ly(sales_data, x = ~date, y = ~amount, type = 'scatter', mode = 'lines') %>%
  layout(title = "일별 매출 추이")

# 필터링 가능한 표
DT::datatable(sales_data, filter = 'top', options = list(pageLength = 25))

차이점: - 정적 vs 동적 - 월 1회 vs 실시간 - 읽기 전용 vs 탐색 가능 - 파일 첨부 vs URL 공유

13.5.2 결정자의 관점 변화

CEO의 하루 일과를 상상해보자.

2020년: 1. 비서가 준비한 종이 보고서 검토 (30분) 2. 궁금한 점이 생기면 담당자에게 추가 자료 요청 3. 답변 받기까지 2-3일 대기 4. 다시 종이로 받아서 검토

2024년: 1. 태블릿으로 실시간 대시보드 접속 (3분) 2. 궁금한 부분을 직접 클릭해서 드릴다운 3. 즉석에서 다양한 각도로 데이터 분석 4. 인사이트 발견 시 팀과 즉시 공유

어느 쪽이 더 효율적인가? 답은 명확하다.

13.6 기술적 진화: 노코드/로우코드의 부상

13.6.1 Notion의 혁신

Notion은 “문서 작성 도구”로 시작했다. 하지만 지금은: - 데이터베이스 기능 - 칸반 보드 (프로젝트 관리) - 갠트 차트 (일정 관리) - API 연동 (외부 시스템과 통합) - AI 어시스턴트 (자동 콘텐츠 생성)

사용자들은 Notion 페이지를 “문서”라고 부르지만, 실제로는 멀티 기능 애플리케이션을 만들고 있다.

13.6.2 Airtable의 스프레드시트 재정의

Airtable은 “스프레드시트”와 “데이터베이스”의 경계를 흐렸다: - 엑셀처럼 직관적인 인터페이스 - 데이터베이스급 관계형 데이터 처리 - 자동화 워크플로우 (Zapier 통합) - API 제공 (다른 앱에서 데이터 활용)

Airtable 시트는 문서인가, 데이터베이스인가?

13.6.3 Streamlit의 게임 체인저

Python 개발자들에게 Streamlit은 혁명이었다:

import streamlit as st
import pandas as pd
import plotly.express as px

# 이게 전부다!
st.title("매출 분석 대시보드")

data = pd.read_csv("sales.csv")
selected_month = st.selectbox("월 선택", data['month'].unique())

filtered_data = data[data['month'] == selected_month]
fig = px.bar(filtered_data, x='product', y='sales')
st.plotly_chart(fig)

30줄의 Python 코드로 완전한 웹 애플리케이션이 만들어진다. 더 이상 HTML, CSS, JavaScript를 배울 필요가 없다.

13.7 미래 전망: 대시보드를 넘어서

13.7.1 AI 대시보드의 등장

2024년 현재 실험 중인 기술들:

자연어 쿼리:

사용자: "작년 대비 매출이 가장 많이 증가한 제품은?"
AI 대시보드: [자동으로 데이터 분석 후 차트 생성]
       "모바일 액세서리가 147% 증가했습니다. 
        주요 요인은 신제품 출시와 마케팅 캠페인 효과입니다."

자동 인사이트 생성:

AI: "이번 주 데이터에서 비정상적인 패턴을 발견했습니다.
     화요일 오후 2시에 특정 지역에서 주문이 급증했는데,
     이는 현지 방송 프로그램 영향으로 보입니다."

13.7.2 대화형 문서의 시대

Google의 NotebookLM, Anthropic의 Claude Artifacts가 보여주는 미래:

# 2025년 분기 보고서

AI 어시스턴트가 이 보고서와 대화할 수 있습니다.

질문: "경쟁사 대비 우리 성과는?"
AI: [실시간 데이터 분석] "시장 점유율이 2.3% 상승했습니다..."

질문: "다음 분기 전략은?"  
AI: [예측 모델 실행] "현재 트렌드를 보면..."

문서가 사용자와 대화하기 시작했다.

13.8 결론: 경계 붕괴는 기회다

대시보드의 등장은 문서와 애플리케이션 경계 붕괴의 시작점이었다. 하지만 이는 혼란이 아니라 새로운 가능성의 출발점이다.

13.8.1 한국의 기회

한국은 이 변화에 특별한 위치에 있다: - 정부 주도: 공공 데이터 개방, 디지털 정부 구축 - 높은 디지털 리터러시: 세계 최고 수준의 디지털 인프라 - HWP 전환: 기존 시스템의 한계가 오히려 혁신 동력

13.8.2 실무진을 위한 조언

  1. 점진적 전환: HWP → Quarto 대시보드 → AI 대시보드
  2. 도구 학습: Excel 고급 기능 → Power BI → Quarto/Shiny
  3. 사고 전환: “보고서를 쓴다” → “경험을 설계한다”

다음 장에서는 대시보드를 넘어 완전한 반응형 문서와 실시간 컴퓨팅의 세계를 탐험해보겠다.

노트실습: 나만의 대시보드 만들기

이 장에서 다룬 코로나19 대시보드 코드는 dashboards/ 폴더에서 확인할 수 있습니다.

  1. dashboards/index.qmd 파일 열기
  2. 터미널에서 quarto preview 실행
  3. 브라우저에서 실시간 대시보드 확인

여러분만의 데이터로 대시보드를 만들어보세요!

힌트토론: 문서 vs 애플리케이션

여러분이 자주 사용하는 도구들을 생각해보세요: - 구글 독스 - 노션
- 피그마 - 캔바

이들은 문서 도구인가요, 애플리케이션인가요? 경계가 모호한 이유는 무엇일까요?