DB 기반 R 샤이니앱 시각화 – DB 활용 이유부터 실전 코드까지

데이터를 분석하고 시각화하는 과정에서 항상 최신 데이터를 반영하는 것이 중요합니다. 하지만 CSV 파일을 매번 업데이트하는 건 번거롭고, 코드 실행할 때마다 데이터를 새로 로드하는 것도 비효율적이죠. 😫
이럴 때 데이터베이스 활용이 좋을까요? DB 기반 R 샤이니앱 시각화를 사용하면 데이터를 효율적으로 저장하고, R Shiny 앱에서 불러와 시각화할 수 있습니다! 🎉
오늘은 SQLite를 활용해 5년치 데이터를 생성하고, 이를 Shiny 앱에서 불러와 시각화하는 과정을 단계별로 살펴보겠습니다. 물론! 실제 코드를 포함하여 친절하게 설명할 예정이니 끝까지 함께해 주세요. 😉
🔥 DB 활용 이유: 왜 CSV가 아닌 DB를 써야 할까?
CSV와 데이터베이스(DB)를 비교해 보면 차이가 명확해집니다.
비교 항목 | CSV 파일 | 데이터베이스(DB) |
---|---|---|
데이터 저장 | 파일로 저장 | 테이블 형태로 저장 |
데이터 업데이트 | 수동으로 파일 수정 | SQL 쿼리로 쉽게 수정 |
다중 사용자 접근 | 어려움 | 가능 (Shiny, 웹앱 활용) |
속도 | 느림 (파일 로드 필요) | 빠름 (SQL 쿼리 활용) |
위 비교에서 보듯이, Shiny 앱과 같은 동적 웹 애플리케이션을 만들 때 DB를 활용하면 훨씬 효율적입니다!
🚀 [실전] R Shiny 앱에서 데이터베이스 활용 시각화 구현하기
1️⃣ SQLite DB에 데이터 저장하기
먼저, 5년치 (2020~2024년) 매출 데이터를 랜덤 생성하여 SQLite에 저장하는 코드를 작성해 보겠습니다.
# 패키지 로드
library(DBI)
library(RSQLite)
# SQLite DB 연결
conn <- dbConnect(RSQLite::SQLite(), "sales_data.sqlite")
# 데이터 생성
set.seed(123)
years <- rep(2020:2024, each = 12)
months <- rep(1:12, times = 5)
sales <- sample(100:500, 60, replace = TRUE) + (years - 2020) * 20 # 연도별 증가 반영
sales_data <- data.frame(year = years, month = months, sales = sales)
# 기존 테이블 삭제 후 저장
dbExecute(conn, "DROP TABLE IF EXISTS sales")
dbWriteTable(conn, "sales", sales_data, overwrite = TRUE, row.names = FALSE)
# DB 연결 해제
dbDisconnect(conn)
📝 코드 해설
- SQLite 데이터베이스 연결:
dbConnect()
를 사용하여 DB 파일을 생성 및 연결합니다. - 랜덤 데이터 생성:
years
,months
,sales
데이터를 만들어 5년치 데이터를 생성합니다. - DB에 저장: 기존 테이블을 삭제한 후
dbWriteTable()
로 데이터를 저장합니다. - DB 연결 해제:
dbDisconnect()
를 호출하여 연결을 종료합니다.
2️⃣ Shiny 앱에서 DB 데이터를 불러와 시각화하기
이제 Shiny 앱을 통해 SQLite에서 데이터를 불러와 ggplot2로 시각화하는 과정을 살펴보겠습니다. 🔥
library(shiny)
library(DBI)
library(RSQLite)
library(ggplot2)
# UI 정의
ui <- fluidPage(
titlePanel("📊 DB 기반 R 샤이니앱 시각화"),
sidebarLayout(
sidebarPanel(selectInput("year", "연도 선택:", choices = 2020:2024, selected = 2024)),
mainPanel(plotOutput("salesPlot"))
)
)
# 서버 로직
tserver <- function(input, output) {
conn <- dbConnect(RSQLite::SQLite(), "sales_data.sqlite")
sales_data_reactive <- reactive({
query <- paste0("SELECT * FROM sales WHERE year = ", input$year)
dbGetQuery(conn, query)
})
output$salesPlot <- renderPlot({
df <- sales_data_reactive()
ggplot(df, aes(x = month, y = sales)) +
geom_line(color = "blue") +
geom_point(color = "red") +
geom_smooth(method = "lm", formula = y ~ poly(x, 2), color = "darkred", linetype = "dashed") +
theme_minimal()
})
onStop(function() { dbDisconnect(conn) })
}
shinyApp(ui, server)
📝 코드 해설
- 사용자가 연도를 선택할 수 있도록 UI 구성 (
selectInput()
사용) - Shiny 서버에서 DB 연결 후 해당 연도의 데이터 불러오기
- ggplot2를 활용한 시각화 (
geom_line()
+geom_smooth()
로 추세선 추가)

🔄 DB 데이터 추가 업데이트 방법
DB에 새로운 연도의 데이터를 추가하려면 기존 테이블을 삭제하지 않고 데이터를 추가(append)하는 방식으로 업데이트해야 합니다. 예를 들어, 2025년 데이터를 추가하는 코드를 작성하면 다음과 같습니다.
conn <- dbConnect(RSQLite::SQLite(), "sales_data.sqlite")
# 2025년 데이터 생성
set.seed(125)
years <- rep(2025, each = 12)
months <- 1:12
sales <- sample(100:500, 12, replace = TRUE) + (2025 - 2020) * 20
new_data <- data.frame(year = years, month = months, sales = sales)
# 기존 테이블에 추가
dbWriteTable(conn, "sales", new_data, append = TRUE, row.names = FALSE)
# DB 연결 해제
dbDisconnect(conn)
📝 코드 해설
- 새로운 연도의 데이터 생성:
set.seed(125)
를 설정하고 2025년 데이터를 생성합니다. - 데이터프레임 구성: 기존과 동일한 구조의 데이터프레임을 생성합니다.
- DB에 데이터 추가:
dbWriteTable()
을append = TRUE
로 설정하여 기존 데이터에 새로운 데이터를 추가합니다. - DB 연결 해제:
dbDisconnect()
를 호출하여 연결을 종료합니다.
이제 2025년 데이터를 추가한 후 Shiny 앱에서 선택할 수 있도록 UI의 selectInput()
에도 2025년을 추가하면 됩니다. 📊
📌 마무리하며…
이제 우리는 R Shiny 앱에서 DB 기반 데이터 시각화를 하는 방법을 배웠습니다!
- 왜 DB를 사용하는 것이 좋은지 이해
- SQLite에 데이터를 저장하는 법 학습
- Shiny 앱에서 데이터를 불러와 시각화하는 과정 익히기
실제 프로젝트에서 SQLite뿐만 아니라 MySQL, PostgreSQL 등 다양한 DB를 활용할 수도 있습니다. 😊
📚 용어 해설
- Shiny: R을 사용하여 웹 애플리케이션을 쉽게 만들 수 있는 패키지.
- SQLite: 경량 데이터베이스로 파일 하나로 관리 가능하며, 간단한 데이터 저장용으로 적합함.
- ggplot2: 데이터 시각화를 위한 R 패키지로 다양한 그래프를 생성 가능.
- reactive(): Shiny에서 데이터가 동적으로 변할 수 있도록 하는 함수.
