← 프로젝트 프로젝트 케이스 스터디

p4v-tui

끊겨도 이어지는 키보드 우선 터미널 퍼포스 클라이언트입니다

명령 모니터 화면입니다. 부모 작업과 자식 명령이 트리로 배열되고 각 작업의 진행 ETA가 함께 표시됩니다.
역할
1인 개발 — 기획·설계·구현 전반
기간
2026년 5월~현재
스택
Python 3.12+ · Textual · P4Python / p4 CLI · SQLite

셀룰러 네트워크에서 아이폰 Blink 터미널로 수만 개 파일을 받다가 연결이 끊깁니다. p4v는 이 작업을 긴 호출 하나로 처리하다가 연결이 끊기면 처음부터 다시 시작합니다. p4v-tui는 같은 상황을 다르게 다룹니다. 모든 긴 작업을 작은 청크로 나누고 파일 단위 진행 상태를 디스크의 ~/.p4v-tui/sync-state/에 저장합니다. 동기화 도중에 앱을 종료해도 다음 실행에서 멈춘 지점부터 재개합니다. 중단된 작업은 시작 시점의 재개·폐기 선택 화면에서 하나씩 고를 수 있습니다. 1초에서 30초까지 지수적으로 간격을 늘리면서 자동으로 재연결하고 서브밋은 응답을 받지 못한 경우에도 p4 changes로 확인해 중복 제출을 피합니다.

게임디자이너로서 이 프로젝트에서 가장 신경 쓴 부분은 사용자 경험 설계입니다. 느리고 불안정한 연결에서 실제 속도와 체감 속도는 서로 다른 문제입니다. 셀룰러에서 p4 changes 한 번에 1.2초가 필요한 것은 정상입니다. 문제는 그 1.2초 동안 사용자가 무엇을 보느냐입니다. 그래서 체감 성능을 별도의 설계 대상으로 두었습니다. 작업이 150밀리초 안에 끝나면 아무 표시도 하지 않아 깜빡임을 없애고 그보다 길어지면 활동 표시와 함께 라벨이 단계적으로 올라갑니다. 1초를 넘으면 서버가 느리다는 문구로 바뀌고 재연결 중에는 연결 바가 시도 횟수를 보여 줍니다. 대기 목록의 자동 새로고침은 최근 응답 지연을 반영해 느린 연결에서 간격을 늘립니다. 파일 액션은 실행 즉시 해당 행에 진행 표시를 그렸다가 서버 응답으로 실제 상태를 다시 채웁니다.

기능 폭은 p4v의 일상 워크플로를 커버합니다. 동기화·편집·서브밋·리버트·reconcile·히스토리가 모두 앱 안에서 돌아갑니다. reconcile과 clean은 미리보기에서 파일을 하나씩 켜고 끄는 대화형으로 선택한 뒤 청크로 실행합니다. 여러 워크스페이스에 걸친 대기 체인지리스트를 한 화면에 모으고 원격 항목은 표시로 구분합니다.

키보드 우선 원칙은 좁은 터미널과 한글 환경까지 이어집니다. 폭이 100셀 아래로 내려가면 레이아웃이 한 번에 한 페이지를 채우는 단일 페이지 내비게이터로 바뀝니다. Blink 같은 모바일 터미널은 Ctrl 화살표 시퀀스를 보내지 않고 Tab은 보내므로 페이지 순환을 Tab에 두었습니다. 단축키는 한글 IME를 켠 상태에서도 동작합니다. 2벌식 자모 별칭을 두어 e 대신 으로 r 대신 으로도 같은 동작을 실행합니다.

백엔드는 P4Python을 우선 쓰고 휠을 설치할 수 없는 환경에서는 p4 CLI로 자동 전환합니다. 둘은 같은 인터페이스 뒤에 있어 재연결과 재시도 루프를 공유합니다. 인증은 앱 밖의 p4 login에 맡겨 보안 경계를 한곳에 둡니다. 혼자 기획부터 설계와 구현까지 진행한 프로젝트입니다. 남은 작업은 관리·스펙 편집 기능을 계속 p4 CLI에 맡기고 체감 성능을 실측으로 다듬는 쪽이 더 잘 맞을지 모릅니다.

← 프로젝트로 돌아가기