
터미널 에뮬레이터와 TTY: 검은 화면의 정체
우리가 쓰는 iTerm2는 진짜 터미널이 아닙니다. 가짜(Emulator)입니다. 텔레타이프(TTY) 시절의 유물부터 PTY까지.

우리가 쓰는 iTerm2는 진짜 터미널이 아닙니다. 가짜(Emulator)입니다. 텔레타이프(TTY) 시절의 유물부터 PTY까지.
내 서버는 왜 걸핏하면 뻗을까? OS가 한정된 메모리를 쪼개 쓰는 처절한 사투. 단편화(Fragmentation)와의 전쟁.

미로를 탈출하는 두 가지 방법. 넓게 퍼져나갈 것인가(BFS), 한 우물만 팔 것인가(DFS). 최단 경로는 누가 찾을까?

이름부터 빠릅니다. 피벗(Pivot)을 기준으로 나누고 또 나누는 분할 정복 알고리즘. 왜 최악엔 느린데도 가장 많이 쓰일까요?

매번 3-Way Handshake 하느라 지쳤나요? 한 번 맺은 인연(TCP 연결)을 소중히 유지하는 법. HTTP 최적화의 기본.

맥북을 사서 처음 개발을 시작했을 때, iTerm2라는 앱을 깔았다. 까만 화면에 초록색 글자가 떠 있고, 거기에 명령어를 치면 뭔가가 실행됐다. 사람들은 이걸 "터미널"이라고 불렀다.
그런데 이상했다. 왜 21세기에 이렇게 생긴 인터페이스를 쓰는 거지? GUI가 있는데 왜 굳이 텍스트로만 대화해야 하지? 그리고 가끔 /dev/tty니 /dev/pts/3이니 하는 이상한 경로가 나오는데, 이건 또 뭐지?
더 이상했던 건, 사람들이 "터미널"과 "콘솔"과 "쉘"을 섞어서 쓴다는 점이었다. 뭐가 다른 건지 아무도 설명해주지 않았다.
그래서 나는 파기 시작했다. 이 검은 화면의 정체를 밝혀내기 위해.
처음엔 간단할 줄 알았다. "터미널 = 검은 화면"이라고 생각했으니까. 그런데 파면 팔수록 용어가 쏟아져 나왔다.
도대체 뭐가 뭔지 알 수가 없었다. 그러다가 StackOverflow에서 어떤 사람이 남긴 댓글을 봤다:
"You're not using a terminal. You're using a terminal emulator. Real terminals were hardware."
에뮬레이터라고? 내가 쓰는 iTerm2가 뭔가를 흉내 내고 있다는 뜻인가?
그제야 이해가 됐다. 이건 역사의 문제였다.
1960년대, 컴퓨터는 집채만 했고 모니터가 없었다. 대신 텔레타이프(Teletypewriter, TTY)라는 기계를 썼다. 타자기처럼 생긴 물건이었는데, 이걸로 글자를 타이핑하면 전선을 통해 멀리 있는 메인프레임 컴퓨터로 명령이 날아갔다. 컴퓨터는 응답을 다시 전선으로 보냈고, 텔레타이프는 종이에 그 결과를 찍어냈다.
타자기가 곧 터미널이었다.시간이 흘러 1970년대가 되자, 종이 대신 CRT 모니터가 달린 VT100 같은 하드웨어 터미널이 등장했다. 여전히 물리적인 기계였지만, 이제 종이 대신 화면에 글자가 표시됐다. 그리고 이 VT100 터미널은 ANSI 이스케이프 코드라는 특수 문자 시퀀스를 이해했다. 예를 들어 \033[31m이라는 코드를 받으면 글자 색을 빨간색으로 바꿨다.
# ANSI 이스케이프 코드 예제
echo -e "\033[31m빨간색 텍스트\033[0m"
echo -e "\033[1;32m굵은 초록색\033[0m"
echo -e "\033[4;34m밑줄 친 파란색\033[0m"
이 코드를 터미널에서 실행하면, 글자 색이 바뀐다. 왜? 1970년대 VT100 터미널이 그렇게 설계됐기 때문이다. 그리고 우리가 지금 쓰는 iTerm2, Windows Terminal, Alacritty 같은 프로그램들은 모두 이 VT100의 동작을 소프트웨어로 흉내 내고 있다. 그래서 이름이 Terminal Emulator인 것이다.
갑자기 모든 게 명확해졌다. 내가 맥북에서 쓰는 iTerm2는 1970년대 하드웨어를 시뮬레이션하는 프로그램이었다. 마치 닌텐도 에뮬레이터로 슈퍼마리오를 하듯이, 나는 50년 전 타자기 경험을 재현하고 있었던 것이다.
리눅스에서 tty 명령어를 치면 이런 게 나온다:
$ tty
/dev/pts/3
이게 뭘까? /dev/pts/3은 PTY(Pseudo-Terminal, 가짜 터미널) 디바이스 파일이다. 리눅스는 모든 걸 파일처럼 다루기 때문에, 터미널도 파일처럼 취급한다.
/dev/tty: 현재 프로세스와 연결된 터미널을 가리키는 심볼릭 링크 같은 것/dev/pts/N: GUI 환경에서 생성된 가짜 터미널들/dev/ttyN: 물리적 콘솔이나 시리얼 포트 (Ctrl+Alt+F2로 진입하는 텍스트 콘솔)GUI 환경(macOS, Windows, GNOME)에서 터미널 에뮬레이터를 실행하면, 다음과 같은 일이 벌어진다:
비유하자면: 에뮬레이터는 "전화 교환원"이고, 쉘은 "전화 상담원"이다. 사용자가 말하면 교환원이 받아서 상담원에게 전달하고, 상담원이 답변하면 교환원이 다시 사용자에게 전해준다. PTY는 그 사이를 연결하는 전화선인 셈이다.
stty 명령어는 터미널의 동작 방식을 설정한다. 예를 들어:
# 현재 터미널 설정 보기
$ stty -a
# 입력한 비밀번호 숨기기 (echo 끄기)
$ stty -echo
$ read password
$ stty echo
# 터미널 크기 확인
$ stty size
50 180
이런 설정들은 옛날 하드웨어 터미널 시절부터 내려온 것이다. 예를 들어 erase 설정은 백스페이스 키가 어떤 문자를 보내야 하는지 정의한다. 옛날엔 터미널마다 백스페이스가 ^H 또는 ^?로 다르게 전송됐기 때문이다.
SSH로 원격 서버에 접속할 때, -t 옵션을 보면 이렇게 나온다:
ssh -t user@server sudo vim /etc/hosts
-t 옵션은 "PTY를 강제로 할당해줘"라는 뜻이다. 왜 필요할까?
일부 프로그램(vim, sudo, top)은 상호작용 터미널(interactive terminal)이 있을 때만 제대로 작동한다. PTY가 없으면 "표준 입력이 터미널이 아님(stdin is not a tty)"이라는 에러가 뜬다.
터미널을 여러 개 띄우는 대신, 하나의 터미널 안에서 여러 세션을 관리하는 도구가 터미널 멀티플렉서다. 대표적으로 tmux와 screen이 있다.
# tmux 시작
$ tmux
# 새 창 만들기: Ctrl+b c
# 창 전환: Ctrl+b 0, Ctrl+b 1
# 화면 분할 (수평): Ctrl+b %
# 화면 분할 (수직): Ctrl+b "
# 세션 나가기 (백그라운드): Ctrl+b d
# 다시 붙기
$ tmux attach
비유: 터미널 에뮬레이터가 "집"이라면, tmux는 집 안에 있는 "방들"이다. 하나의 집(iTerm2) 안에서 여러 방(tmux 세션)을 오가며 일할 수 있다.
tmux가 특히 유용한 건 SSH 연결이 끊겨도 세션이 살아있다는 점이다. 원격 서버에서 긴 작업을 돌리다가 와이파이가 끊겨도, 다시 접속해서 tmux attach만 하면 작업이 그대로 이어진다.
이제 이 셋을 명확히 구분할 수 있다:
/dev/console 파일이 이것이다.비유: 터미널은 "전화기", 쉘은 "통화 상대", 콘솔은 "사무실 대표 전화"다.
최근 몇 년간 터미널 에뮬레이터는 급격히 진화했다. 50년 전 타자기를 흉내 내는 도구에서, 이제는 GPU 가속과 AI 기능까지 들어간 첨단 소프트웨어가 됐다.
전통적인 터미널 에뮬레이터(iTerm2, GNOME Terminal)는 CPU로 텍스트를 렌더링한다. 그런데 텍스트를 빠르게 스크롤하거나 큰 로그를 출력하면 버벅인다.
Alacritty와 Kitty는 OpenGL을 사용해 GPU로 렌더링한다. 덕분에 엄청나게 빠르다. 수만 줄의 로그를 출력해도 부드럽게 스크롤된다.
Warp는 아예 AI를 터미널 안에 집어넣었다. 명령어를 자연어로 물어보면 AI가 실제 명령어를 생성해준다. 예를 들어 "5MB보다 큰 파일 찾아줘"라고 하면 find . -size +5M를 만들어준다.
또한 Warp는 명령 입력을 블록 단위로 관리한다. vim처럼 편집하듯이 명령어를 수정할 수 있고, 각 명령의 출력도 블록으로 묶여서 보기 편하다.
Windows는 오랫동안 터미널이 형편없었다. cmd.exe는 2025년에도 1980년대 MS-DOS 느낌이었다. 그러다가 2019년, 마이크로소프트가 Windows Terminal을 오픈소스로 공개했다.
이제 Windows에서도 iTerm2 수준의 경험을 할 수 있게 됐다.
터미널의 역사를 공부하면서 가장 놀라웠던 건, 50년 전 설계가 아직도 유효하다는 점이었다.
GUI는 직관적이고 예쁘다. 하지만 원격 서버를 관리하거나, 스크립트를 작성하거나, 복잡한 명령을 조합할 때는 텍스트 스트림만큼 강력한 게 없다. 마우스 클릭으로는 "지난주에 수정된 10MB 이상 파일 중 TODO 주석이 있는 파일"을 찾을 수 없다. 하지만 터미널에서는 한 줄이면 된다.
find . -mtime -7 -size +10M -type f -exec grep -l "TODO" {} \;
그래서 우리는 여전히 검은 화면을 쓴다. Rust로 짠 초고속 GPU 가속 터미널이든, AI가 들어간 미래형 터미널이든, 결국 다 1960년대 텔레타이프를 흉내 내는 것이다.
기술이 발전해도 본질은 변하지 않는다. 텍스트라는 인터페이스, 파일이라는 추상화, 파이프라는 조합 방식. 이것들이 지금까지도 최고의 도구인 이유다.