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

DB 기반 R 샤이니앱 시각화
( DB 기반 R 샤이니앱 시각화 이미지 )

데이터를 분석하고 시각화하는 과정에서 항상 최신 데이터를 반영하는 것이 중요합니다. 하지만 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)

📝 코드 해설

  1. SQLite 데이터베이스 연결: dbConnect()를 사용하여 DB 파일을 생성 및 연결합니다.
  2. 랜덤 데이터 생성: years, months, sales 데이터를 만들어 5년치 데이터를 생성합니다.
  3. DB에 저장: 기존 테이블을 삭제한 후 dbWriteTable()로 데이터를 저장합니다.
  4. 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)

📝 코드 해설

  1. 사용자가 연도를 선택할 수 있도록 UI 구성 (selectInput() 사용)
  2. Shiny 서버에서 DB 연결 후 해당 연도의 데이터 불러오기
  3. ggplot2를 활용한 시각화 (geom_line() + geom_smooth()로 추세선 추가)
( DB 기반 R 샤이니앱 시각화 이미지 – 개별 연도 선택 )

🔄 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)

📝 코드 해설

  1. 새로운 연도의 데이터 생성: set.seed(125)를 설정하고 2025년 데이터를 생성합니다.
  2. 데이터프레임 구성: 기존과 동일한 구조의 데이터프레임을 생성합니다.
  3. DB에 데이터 추가: dbWriteTable()append = TRUE로 설정하여 기존 데이터에 새로운 데이터를 추가합니다.
  4. DB 연결 해제: dbDisconnect()를 호출하여 연결을 종료합니다.

이제 2025년 데이터를 추가한 후 Shiny 앱에서 선택할 수 있도록 UI의 selectInput()에도 2025년을 추가하면 됩니다. 📊

📌 마무리하며…

이제 우리는 R Shiny 앱에서 DB 기반 데이터 시각화를 하는 방법을 배웠습니다!

  • 왜 DB를 사용하는 것이 좋은지 이해
  • SQLite에 데이터를 저장하는 법 학습
  • Shiny 앱에서 데이터를 불러와 시각화하는 과정 익히기

실제 프로젝트에서 SQLite뿐만 아니라 MySQL, PostgreSQL 등 다양한 DB를 활용할 수도 있습니다. 😊

📚 용어 해설

  • Shiny: R을 사용하여 웹 애플리케이션을 쉽게 만들 수 있는 패키지.
  • SQLite: 경량 데이터베이스로 파일 하나로 관리 가능하며, 간단한 데이터 저장용으로 적합함.
  • ggplot2: 데이터 시각화를 위한 R 패키지로 다양한 그래프를 생성 가능.
  • reactive(): Shiny에서 데이터가 동적으로 변할 수 있도록 하는 함수.
테리 이모티콘
( 즐겁게 코딩을 합시다! )

유사한 게시물