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

p4v-tui

끊겨도 이어지는 키보드 우선 터미널 Perforce 클라이언트

명령 모니터 화면입니다. 부모 작업과 자식 명령이 트리로 배열되고 각 작업의 진행 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에 맡기고 체감 성능 층을 실측으로 다듬는 쪽이 될 수 있습니다.

← 프로젝트로 돌아가기