레거시 개발자의 첫번쩨 바이브코딩 체험기(디지털노마드 2탄)

시도하고자 했던 것과 그 이유를 알려주세요.

"바이브 코딩"에 적응하지 못했던 백엔드 개발자였습니다.
하지만 바이브코딩이 피할 수 없는 파도라면, 타는 법을 배워야 겠다 싶기는 했으나,

문제는, 뭘 만들어야 할지 몰라 미루다 미루다..
이제서야 하나 만들어 보았네요. 자신이 필요한 걸 만드는게 최선입니다.~

이전 사례글 에서
https://www.gpters.org/nocode/post/claude-code-telegram-gugeulkeuromweongyeogpeurogeuraem-eul-iyonghan-QUtP1cAKstfgUA3
텔레그램이랑
구글크롬원격 프로그램으로 디지털노마드 환경을 만들기는 했는데,
실제로 외부에서 모바일(스마트폰,갤럭시탭)로 구글크롬원격을 쓰는 게 좀 불편했습니다.
특히나, 새로운 대화를 만드는 건 단순히, 계속해, 다음 작업은 수준의 간단 명령어 입력과는 다른 차원이었습니다.

그러다, 예전에 웹 화면에서 터미널을 연결했던 프로그램들이 있었던게 생각나서 개발을 시작했습니다.


진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

AntiGravity에서 Claude Code 내에서 GLM 모델을 이용해서 만들었어요.
실제 인터넷 환경에서의 서비스를 위해 cloudflared 원격 터널링을 통해서 로컬 웹 서버를 서비스 합니다.


첫번재 프롬프트.

"웹에서 로컬 맥 터미널을 대체할 수 있는 프로그램을 만들고 싶어."

AI가 대답했습니다.

"Next.js랑 xterm.js, WebSocket을 쓰면 됩니다."

그래서 Next.js 최신 안정화 버전 기준으로 PRD 만들어 달라고해서
개발하기 시작하기는 했으나,

"로그인 기능 추가해줘."
"여러 터미널 동시에 띄울 수 있게 해줘."
"세션 히스토리 저장하게 해줘."

와 같이 계속해서 추가 기능이 필요해 지더라구요.

시행착오

근데 터미널 영역이 제대로 안 보이는 거였습니다.
문제는 터미널의 크기가 웹 화면에서 너무 작게 설정돼서 잘 안보이는 문제가 발생한거데,
아무리 해줘 해줘 떼를 써봐도 AI가 못 하더라구요..

그래서 제가 직접 뛰어들었습니다. 웹 화면에서 개발자 도구를 열고, 터미널 영역의 HTML selector를 찾아서 AI한테 알려줬습니다.

블루 스크린과 블랙 스크린이 있는 화면의 스크린샷

Element 영역에서 마우스 우클릭 -> Copy -> Copy Selector 로 터미널 영역에 대한 selector 추출

"이 selector에 해당 하는 영역의 크기를 화면 크기 전체를 이용할 수 있도록 키워줘"
그때서야 원하는 대로 나오더라고요.

더 어려웠던건, 터미널에 한글 입력 문제였습니다.
한글 IME 조합이 어려워서 입력이 잘 안 됐습니다.
이 부분은 2배의 떼를 써는데도 AI가 못했습니다.

여러 시도 끝에 구글원격프로그램에서 아이디어를 얻었습니다.
구글원격프로그램도 화면 하단에 입력 영역을 활성화 시키는 방법이 있거든요

그래서 터미널에 직접 입력하지 않고,
HTML textarea로 입력을 받기로 했습니다.
위 이미지 보시면 좌측 터미널 하단에 입력 영역 보이시죠~
그제서야 한글 입력이 제대로 되었습니다.

Cloudflare 터널 연결 작업
진짜 외부에서 사용하기 위해, Cloudflare 터널 연결 작업을 해야 합니다.
선행조건 : 도메인 확보, cloudflared 가입

cloudflared 환경설정은 아래 글의 5.cloudflared 가입 및 설정 참고하시면 됩니다.
https://www.gpters.org/nocode/post/n8n-ai-starter-kit-v0bpRGz82e7YLZi

저는 이미 연결이 되어 있어서.
.cloudflared/config.yml 에 서브도메인과 로컬주소:포트 등록해주고,

cloudflared tunnel route dns 터널이름-tunnel 서브도메인
명령어 날려서 연결해 주었습니다.


잘 되는지 확인해 볼까요?
접속과 로그인까지는 되네요~

Mac의 로그인 화면 스크린샷
Mac의 로그인 화면 스크린샷
컴퓨터 채팅창의 스크린샷

실제 외부 인터넷에서 접속하면 오류 발생했습니다.

컴퓨터 채팅창의 스크린샷
  • localhost 때문에 여러 문제가 발생할 수 있어요. 개념을 명확히 잡아 두세요.

  • 위 내용은 하드코딩 된 주소값 대신, 브라우저에서 정보를 가져다가 해결했다는 내용입니다.


주요 기능

  • 로그인/인증 (JWT) - 개인 사용을 위한 .env 기반 인증 (ID/암호화된 PW 설정) : 저만 쓸거라 하드코딩

  • 여러 터미널 동시에 띄우기 (탭으로 관리) - 작업 효율을 위한 멀티 세션 지원

  • 실시간 통신 (WebSocket) - 터미널 입출력을 실시간으로 동기화

  • 세션 히스토리 저장/복원 - 작업 중단 후 이어하기 기능

  • 한글 입력 지원 (textarea 방식) - 한글 IME 조합 문제 해결

  • 특수키 전송 - enter, esc, shift + tab

  • 입력어 히스토리 - 화살표 위, 아래

MVP 수준이라서 기능을 좀 더 보강 중입니다.

구현 너머

화면이 완성되었다고 만족하지 마세요.
prd에는 어떤 기술을 사용할지 정도의 칼을 쥐어 줬다면,
그 칼을 어떻게 휘두르는지도 알아 합니다.

제품 구조에 대한 아키텍쳐 및 구성요소에 대해서 상세히 설명해줘.
itda-claude-web 아키텍처 개요
📐 전체 구조도

┌─────────────────────────────────────────────────────────────────┐
│                         itda-claude-web                         │
├─────────────────────────────────────────────────────────────────┤
│                                                                   │
│  ┌─────────────────┐        ┌─────────────────┐                 │
│  │   Next.js App   │ ←────→ │  Socket.IO      │                 │
│  │   (Port 9998)   │        │  Server         │                 │
│  │                 │        │                 │                 │
│  │  • Terminal UI  │        │  • Session Mgr  │                 │
│  │  • xterm.js     │        │  • PTY Process  │                 │
│  │  • React 19     │        │  • Auth/JWT     │                 │
│  └─────────────────┘        └─────────────────┘                 │
│         │                           │                            │
│         │        WebSocket          │                            │
│         └───────────────────────────┘                            │
│                          │                                       │
│                          ▼                                       │
│                  ┌─────────────────┐                             │
│                  │  node-pty       │                             │
│                  │  (Shell Proc)   │                             │
│                  └─────────────────┘                             │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘
🏗️ 핵심 아키텍처 패턴
1. 단일 포트 통합 아키텍처
Socket.IO 서버와 Next.js가 하나의 포트(9998)에서 함께 운영
Cloudflare 터널링을 위한 유연한 호스트 구성
2. 클라이언트-서버 분리
서버: 세션 상태 관리 (SSOT - Single Source of Truth)
클라이언트: 상태 표시 및 사용자 입력만 담당
3. 세션 지속화 패턴

서버 재시작
    ↓
.sessions-state.json 복구 → 메타데이터만 복원
    ↓
PTY 자동 재생성 → join_session 시
    ↓
버퍼 내용 유지 → 사용자 경험 연속성

🔌 통신 플로우
WebSocket 이벤트 흐름
방향	이벤트	설명
C→S	connect	JWT 인증
C→S	create_session	새 터미널 생성
C→S	join_session	기존 세션 참가
C→S	input	키보드 입력 전송
C→S	resize	터미널 크기 조정
C→S	heartbeat	연결 유지 (30초)
S→C	session_list	활성 세션 목록
S→C	output	터미널 출력
S→C	status_change	세션 상태 변경
🗂️ 주요 파일별 역할
서버 사이드
파일	역할	핵심 기능
server/index.js	진입점	Socket.IO + Next.js 통합
server/session-manager.js	세션 관리	PTY 생성, 버퍼링, 상태 저장
server/socket-handler.js	이벤트 핸들러	WebSocket 이벤트 처리, 인증
server/lib/auth.js	인증	JWT 생성/검증
server/lib/security.js	보안	입력 검증, 속도 제한
클라이언트 사이드
파일	역할	핵심 기능
src/app/terminal/page.tsx	메인 페이지	Ocean Depth UI, 세션 탭
src/components/terminal/Terminal.tsx	터미널	xterm.js 래퍼
src/hooks/useSession.ts	세션 훅	WebSocket 연결 관리
src/hooks/useAuth.ts	인증 훅	로그인/로그아웃 상태
src/lib/terminal-formatter/	포매터	ANSI 코드 처리
🔐 보안 아키텍처

┌──────────────────────────────────────────────────────────┐
│                    Security Layers                       │
├──────────────────────────────────────────────────────────┤
│  1. JWT 인증         → 토큰 기반 세션 접근 제어          │
│  2. 속도 제한         → DDoS/스팸 방지                    │
│  3. 입력 검증         → SQL 인젝션/명령어 인젝션 방지      │
│  4. 작업 디렉토리 검사 → 경로 순회 공격 방지               │
│  5. 세션 수 제한      → 리소스 과다 사용 방지 (최대 5개)   │
│  6. 유휴 세션 정리    → 30분 무활동 시 자동 삭제          │
└──────────────────────────────────────────────────────────┘
🎨 UI 아키텍처

Ocean Depth Theme
    │
    ├── Glassmorphism 패턴
    │   └── 반투명 배경, blur 효과
    │
    ├── xterm.js 터미널
    │   └── WebGL 렌더링 (성능 최적화)
    │
    ├── 분할 터미널
    │   ├── SplitPane (개별 창)
    │   └── SplitControls (제어)
    │
    └── 세션 탭 관리
        └── 다중 세션 전환
📦 기술 스택
계층	기술
프론트엔드	Next.js 15, React 19, Tailwind CSS, xterm.js
백엔드	Node.js, Socket.IO, node-pty
인증	JWT, bcrypt
언어	TypeScript
테스트	Playwright (E2E)
🔄 세션 라이프사이클

생성 → 활성 → 유휴(30분) → 만료(24시간) → 삭제
  │                              │
  │    ←─── 자동 재생성 ────     │
  │      (PTY 재시작 시)          │
  ↓                              ↓
버퍼 유지                      .sessions-state.json
🚀 주요 설계 원칙
SSOT (Single Source of Truth): 서버가 모든 세션 상태 보유
멱등성: 세션 복구 시 일관된 상태 보장
비동기优先: 이벤트 기반 비동기 통신
보안 기본: 모든 입력 검증, 인증 필수
UX 연속성: 서버 재시작에도 버퍼 유지

결과와 배운 점

배운 점과 나만의 꿀팁을 알려주세요.

개인적인 의미

사실 전 예전에 면접관으로 일할 때 이런 질문을 단골로 했습니다.

"개발자인데 스스로의 필요에 의해 만들어본 유틸리티나 프로그램 있나요?"
그런데 솔직히 고백하면, 저 자신도 그렇게 하지 못했습니다.

이번에 itda-claude-web을 만들고 나서, 그때 면접자들에게 조금은 면목이 셌습니다.
바이브 코딩 덕분에 앞으로 다시 면접을 본다면, 모범 답안 하나도 생겼네요.

핵심 인사이트

"AI는 내가 아는 만큼, 아이디어를 내는 만큼 내에서 컨트롤이 가능한 것 같습니다."

제가 HTML selector를 찾을 생각을 못 했다면, 입력영역분리 아이디어를 생각해 내지 못했다면
아마 이 프로그램은 폐기처분되었겠지요.

아직은 AI보다 사람이 나은 면이 있습니다.

개발 할 때 테스트 했다고 끝내지 말고, 운영환경에서도 꼭 테스트 하자.!!

사용 시 잇점
구글 원격 프로그램 제어하는 것보다 훨씬 쉽습니다.

원격 환경 작업 Tip
원격 환경에서 작업 후 작업을 계속 하고 싶을 때, 구요한 님이 만든 CmdTrace 앱을 이용하면 대화 내용을 볼 수 있습니다.
아주 유용합니다. 다만 claude code로 대화했었던 모든 대화들을 메모리에 올리기 때문에 좀 무겁긴 합니다.
필요할 때만 사용하시면 됩니다.

여러 항목이 표시된 검은색 화면

바이브코더들에게

일단 시작하세요. 나에게 필요한 걸 만드세요
눈으로만 봐서는 내것이 안되더라구요. 뭐든 만들어 봐야~~

AI가 뱉어주는 내용들을 다 읽어보세요.
휘리릭 지나가는 텍스트들이 처음에는 추상화처럼 보일 겁니다.
근데 계속 보다 보면 보입니다.

특히 PRD를 읽으세요.

AI가 작성한 요구사항 문서를 꼼꼼히 읽어보세요.
만들어진 결과물들을 설명하라고 해서, PRD와 비교하면서 또 읽어보세요
그게 바이브코딩으로 만들어진 프로그램을 이해하는 열쇠입니다.

4
4개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요