터미널 UI 만들기가 머리를 아프게 했다

발행: (2025년 12월 16일 오전 03:22 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

저는 대부분의 경력을 브라우저용 무언가를 만드는 데 보냈습니다.

무언가가 잘못 보이면 DevTools를 엽니다.
여백이 틀어지면 DOM을 검사합니다.
레이아웃이 엉망이면 CSS를 조정해서 더 이상 소리를 지르지 않게 합니다.

그래서 당연히 터미널 UI(TUI)를 만든다면… 비슷할 거라 생각했죠.
그렇지 않았습니다!

이 글은 TurboStream이라는 프로젝트를 진행하면서 공개적으로 기록하는 일환입니다 — 고속 WebSocket 스트림(블록체인, BGP, 금융 피드 등)을 토큰을 소모하거나 시스템을 다운시키지 않고 LLM에 연결해 주는 개발자 도구입니다.

예시:

WebSocket → Cache → Triggers → LLM → 짧은 인간이 읽을 수 있는 알림.

백엔드는 비교적 쉬웠습니다.
터미널 UI가 저를 거의 죽음에 이르게 했습니다.

TUI Dashboard

브라우저 세계에서 온 사람에게

웹 세계에서는

  • Figma → HTML/CSS가 대부분 기계적인 작업
  • 레이아웃은 시각적
  • 디버깅은 인터랙티브

Bubble Tea 세계에서는

  • 레이아웃은 수학
  • 패딩은 분위기
  • “왜 이 박스가 두 칸 더 넓어?”는 철학적인 질문

DOM 인스펙터가 없습니다.
“호버하면 경계 상자를 볼 수 있다”는 기능도 없습니다.
lipgloss.Style() 하나만 바꾸면 모든 것이 갑자기 움직입니다.

가장 어려운 화면: AI 분석

AI Analysis Window

개념적으로는 간단합니다:

  • LLM 컨텍스트 크기 표시
  • 토큰 사용량 표시
  • 생성 시간 표시
  • 출력 텍스트 스트리밍

현실은:

  • 내용 높이가 계속 변함
  • 너비는 형제 패널과 정렬돼 있어야 함
  • 스크롤 텍스트 + 테두리 + 패딩이 서로 충돌

결과적으로 다음과 같은 문제가 계속 발생했습니다:

  • 텍스트가 잘려 보임
  • 패널이 1 문자씩 넘쳐남
  • 터미널 너비에 따라 테두리가 어긋남

한 크기에서는 괜찮아 보였지만, 크기를 바꾸면 완전히 깨졌습니다.

Bubble Tea를 사용해 본 사람이라면 이 느낌을 알 겁니다:

“이게 작동해야 하는데… 왜 안 될까?”

지금까지 배운 점

1. 픽셀 단위 사고를 멈춰라

터미널 레이아웃은 시각이 아니라 제약 조건에 관한 것입니다. 모든 것은 행 × 열입니다. 자유로운 공간은 없습니다.

2. 모든 것을 명시적으로 측정하라

너비/높이를 직접 계산하지 않으면 Bubble Tea가 기분 좋게 놀라게 할 것입니다.

3. 테두리는 거짓말한다

테두리와 패딩도 차지합니다. “한 칸 더”라는 현상은 언제나 당신의 실수입니다.

4. TUI 디버깅은 계측이 필요하다

다음과 같은 작업을 시작했습니다:

  • 임시 배경 색상 추가
  • 박스 안에 너비/높이 라벨 표시
  • 레이아웃에 스트레스를 주는 가짜 내용 삽입

보기엔 못생겼지만 효과는 있었습니다.

앞으로 할 일

  • 레이아웃 디버그 모드 만들기 – 컴포넌트 경계와 크기를 보여주는 토글 가능한 오버레이.
  • 작은 레이아웃 테스트 하네스 작성 – 전체 앱 안에서 디버깅하지 말고 한 뷰씩 격리해서 테스트.
  • 레이아웃 계약 표준화 – 각 패널이 “필요한 것”을 선언하게 하고, “스스로 알아내기”를 없앰.
  • TUI UX ≠ Web UX임을 받아들이기 – 매체가 다르면 규칙도 다르다.
Back to Blog

관련 글

더 보기 »