터미널 UI: BubbleTea (Go) vs Ratatui (Rust)

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

Source: Dev.to

Source:

BubbleTea (Go)

BubbleTea란?
BubbleTea는 The Elm Architecture를 기반으로 한 Go용 TUI 프레임워크입니다. 앱을 모델(상태)과 세 가지 요소로 설명합니다:

요소목적
Init초기 커맨드(또는 nil)를 반환합니다.
Update들어오는 메시지를 처리하고, 새로운 모델과 선택적인 커맨드를 반환합니다.
ViewUI를 문자열로 렌더링합니다.

프레임워크는 이벤트 루프를 실행하고, 키 입력 및 I/O를 메시지로 변환하며, 모델이 변경될 때마다 UI를 다시 그립니다. 요컨대, 단일 진실 소스와 예측 가능한 업데이트를 갖춘, Go에서 터미널 앱을 만들기 위한 재미있고 상태 기반의 방법입니다.

BubbleTea를 선택해야 하는 이유

  • 수만 개의 GitHub 스타를 가진 프로덕션 레디(v1.x) 버전.
  • 인라인, 전체 화면, 혹은 혼합 모드 모두 지원.
  • 보통 Bubbles(입력, 뷰포트, 스피너 등 컴포넌트)와 Lip Gloss(스타일링)와 함께 사용됩니다.
  • 일반적인 Go 프로젝트 레이아웃(cmd/, 패키지 등)에 자연스럽게 녹아듭니다.

최소 BubbleTea 프로그램

package main

import (
	"fmt"
	"os"

	tea "github.com/charmbracelet/bubbletea"
)

type model struct {
	choices  []string
	cursor   int
	selected map[int]struct{}
}

func (m model) Init() tea.Cmd { return nil }

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
	switch msg := msg.(type) {
	case tea.KeyMsg:
		switch msg.String() {
		case "ctrl+c", "q":
			return m, tea.Quit
		case "up", "k":
			if m.cursor > 0 {
				m.cursor--
			}
		case "down", "j":
			if m.cursor "
		}
		checked := " "
		if _, ok := m.selected[i]; ok {
			checked = "x"
		}
		s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice)
	}
	return s + "\nPress q to quit.\n"
}

func main() {
	if _, err := tea.NewProgram(model{
		choices:  []string{"Buy carrots", "Buy celery", "Buy kohlrabi"},
		selected: make(map[int]struct{}),
	}).Run(); err != nil {
		fmt.Printf("error: %v", err)
		os.Exit(1)
	}
}

BubbleTea로 만든 주목할 만한 앱

  • Crush – Charm의 TUI 기반 AI 코딩 에이전트.
  • Glow – 마크다운 뷰어.
  • Huh – 인터랙티브 프롬프트.
  • 그 외 상위 트렌드 Go 프로젝트 생태계에 속한 다양한 도구들.

대규모 Go 애플리케이션에서는 의존성 주입, 견고한 단위 테스트, 기타 Go 관용 패턴을 추가할 수 있으며, 동일한 아이디어를 BubbleTea 모델과 커맨드에 적용할 수 있습니다.

Ratatui (Rust)

Ratatui란?
Ratatui는 즉시‑모드 렌더링을 사용하는 Rust 기반 TUI 라이브러리입니다. 각 프레임마다 전체 UI(위젯과 레이아웃)를 기술하면 Ratatui가 그려줍니다.

  • 가볍고 의견이 강하지 않으며 – Elm‑스타일 모델이나 특정 앱 구조를 강요 하지 않습니다.
  • 직접 상태를 관리하고, 자체 이벤트 루프를 실행합니다(보통 crossterm, termion, termwiz 중 하나 사용). 그리고 terminal.draw(|f| { … })를 호출해 렌더링합니다.

Elm‑style vs. Immediate‑mode

접근 방식루프를 누가 관리하나요?UI 기술 방식
Elm‑style (BubbleTea)프레임워크UpdateView (변경된 부분만 다시 그려짐)
Immediate‑mode (Ratatui)당신(앱)매 프레임 현재 상태에서 전체 UI를 재구성

왜 Ratatui를 선택하나요?

  • 2,100개 이상의 크레이트에서 사용되며 Netflix(bpftop), OpenAI, AWS(amazon-q-developer-cli), Vercel 등 기업에서도 신뢰받고 있습니다.
  • 현재 안정 버전은 0.30.x이며 문서가 풍부하고 선택적인 백엔드를 제공합니다.
  • 입력 처리와 렌더링을 완전하게 제어해야 하거나 Rust 생태계에서 이미 작업하고 있을 때 이상적입니다.

최소 Ratatui 프로그램

use crossterm::event::{self, Event, KeyCode};
use ratatui::{prelude::*, widgets::Paragraph};
use std::time::Duration;

fn main() -> Result<()> {
    // Initialise the terminal
    let mut terminal = ratatui::init();

    loop {
        // Draw the UI each frame
        terminal.draw(|frame| {
            let area = frame.area();
            frame.render_widget(
                Paragraph::new("Hello, Ratatui! Press q to quit.")
                    .alignment(Alignment::Center),
                area,
            );
        })?;

        // Handle input (poll every 250 ms)
        if event::poll(Duration::from_millis(250))? {
            if let Event::Key(key) = event::read()? {
                if key.code == KeyCode::Char('q') {
                    break;
                }
            }
        }
    }

    // Restore the terminal state before exiting
    ratatui::restore();
    Ok(())
}

언제 어떤 것을 선택할까?

AspectBubbleTea (Go)Ratatui (Rust)
아키텍처Elm Architecture (model + Init/Update/View)Immediate mode (you own the loop)
생태계Bubbles, Lip Gloss, 10k+ 앱 (예: Crush)2,100+ 크레이트, Netflix, OpenAI, AWS, Vercel에서 사용
추천 대상빠른 반복, Go 팀, CLI완전한 제어, 성능에 민감한 TUI, Rust 코드베이스
전형적인 사용 사례Go에서 다듬어진 TUI를 가장 빠르게 만들고 싶을 때최대 제어가 필요하거나 이미 Rust를 사용 중일 때

결론: 두 프레임워크 모두 훌륭합니다. 선호하는 언어와 프레임워크에서 원하는 구조의 정도가 선택을 좌우합니다.

추가 읽을거리 및 자료

  • 2026년 1월 GitHub에서 트렌드인 Go 프로젝트 Top 19
  • 2026년 1월 GitHub에서 트렌드인 Rust 프로젝트 Top 23
  • Go 의존성 주입: 패턴 및 모범 사례

위 스크린샷의 Crush UI는 BubbleTea 프레임워크를 사용해 구현되었습니다.

Practices

  • Go SDKs for Ollama – 예시와 비교
  • Comparing Go ORMs for PostgreSQL: GORM vs Ent vs Bun vs sqlc – Go ORM을 PostgreSQL에 적용해 비교
  • Go Project Structure: Practices & Patterns – Go 프로젝트 구조: 실천 및 패턴
  • Go Unit Testing: Structure & Best Practices – Go 단위 테스트: 구조 및 모범 사례
  • Bubble Tea – The Elm Architecture for Go TUIs – Bubble Tea – Go TUI를 위한 Elm 아키텍처
  • Ratatui – Introduction – Ratatui – 소개
  • Ratatui – Rendering (immediate mode) – Ratatui – 렌더링 (즉시 모드)
  • Charm Crush – TUI coding agent – Charm Crush – TUI 코딩 에이전트
  • Ratatui on crates.io – crates.io의 Ratatui
0 조회
Back to Blog

관련 글

더 보기 »