전체 스크립트 재실행이 싫어서 Streamlit 대안을 만들었습니다 (Violit 소개) 🚀

발행: (2026년 2월 8일 오후 09:00 GMT+9)
7 분 소요
원문: Dev.to

Source: Dev.to

Cover image for I built a Streamlit alternative because I hated

Dope Flamingo

👋 안녕하세요, 저는 파이썬을 사랑하는 개발자입니다.

저는 산업 현장에서 일하는 소프트웨어 엔지니어이며, 밤과 주말을 이용해 이 오픈소스 프로젝트에 매진하고 있습니다.

개인적으로 저는 Streamlit을 정말 좋아합니다. 직관적인 문법은 게임 체인저이며, AI/데이터 연구를 하는 많은 친구들이 매일 프로토타이핑에 사용하고 있습니다.

하지만 프로젝트가 커지면서 구조적인 성능 문제, 즉 “Full‑Script Rerun” 현상을 겪게 되었습니다.
버튼을 클릭할 때마다 전체 파이썬 스크립트가 위에서 아래로 실행됩니다. 로딩 스피너가 끝없이 돌아가거나 앱이 충돌하는 모습을 보면서 개발자로서 이를 고쳐야겠다고 생각했습니다.

대안으로 NiceGUI를 추천해 보았지만, 피드백은 일관되었습니다:

“문법이 Streamlit과 너무 달라요.”
“디자인(Material Design) 커스터마이징이 너무 어렵다.”

그래서 직접 해결책을 만들기로 했습니다.

“Streamlit만큼 쉬우면서 React만큼 빠른 도구를 만든다면 어떨까?”

그렇게 Violit이 탄생했습니다.

💜 Violit의 철학

Violit은 FastAPIShoelace (Web Components) 위에 구축되었습니다. 제 아키텍처 목표는 명확했습니다:

  • 세밀한 반응성: 데이터가 변경될 때, 특정 컴포넌트만 업데이트합니다. 전체 페이지를 다시 실행하지 않습니다.
  • 학습 곡선 제로: Streamlit을 알고 있다면 Violit을 10 분 안에 사용할 수 있어야 합니다.
  • 기본적으로 아름다움: CSS를 몰라도 멋지게 보이게 할 수 있어야 합니다. theme="cyberpunk"만 설정하면 됩니다.

🔥 Show me the Code

Violit은 Streamlit의 개발자 경험을 물려받았습니다. 복잡한 callbacksuseEffect를 알 필요가 없습니다. 파이썬 코드의 흐름이 UI가 됩니다.

import violit as vl

app = vl.App(title="Violit Demo")

# 상태 선언 (React의 useState 또는 SolidJS signals와 유사)
count = app.state(0)

# 버튼을 클릭하면 `count` 변수만 업데이트됩니다.
# 전체 스크립트가 다시 실행되지 않습니다.
app.button("Increment", on_click=lambda: count.set(count.value + 1))

# `count`가 변경될 때, 이 텍스트 컴포넌트만 업데이트됩니다.
app.text("Current Count:", count)

app.run()

전체 화면 모드 진입전체 화면 모드 종료

⚡ 벤치마크: Streamlit vs. Violit

Violit은 fine‑grained reactivity를 사용하기 때문에 상태가 변할 때 데이터를 다시 읽거나 전체 DOM을 다시 렌더링할 필요가 없습니다.

대규모 데이터셋에 대한 렌더링 속도

데이터 포인트Streamlit 렌더링Violit 렌더링
100 K~62 ms~14 ms
500 K~174 ms~20 ms
1 M~307 ms~24 ms

Benchmark chart 1

Benchmark chart 2

보시다시피, Violit은 무거운 재실행 사이클을 우회하기 때문에 대규모 데이터셋에서도 성능 저하가 거의 없습니다.

초기 차트 로딩 속도 (5 백만 데이터 포인트)

아래 비교는 5 백만 개의 생성된 데이터 포인트를 사용한 그래프 플롯 렌더링을 보여줍니다 (위: Streamlit, 아래: Violit).

5 M points benchmark

Violit은 Streamlit에 비해 앱 시작 속도가 현저히 빠름을 보여줍니다.

🎨 20개 이상의 테마, 한 줄의 코드

“미학은 기능이다.”

Violit는 bootstrap부터 cyberpunk, vaporwave까지 20개 이상의 사전 설정 테마를 제공합니다.

테마 예시

Bootstrap

Bootstrap 테마

Dracula

Dracula 테마

Hand‑drawn

손그림 테마

앱의 전체 모습을 단일 인수로 전환할 수 있습니다, 예시:

app = vl.App(title="My App", theme="cyberpunk")

🌐 “Violit으로 Violit 웹사이트를 만들었습니다… Violit과 함께”

말은 쉽습니다. Violit이 프로덕션(MVP) 준비가 되었음을 증명하기 위해 Violit만을 사용해 공식 랜딩 페이지와 문서를 완전히 구축했습니다.

Hybrid Rendering을 지원합니다(대량 트래픽에는 HTMX, 실시간에는 WebSocket) 그리고 pywebview를 이용해 Desktop mode도 사용할 수 있습니다.

Violit은 단순히 또 다른 Streamlit 대안에 그치지 않고, 개발자들이 파이썬만으로 완전한 웹 서비스(MVP)를 구축할 수 있게 하는 것을 목표로 합니다.

🙏 한번 사용해 보세요!

저는 이 프로젝트를 공개적으로 개발하고 있으며 현재 v0.1.11 버전입니다. 아직 초기 단계이지만 Reddit과 커뮤니티의 반응이 매우 좋습니다.

대시보드나 AI 데모를 위한 더 빠른 Streamlit 대안을 찾고 계시다면, 직접 사용해 보시고 의견을 알려 주세요!

읽어 주셔서 감사합니다! 즐거운 코딩 되세요. 💜

Back to Blog

관련 글

더 보기 »