Zellij란 무엇인가?

Zellij는 Rust로 작성된 현대적인 터미널 워크스페이스(terminal workspace)로, tmux와 GNU Screen의 차세대 대안으로 자리매김하고 있습니다. 핵심 철학은 '배터리 포함'(batteries included)입니다. 복잡한 설정 없이도 강력한 터미널 멀티플렉싱 기능을 즉시 사용할 수 있습니다.

왜 Zellij가 필요한가?

터미널을 사용해 개발, 운영 또는 시스템 관리를 자주 한다면 다음 상황들이 익숙할 것입니다.

  • 여러 서비스(프론트엔드, 백엔드, 데이터베이스)를 동시에 실행하며 창 간 전환 필요
  • 원격 서버에 SSH로 연결 후 연결이 끊기면서 모든 프로세스 중단
  • 복잡한 작업 상태를 저장해두고 다음 번에 바로 재개하고 싶음
  • 팀 협업 시 디버깅이나 코드 리뷰를 위해 터미널 세션 공유 필요

전통적인 해결책은 tmux나 GNU Screen이지만, 학습 곡선이 가파르고 기본 설정이 빈약하며, 많은 고급 기능을 사용하려면 직접 설정 파일을 작성해야 합니다.

Zellij는 이러한 문제점을 해결하는 것을 목표로 합니다.

기능 tmux Zellij
학습 곡선 가파름, 많은 단축키 암기 필요 완만함, 내장 도움말 및 기본 레이아웃 제공
플로팅 패널 ❌ 미지원 ✅ 네이티브 지원
스태킹 패널 ❌ 미지원 ✅ 네이티브 지원
웹 클라이언트 ❌ 서드파티 도구 필요 ✅ 내장
세션 복원 ⚠️ 플러그인 필요 (tmux-resurrect) ✅ 네이티브 지원
플러그인 시스템 셸 스크립트 WebAssembly (Rust/모든 언어)
레이아웃 자동화 셸 스크립트 작성 필요 KDL 선언형 설정
프로그래밍 언어 C Rust

Zellij vs tmux: 핵심 차이점

  1. 사용자 친화성: Zellij는 직관적인 UI(상태 표시줄, 탭 바)를 기본적으로 제공하지만, tmux는 유사한 효과를 보려면 수동으로 설정해야 합니다.
  2. 플로팅 패널: Zellij는 패널이 다른 패널 위에 '떠다니게' 할 수 있어, top이나 htop 같은 모니터링 명령어를 실행하면서도 다른 작업을 수행하기에 적합합니다.
  3. 웹 클라이언트: Zellij에는 내장 웹 서버가 있어 추가 도구 없이도 브라우저를 통해 터미널 세션에 접근할 수 있습니다.
  4. 세션 부활: Zellij를 닫았다가 다시 열면 이전의 모든 패널, 명령어, 기록을 복원할 수 있으며, 심지어 재부팅 후에도 유효합니다.
  5. 플러그인 생태계: Zellij의 플러그인은 WebAssembly 기반이며, Rust, Go, C 등 WASM으로 컴파일 가능한 모든 언어로 작성할 수 있어 보안성이 더 높습니다.

Zellij 설치하기

Zellij는 Linux, macOS 및 Windows(WSL)를 지원합니다. 다음은 일반적인 설치 방법입니다.

방법 1: 공식 원클릭 설치 스크립트 (추천)

BASH
# Bash/Zsh
bash <(curl -L https://zellij.dev/launch)

# Fish
bash (curl -L https://zellij.dev/launch | psub)

# PowerShell
irm https://zellij.dev/launch.ps1 | iex

이 스크립트는 운영 체제와 아키텍처를 자동으로 감지하여 최신 버전의 Zellij를 다운로드하고 설치합니다.

방법 2: 패키지 관리자로 설치

macOS (Homebrew):

BASH
brew install zellij

Linux (Ubuntu/Debian):

BASH
# APT 저장소 추가
echo "deb [trusted=yes] https://dl.cloudsmith.io/public/zellij-org/releases/deb/debian any-version main" | sudo tee /etc/apt/sources.list.d/zellij.list
sudo apt update
sudo apt install zellij

Arch Linux:

BASH
sudo pacman -S zellij

Fedora:

BASH
sudo dnf install zellij

방법 3: 소스에서 컴파일

커스터마이즈된 버전이 필요하다면 소스에서 컴파일할 수 있습니다.

BASH
# Rust 툴체인 설치 확인
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 저장소 클론
git clone https://github.com/zellij-org/zellij.git
cd zellij

# 컴파일 및 설치
cargo install --path zellij

설치 확인

BASH
zellij --version

zellij 0.42.0과 같은 버전 번호가 출력되어야 합니다.


빠르게 시작하기: 첫 Zellij 세션

Zellij 시작하기

터미널에서 직접 실행합니다.

BASH
zellij

상단에 탭 바, 하단에 상태 표시줄이 있는 새로운 인터페이스가 나타납니다. 기본적으로 Zellij는 "main"이라는 탭과 하나의 터미널 패널을 생성합니다.

기본 조작

Zellij의 모든 단축키는 Ctrl + g를 접두사(모드 키)로 사용합니다. 다음은 자주 사용하는 조작들입니다.

조작 단축키 설명
새 패널 생성 Ctrl+g → n 현재 패널을 수평으로 분할
새 수직 패널 생성 Ctrl+g → h 현재 패널을 수직으로 분할
패널 전환 Ctrl+g → 방향키 패널 간 포커스 이동
패널 크기 조정 Ctrl+g → r → 방향키 resize 모드로 진입
새 탭 생성 Ctrl+g → t 새 탭 생성
탭 전환 Ctrl+g → p / n 이전/다음 탭으로 이동
패널 닫기 Ctrl+g → x 현재 패널 닫기
Zellij 종료 Ctrl+g → q 현재 세션 종료

팁: Ctrl+g → ?를 누르면 언제든지 전체 단축키 목록을 볼 수 있습니다.

플로팅 패널

플로팅 패널은 Zellij의 특징적인 기능 중 하나입니다. 패널이 다른 패널 위에 '부유'하도록 하여 고정된 그리드 공간을 차지하지 않게 합니다.

플로팅 패널 활성화:

BASH
# 단축키: Alt + f

또는 명령 모드를 통해:

BASH
Ctrl+g → : → toggle_floating_panes

전형적인 사용 사례:

BASH
# 플로팅 패널에서 htop을 실행해 시스템 리소스 모니터링
htop

# 다른 플로팅 패널에서 로그 추적 실행
tail -f /var/log/syslog

# 메인 패널에서는 계속 코드 작성이나 다른 명령어 실행

플로팅 패널은 드래그하거나 크기를 조정할 수 있으며, 항상 최상위에 유지되도록 '고정'(pin)할 수도 있습니다.

스태킹 패널

스태킹 패널은 여러 패널을 수직으로 쌓아 올려 수평 공간을 절약할 수 있게 해줍니다.

스태킹 패널 생성:

BASH
# 먼저 일반 패널 두 개를 만든 후:
Ctrl+g → : → toggle_stack

스태킹 패널 간 전환:

BASH
# 방향키 위아래로 전환

스태킹 패널은 다음과 같은 상황에 특히 적합합니다. - 여러 편집기 버퍼에 쉽게 접근 - 너무 많은 화면 공간을 차지하지 않고 여러 명령어 출력 모니터링 - 작업 또는 컨텍스트별로 워크스페이스 구성


세션 관리: 작업 상태 저장 및 복원

세션 관리자

Zellij에는 여러 작업 환경 간에 쉽게 전환할 수 있도록 하는 강력한 세션 관리 기능이 내장되어 있습니다.

세션 관리자 열기:

BASH
Ctrl+g → w

시각적인 세션 선택 인터페이스가 표시되며, 여기서 다음을 수행할 수 있습니다. - 실행 중인 모든 세션 보기 - 사용자 정의 이름으로 새 세션 생성 - 백그라운드 세션으로 전환 - 이전에 종료한 세션 복원

환영 화면

Zellij를 처음 시작할 때 환영 화면을 사용하여 빠르게 시작할 수 있습니다.

BASH
zellij -l welcome

환영 화면은 '시작 메뉴'와 유사한 인터페이스를 제공하며, 다음을 수행할 수 있습니다. - 시각적으로 세션 선택 - 새 세션 생성 - 이전에 종료한 세션 복원

세션 부활 (Session Resurrection)

이는 Zellij의 가장 독특한 기능 중 하나입니다. Zellij를 닫거나 컴퓨터를 재부팅하더라도 다음 번에 열면 이전의 완전한 작업 상태를 복원할 수 있습니다. 여기에는 다음이 포함됩니다.

  • 모든 패널의 레이아웃 및 크기
  • 각 패널에서 실행 중인 명령어
  • 스크롤 히스토리
  • 환경 변수 및 작업 디렉터리

복원 방법:

BASH
# Zellij를 정상적으로 시작한 후 세션 관리자를 통해 복원할 세션 선택
zellij
Ctrl+g → w → 이전에 종료한 세션 선택

또는 시작 시 직접 지정:

BASH
zellij attach <session-name>

컴파일, 테스트, 데이터 처리 등 장시간 실행되는 작업에 매우 유용합니다. 예기치 않게 연결이 끊기거나 재부팅되더라도 원활하게 작업을 계속할 수 있습니다.


레이아웃 자동화: 개발 환경 정의하기

Zellij의 레이아웃 시스템을 사용하면 KDL(사람이 읽기 쉬운 설정 형식)을 사용하여 전체 개발 환경을 선언적으로 정의할 수 있습니다.

레이아웃이란?

레이아웃은 .kdl 파일로, 다음을 설명합니다. - 탭의 개수 - 각 탭에 있는 패널 - 각 패널에서 실행할 명령어 - 패널의 크기와 위치 - 플로팅 또는 스태킹 사용 여부

간단한 레이아웃 예제

my-project.kdl이라는 파일을 생성합니다.

KDL
layout {
    tab name="Backend" {
        pane split_direction="Vertical" {
            pane command="cargo" args=["run"]
            pane command="npm" args=["run", "dev"]
        }
    }
    tab name="Database" {
        pane command="psql" args=["-U", "postgres", "-d", "mydb"]
    }
}

레이아웃 사용:

BASH
zellij --layout my-project.kdl

이렇게 하면 자동으로 다음이 수행됩니다. 1. "Backend"와 "Database"라는 두 개의 탭 생성 2. "Backend" 탭에서 수직으로 분할된 두 패널에 각각 cargo run과 npm run dev 실행 3. "Database" 탭에서 PostgreSQL 클라이언트 실행

명령어 패널 (Command Panes)

명령어 패널은 Zellij의 독특한 기능으로, 명령어를 단순한 터미널 출력이 아닌 '일급 시민'으로 취급합니다.

특징: - 명령어의 종료 코드를 확인할 수 있음 - Enter를 눌러 명령어를 다시 실행할 수 있음 - '일시 정지' 상태로 설정해 필요할 때 수동으로 트리거 가능 - 빌드, 테스트 실행, 개발 서버 시작 등에 이상적

레이아웃에서 명령어 패널 사용:

KDL
layout {
    tab name="Dev" {
        pane command="cargo" args=["test"] start_suspended=true
        pane command="cargo" args=["build"] start_suspended=true
    }
}

start_suspended=true는 명령어가 자동으로 실행되지 않고 Enter를 수동으로 눌러 트리거해야 함을 의미합니다. 전체 컴파일과 같은 리소스 집약적 작업에 유용하며, 레이아웃을 시작할 때마다 자동으로 실행되는 것을 방지합니다.

편집 패널

Zellij는 모든 패널의 스크롤 버퍼를 $EDITOR에서 직접 열 수 있게 해줍니다.

BASH
# 현재 패널에서:
Ctrl+s → e

설정된 편집기(vim, neovim, emacs 등)로 현재 패널의 전체 출력을 열 수 있으며, 다음을 수행할 수 있습니다. - 터미널 출력 검색, 복사, 정리 - 출력을 파일로 저장 - 팀원과 공유


웹 클라이언트: 브라우저에서 터미널 접근하기

Zellij에는 내장 웹 서버가 있어 브라우저를 통해 터미널 세션에 직접 접근할 수 있습니다. 이는 다음을 의미합니다. - 터미널 설치 불필요: 브라우저가 있는 모든 장치에서 Zellij 세션 접근 - 원격 협업: 페어 프로그래밍이나 디버깅을 위해 팀원과 세션 공유 - 원활한 전환: 터미널과 브라우저 간 자유롭게 전환, 세션 상태 일관성 유지

웹 클라이언트 활성화

Zellij를 시작할 때 웹 서버를 활성화합니다.

BASH
zellij --server /tmp/zellij-server.sock

또는 설정 파일에서 활성화:

KDL
// ~/.config/zellij/config.kdl
plugins {
    path "/usr/lib/zellij/plugins"
}

keybinds {
    shared {
        bind "Alt w" { SwitchToMode "WebClient"; }
    }
}

세션 접근

브라우저에서 다음 URL을 엽니다.

http://localhost:8082

다음과 같이 할 수 있습니다. - 실행 중인 모든 세션 보기 - URL로 특정 세션에 직접 접근: http://localhost:8082/my-session - 읽기 전용 토큰을 생성해 다른 사람이 세션을 조작하지 않고 볼 수 있게 함

원격 접근

Zellij는 HTTPS를 통한 원격 세션 접근을 지원합니다.

BASH
# 다른 머신에서 원격 세션에 부착
zellij attach https://my-server:8082/my-session

SSH 터널이나 서드파티 도구가 필요하지 않아 다음과 같은 경우에 이상적입니다. - 원격 디버깅 - 페어 프로그래밍 - 기술 지원


플러그인 시스템: WebAssembly로 기능 확장하기

Zellij의 인터페이스 자체는 플러그인으로 구성되어 있으며, 여기에는 다음이 포함됩니다. - 탭 바 (Tab Bar) - 상태 표시줄 (Status Bar) - 세션 관리자 (Session Manager) - 환영 화면 (Welcome Screen) - 파일 선택기 (Strider)

자체 플러그인 개발하기

Zellij 플러그인은 WebAssembly(WASM) 기반으로 하며, WASM으로 컴파일 가능한 모든 언어(Rust, Go, C 등)로 작성할 수 있습니다. Rust는 일류 지원과 전용 SDK를 제공합니다.

간단한 Rust 플러그인 만들기:

BASH
# Zellij 플러그인 스캐폴딩 도구 설치
cargo install zellij-plugin-template

# 새 프로젝트 생성
zellij-plugin-template my-plugin

cd my-plugin

생성된 프로젝트 구조:

my-plugin/
├── Cargo.toml
├── src/
│   └── main.rs
└── plugin.yaml

예제 플러그인 코드 (src/main.rs):

RUST
use zellij_sdk::{prelude::*, Command};

#[command(name = "my-plugin")]
fn main() {
    // Zellij 이벤트 구독
    subscribe(&[EventType::KeyPress(Key::Char('x'))]);

    loop {
        match std::io::stdin().read_line() {
            Ok(line) => {
                if line.contains("KeyPress") {
                    // 키 입력 이벤트 처리
                    println!("Received key press!");
                }
            }
            Err(_) => break,
        }
    }
}

컴파일 및 설치:

BASH
# WASM으로 컴파일
cargo build --target wasm32-wasip1 --release

# Zellij 플러그인 디렉터리에 복사
cp target/wasm32-wasip1/release/my_plugin.wasm ~/.local/share/zellij/plugins/

설정에서 플러그인 로드:

KDL
// ~/.config/zellij/config.kdl
plugins {
    path "~/.local/share/zellij/plugins"
}

pane_templates {
    template name="my-plugin-pane" {
        plugin location="file:~/.local/share/zellij/plugins/my_plugin.wasm"
    }
}

인기 커뮤니티 플러그인

  • Strider: 퍼지 검색을 지원하는 동적 파일 시스템 탐색
  • Configuration Screen: 상호작용식 설정 관리
  • Multiple Pane Select: 여러 패널 일괄 작업

Zellij 플러그인 저장소에서 더 많은 커뮤니티 플러그인을 찾을 수 있습니다.


고급 스크립팅: CLI 제어

Zellij는 CLI 명령어를 통해 완전한 제어 인터페이스를 노출하므로, 셸 스크립트나 외부 도구에서 복잡한 터미널 워크플로우를 구축할 수 있습니다.

조건부 블로킹 패널

BASH
# 명령어가 성공적으로 종료될 때까지 블로킹
zellij action new-pane --command "cargo test" --block-until-exit-success

# 명령어가 실패하며 종료될 때까지 블로킹
zellij action new-pane --command "npm run build" --block-until-exit-failure

# 명령어가 종료될 때까지 블로킹 (성공 또는 실패 상관없음)
zellij action new-pane --command "make" --block-until-exit

실패한 명령어는 스크립트의 위치를 잃지 않고 상호작용식으로 재시도할 수 있습니다.

실시간 패널 출력 스트리밍

BASH
# 임의 패널의 출력을 stdout으로 실시간 스트리밍
zellij subscribe pane-id-123

# 구조화된 처리를 위해 JSON 형식 사용
zellij subscribe pane-id-123 --json

원격 서버의 로그를 모니터링하거나 자동화 파이프라인을 구축하는 데 유용합니다.

구조화된 상태 쿼리

BASH
# 모든 패널 나열 (JSON 형식)
zellij list-panes --json

# 모든 탭 나열
zellij list-tabs --json

# 현재 세션 정보 가져오기
zellij session-info

이러한 명령어는 CI/CD 파이프라인, 모니터링 스크립트 또는 사용자 정의 대시보드에 통합할 수 있습니다.


실전 사례: 개발자 워크플로우 구축하기

사례 1: 풀스택 개발 환경

fullstack-dev.kdl이라는 레이아웃 파일을 생성합니다.

KDL
layout {
    tab name="Frontend" {
        pane split_direction="Vertical" {
            pane command="npm" args=["run", "dev"]
            pane command="npm" args=["run", "storybook"]
        }
    }
    tab name="Backend" {
        pane split_direction="Horizontal" {
            pane command="cargo" args=["run"]
            pane command="cargo" args=["watch", "-x", "test"] start_suspended=true
        }
    }
    tab name="Database" {
        pane command="docker" args=["compose", "up"]
        pane command="psql" args=["-U", "postgres", "-d", "myapp"]
    }
    tab name="Monitoring" {
        pane floating=true command="htop"
        pane floating=true command="tail" args=["-f", "/var/log/app.log"]
    }
}

시작:

BASH
zellij --layout fullstack-dev.kdl

이 레이아웃은 자동으로 다음을 수행합니다. 1. 프론트엔드, 백엔드, 데이터베이스, 모니터링용 4개의 탭 생성 2. 프론트엔드 탭에서 수직 분할로 개발 서버와 Storybook 실행 3. 백엔드 탭에서 수평 분할로 애플리케이션과 테스트 와처 실행 4. 데이터베이스 탭에서 Docker Compose와 PostgreSQL 클라이언트 시작 5. 모니터링 탭에서 htop과 로그 추적을 플로팅으로 표시

사례 2: 원격 서버 디버깅

원격 서버에서 문제를 디버깅해야 한다고 가정합니다.

BASH
# 원격 서버에 SSH 연결
ssh user@remote-server

# Zellij 세션 시작
zellij -s debugging-session

# 첫 번째 패널에서 로그 보기
tail -f /var/log/app/error.log

# 새 패널 생성, 진단 명령어 실행
Ctrl+g → n
dmesg | tail -20

# 새 플로팅 패널 생성, 시스템 리소스 모니터링
Ctrl+g → Alt+f
htop

# 웹 클라이언트 활성화, 동료들이 원격으로 볼 수 있게 함
# (미리 웹 서버 설정 필요)

그런 다음 동료에게 https://remote-server:8082/debugging-session에 접속하라고 알려주면, 터미널 세션을 실시간으로 보고 쓰기 권한을 부여하면 조작도 도와줄 수 있습니다.

사례 3: 데이터 과학 워크플로우

데이터 과학 프로젝트를 위한 레이아웃 data-science.kdl을 생성합니다.

KDL
layout {
    tab name="Notebook" {
        pane command="jupyter" args=["lab", "--no-browser"]
    }
    tab name="Data Processing" {
        pane split_direction="Vertical" {
            pane command="python" args=["process_data.py"]
            pane command="watch" args=["-n", "5", "ls", "-lh", "output/"]
        }
    }
    tab name="Visualization" {
        pane command="python" args=["visualize.py"]
        pane floating=true command="eog" args=["output/chart.png"]
    }
}

자주 묻는 질문 및 문제 해결

Q1: Zellij와 tmux를 동시에 사용할 수 있나요?

A: 가능합니다. 하지만 중첩해서 사용하는 것은 권장하지 않습니다. tmux 안에서 Zellij를 실행하거나 Zellij 안에서 tmux를 실행할 수 있지만, 단축키 충돌과 성능 문제가 발생할 수 있습니다. 주요 터미널 멀티플렉서로 하나만 선택하는 것이 좋습니다.

Q2: tmux 설정을 Zellij로 어떻게 마이그레이션하나요?

A: Zellij에는 직접적인 tmux 설정 변환기가 없지만, 다음 단계를 따를 수 있습니다. 1. Zellij의 기본 설정 파일 참조 2. tmux의 자주 사용하는 기능을 Zellij의 해당 기능에 매핑 3. Zellij의 레이아웃 시스템을 사용해 tmux 스크립트 대체

Q3: Zellij의 성능은 어떻나요?

A: Zellij는 Rust로 작성되어 뛰어난 성능을 자랑합니다. 대부분의 시나리오에서 메모리 사용량과 CPU 사용률은 tmux와 비슷하며, 일부 벤치마크에서는 더 나은 성능을 보이기도 합니다. 대규모 세션(수십 개의 패널)에서도 Zellij의 응답 속도는 여전히 원활합니다.

Q4: Zellij에서 마우스를 어떻게 사용하나요?

A: Zellij는 기본적으로 마우스 조작을 지원합니다. - 패널 클릭으로 포커스 전환 - 패널 경계 드래그로 크기 조정 - 마우스 휠 스크롤로 히스토리 탐색 - 탭 클릭으로 탭 전환

마우스가 작동하지 않으면 터미널 에뮬레이터에서 마우스 지원이 활성화되었는지 확인하거나, Zellij 설정에서 다음을 확인합니다.

KDL
// ~/.config/zellij/config.kdl
mouse_mode true

Q5: Zellij는 Windows를 지원하나요?

A: Zellij는 Windows(WSL2 또는 PowerShell 통해)를 네이티브로 지원합니다. 공식 원클릭 설치 스크립트를 사용해 Windows에 설치할 수 있습니다.

POWERSHELL
irm https://zellij.dev/launch.ps1 | iex

요약

Zellij는 tmux의 강력한 기능을 계승하면서 더 친화적인 사용자 경험과 혁신적인 기능을 제공하는 현대적인 터미널 워크스페이스입니다.

핵심 장점: - ✅ 즉시 사용 가능: 복잡한 설정 없이 직관적인 UI를 기본적으로 제공 - ✅ 플로팅/스태킹 패널: 다중 작업에 적합한 유연한 패널 관리 - ✅ 세션 부활: 재부팅 후에도 완전한 작업 상태 복원 - ✅ 웹 클라이언트: 브라우저를 통해 터미널 접근, 원격 협업 지원 - ✅ 플러그인 시스템: WebAssembly 기반, 안전하고 확장 가능 - ✅ 레이아웃 자동화: KDL로 선언형 개발 환경 정의 - ✅ CLI 스크립팅: 완전한 제어 인터페이스, 자동화 워크플로우에 적합

적합한 대상: - 개발자: 여러 서비스, 테스트 및 모니터링 도구를 동시에 실행해야 하는 경우 - 운영 엔지니어: 원격 서버 관리 및 장시간 실행 작업이 필요한 경우 - 데이터 과학자: Jupyter Notebook, 데이터 처리 및 시각화 워크플로우를 구성해야 하는 경우 - 팀 협업: 페어 프로그래밍이나 디버깅을 위해 터미널 세션을 공유해야 하는 경우

다음 단계: - Zellij 공식 문서 읽기 - 커뮤니티 플러그인 탐색 - Discord 또는 Matrix 커뮤니티 가입

tmux의 현대적인 대안을 찾고 있다면 Zellij는 반드시 시도해 볼 가치가 있습니다. 학습 곡선이 완만하고 기능이 강력하며 터미널 작업 효율성을 크게 향상시킬 수 있습니다.