개인용 퍼포스 사용기 및 영업

의외로 개인이 파일 버전을 관리하기에 퍼포스가 적절합니다. 여느 도구에 비해 여러 가지 장점이 있고 또 무료입니다.

개인용 퍼포스 사용기 및 영업

반 년 전에 개인 파일 관리에 다른 도구를 전전하다가 결국 퍼포스를 선택했다는 이야기를 했습니다. 이미 어지간한 거의 모든 기록은 컨플루언스 위키에 하고 있기 때문에 파일을 잘 만들지 않기는 하지만 그렇다고 파일 모양으로 된 데이터가 아예 없는 것은 아닙니다. 컨플루언스는 텍스트를 기록하기에 아주 강력하지만 윈도우 노트패드만큼 순식간에 띄울 수 있지 않습니다. 하루에도 여러 장 씩 만들어지는 사진 역시 파일 모양이며 오피스 소프트웨어의 작업 결과 역시 파일 모양입니다. 처음에는 이들 중 스스로 제공하는 버전 관리 기능에 의존하곤 했습니다. 가령 워드는 파일 하나에 대한 자체적인 버전 관리를 제공하는데 워드만으로 버전 사이에 차이점을 볼 수도 있고 특정 차이점은 적용하고 어떤 차이점은 적용하지 않은 새 버전을 만들어낼 수도 있습니다. 하지만 도구에 따라 어떤 도구는 자체 버전 관리를 제공하고 어떤 도구는 제공하지 않는 상황에서 도구에 의존하지 않는 버전 관리 기능이 필요하다고 생각했습니다.

아주 오래 전에는 적당한 곳에 ‘VisualSVNServer’를 설치해 놓고 SVN을 사용했는데 나쁘지 않았습니다. 윈도우 익스플로러에 통합된 인터페이스도 나쁘지 않았고 파일을 변경한 다음 커밋 해 놓으면 나중에 어느 버전으로도 돌아갈 수 있었을 뿐 아니라 엔지니어들이 그렇게 하듯 파일시스템 일부를 브랜치로 설정해 서로 다른 두 가지 프리젠테이션을 만들어 한 쪽으로 결정하는 식으로 사용할 수 있어 좋았습니다. 다만 SVN을 사용한 시간이 길어지자 오래된 리비전이 종종 안전하게 보존되지 않는다는 사실을 별로 알고 싶지 않은 상황에서 알게 됩니다. 아마도 시간이 많이 흐른 지금은 말끔하게 해결되었을 것 같지만 당시에는 오래된 리비전에 제대로 접근할 수 없다는 사실을 깨달은 순간 머릿속이 멍해지고 서버 상의 리비전 단위로 저장된 이 거대한 파일 무더기가 다 무슨 소용인가 싶었습니다. 하지만 마땅한 다른 방법이 없었던 관계로 계속해서 이 체계를 유지했는데 어쨌든 아주 오래된 거대한 몇몇 리비전을 제외하고는 과거의 파일에 계속해서 접근할 수 있었고 저에게는 사용하는 도구에 관계 없이 항상 버전 관리를 할 수 있는 도구가 반드시 필요하다는 생각을 굳게 만들어준 도구이기도 합니다.

누군가는 이런 질문을 할 수도 있습니다. 현대에 드랍박스나 원드라이브 같은 도구는 파일이 변경될 때 알아서 실시간으로 백업해주고 또 일정 기간에 걸쳐 변경된 파일 모두를 저장하고 있어 굳이 직접 파일을 수정한 다음 커밋 하지 않아도 버전 관리를 할 수 있는데 뭐하러 별도의 버전 관리 도구를 사용하느냐는 질문이 나올 법도 합니다. 사실 한동안 드랍박스를 사용하며 드랍박스의 버전 관리 기능에 의존했는데 이전 버전이 필요하다고 판단한 순간 드랍박스는 생각보다 꽤 잘 작동했습니다. 드랍박스는 저를 웹 인터페이스로 안내한 다음 이전에 파일에 큰 변경이 여러 차례 일어난 시점으로 안내한 다음 버전을 검토하게 했고 그 중 하나를 선택하자 로컬 파일이 어느새 선택한 시점의 파일로 변경 되어 있습니다. 이런 기능은 평소에는 잘 사용할 일이 없고 또 웬만하면 그런 상황을 겪고 싶지도 않지만 1년에 한 번 정도는 저를 지옥 입구에서 끄집어내줍니다. 그런데 드랍박스가 알아서 파일이 변경될 때마다 이를 백업해 주는 동작과 제가 직접 특정 시점에 파일을 커밋하는 행동은 드랍박스가 명시적이지 않은 형태로 같은 작업을 수행하느냐와 제가 명시적인 형태로 같은 작업을 수행하느냐 사이에 큰 차이가 있습니다.

드랍박스나 원드라이브의 버전 관리 기능은 파일이 변경될 때마다 파일을 서버로 보내 각각의 버전을 기록합니다. 이들은 파일이 변경되었다는 사실은 알지만 이 변경이 얼마나 중요한 변경인지는 알 수 없습니다. 어느 날은 그저 프리젠테이션 파일에 이미지 여러 장을 추가해 용량이 10메가에서 240메가로 늘어났지만 파일에 추가한 이미지는 별도 경로에 복사본을 가지고 있기 때문에 이 버전은 별로 중요하지 않을 수도 있습니다. 하지만 드랍박스 입장에서는 파일이 크게 변경되었을 뿐 아니라 편집이 여러 번 일어났으므로 나중에 복구를 시도할 때 이 시점을 중요한 시점으로 생각해 이 지점의 파일을 검토하라고 저를 안내할 수도 있습니다. 하지만 SVN 같은 별도의 버전 관리 도구는 제가 능동적으로, 또 명시적으로 커밋하는 시점에만 파일을 서버에 보내는데 이 행동은 귀찮게 느껴질 수 있지만 제가 한 작업을 작업의 맥락 단위로 서버에 보낼 수 있어 문제가 생겨 이전 버전들을 살펴봐야 할 때 각 버전은 맥락 단위로 나뉘어 있을 뿐 아니라 제가 직접 기록한 작업 내역을 참고해 살펴볼 정확한 이전 버전을 훨씬 더 쉽게 찾을 수 있습니다.

또한 동기화 시점을 명시적으로 선언할 수 있는 점 역시 드랍박스보다 별도의 버전 관리 도구를 선호하게 된 이유입니다. 드랍박스는 일단 드랍박스 안에 있는 모든 파일을 검사하다가 파일이 변경되면 즉시 서버로 보내고 또 서버로부터 변경을 감지하면 즉시 변경된 파일을 다운로드 합니다. 이런 동작은 사실 신경 쓰지 않아도 항상 여러 기계에 걸쳐 파일이 최신으로 유지된다는 대단한 장점이지만 종종 이렇게 하고 싶지 않을 때가 있습니다. 가령 집에 있는 사양이 높고 또 충분한 스토리지를 붙여 놓은 기계에는 모든 파일을 동기화하지만 스토리지가 부족한 랩탑에는 일부 랩탑에서 잘 사용하지 않을 거대한 파일을 동기화 하지 않도록 설정하고 싶기도 하고 또 회사에서는 타사의 영업비밀을 침해하지 않을 거라는 사실에 서명하고 이를 지키기 위해 타사의 영업비밀로 인식될 수 있는 파일을 동기화 하고 싶지 않을 수도 있습니다. 드랍박스나 원드라이브는 당연히 이런 설정을 지원하고 있지만 이 설정 역시 한 번 설정해 둔 다음부터는 다시 신경 쓰지 않아도 항상 모든 파일을 최신으로 유지하는 모드로 돌아가기 때문에 항상 동기화 할 파일과 동기화 하지 않을 파일을 명확하게 구분하고 이 목록이 잘 변하지 않는 상태가 되도록 디렉토리 구조를 관리해야만 합니다.

반면 SVN이나 퍼포스 같은 본격적인 버전 관리 도구는 애초에 이 모든 동작은 제가 실행하기 전에는 저 혼자 동작하지 않습니다. 최신 파일을 동기화 하고 싶으면 동기화를 원하는 위치에서 정확히 동기화 명령을 내려야만 동기화 됩니다. 물론 이는 드랍박스처럼 신경 쓰지 않아도 알아서 동기화 되는 대신 제가 명시적으로 동기화 명령을 내려야만 하고 반대로 제가 파일을 수정한 다음 명시적으로 파일을 커밋해야만 서버에 동기화 됩니다. 하지만 명시적으로 제가 원하는 시점에만, 제가 원하는 경로만 동기화 할 수 있다는 점은 서로 다른 여러 기계를 사용할 때 필요한 파일을 받아 작업하고 다시 커밋하기를 계속하는 환경에서 각각의 파일 변경에 맥락을 부여하고 이 맥락을 제가 원하는 정확한 시점마다 서버에 보낼 수 있어 좋았습니다. 또 파일 자체를 하나 더 만들어 복사본을 유지하며 두 버전을 서로 다른 정책으로 편집하고 이들 각각을 유지하는 워크플로우는 종종 두 파일을 헛갈려 다른 파일에 해야 하는 수정을 엉뚱한 파일에 하도록 만들기도 하지만 버전 관리 도구는 이런 상황에 파일 단위, 디렉토리 단위로 브랜치를 만들 수 있어 근본적으로 이런 실수를 하지 않게 만들어줄 뿐 아니라 이런 환경이라도 실수하더라도 다른 브랜치로 전환하거나 이전 버전으로 되돌아갈 수 있게 해 줘 아주 안전합니다.

이런 배경에서 한동안 회사에서 사용하던 깃(Git)을 드랍박스 대신 본격적인 버전 관리 도구로 사용해 보려고 했는데 깃은 애초에 그러라고 만든 도구가 아니라는 사실을 꽤 비싼 댓가를 치른 다음에야 깨달았습니다. 깃은 처음부터 텍스트 기반의 소스 파일을 다루기 위한 목적으로 만들어졌습니다. 깃의 세계에서 1메가보다 더 큰 텍스트 파일은 뭔가 일이 잘못 되어 가고 있다는 신호로 볼 수 있습니다. 단일 코드 파일이 그렇게 커졌다면 파일 관리에 실패하고 있거나 설계가 이상하거나 기능 단위의 코드 분할에 실패하고 있을 수 있습니다. 덕분에 1메가보다 작은 텍스트 파일을 다룰 때 깃은 정말 번 개같이 동작합니다. 특히 이전 버전의 모든 파일을 로컬에 저장하고 있어 여러 파일을 동기화하거나 다른 브랜치로 전환할 때 정말 빨리 동작합니다. 하지만 저는 가끔 텍스트 파일을 다루기는 하지만 엔지니어가 아니어서 거의 모든 파일이 텍스트이지는 않습니다.

오피스 파일, 사진 파일, 압축 파일이나 음원 파일은 모두 바이너리 포멧일 뿐 아니라 종종 크기가 엄청나게 큽니다. 가령 제가 즐겨 사용하는 발사믹 와이어프레임은 기본 심볼로만 작업하면 파일은 몇 십 킬로바이트 선에서 만들어지지만 게임 스크린샷이라도 한 장 넣는다면 파일은 순식간에 몇 메가가 되며 한 시스템의 전체 인터페이스를 제안하기 위해 다양한 와이어프레임과 스크린샷을 포함하면 수 백 메가가 되기도 하는데 이런 상황에 깃은 정말 어울리지 않았습니다. 속도가 느리더라도 정상적으로 동작하기라도 한다면 그럭저럭 참고 쓸 수 있다고 생각했지만 깃은 커다란 바이너리 파일을 커밋할 때 종종 멈추고 제가 해결할 수 없는 에러 메시지를 내뿜기도 하고 다른 기계에서 커밋한 파일을 가져오다가 실패하기도 하는 등 온갖 추태를 일삼았습니다.

또 작은 텍스트 파일을 다룰 때는 로컬에 모든 버전을 가지고 있다는 점이 장점일 수 있었지만 수 백 메가 짜리 파일을 하루에 여러 번 수정해 커밋하는 시나리오에서는 이들을 모두 로컬에 가지고 있다는 것 자체가 말이 안 되는 상황을 만듭니다. 저는 그저 파일 각각의 최신 버전 만을 들고 있어 각 기계마다 크지 않은 스토리지만으로 연명하고 있었는데 깃에 바이너리 파일을 커밋하기 시작하자 깃은 순식간에 이전 버전 데이터베이스로 스토리지를 채워 버렸고 모든 기계에 충분히 큰 스토리지를 사용하기를 요구합니다. 물론 제가 싼 기계만을 사용한다면 응할 수도 있었겠지만 그 중에는 스토리지 비용이 높기로 악명 높은 맥이 끼어 있어 모든 기계에 충분히 큰 스토리지를 사용할 수는 없었습니다.

이런 온갖 고통 끝에 바이너리 파일을 주로 다루는 비엔지니어 입장에서, 그리고 드랍박스와 달리 명시적으로 제가 원할 때 맥락을 포함한 코멘트와 함께 버전을 만들고 싶은 요구사항을 충족하는 도구로 퍼포스를 선택했고 이제 시간이 꽤 지납니다. 퍼포스를 처음 사용할 때와 현재 사이에 가장 크게 달라진 점은 서버를 클라우드에서 온프레미스로 변경한 점, 그리고 퍼블릭 인터넷에 노출되어 있던 서버를 테일스케일을 사용해 내부 네트워크로 이동 시킨 점입니다. 그 외에는 처음에 사용하기 시작한 환경을 그대로 유지하고 있습니다. 퍼포스는 사용자 최대 다섯 명, 워크스페이스 최대 스무 개 까지 무료로 사용할 수 있고 그 외의 제한이 없습니다. 지금은 사용자 세 명, 워크스페이스 여섯 개를 사용하고 있는데 스토리지 크기에 제한이 있지는 않기 때문에 현재 규모에서 퍼포스에 돈을 내는 상황이 발생하지는 않을 것 같습니다. 또 AWS에 있을 때는 스토리지에 큰 비용을 지출해야 해서 난감했는데 온프레미스로 옮긴 다음에는 꽤 큰 스토리지와 충분한 성능을 사용하면서도 비용이 낮고 또 맥미니의 전력 소모량 역시 적어 비용이 크게 낮아졌습니다. 그러는 사이에 퍼포스는 깃과는 달리 바이너리 파일을 아무리 많이 올려도 군말 없이 동작했고 여러 기계에 파일을 명시적으로 동기화하려는 의도에 맞게 동작할 뿐 아니라 앞서 소개한 여러 기계에 걸쳐 서로 다른 영역의 동기화를 명시적은 파일 목록을 통해 지원해 파일 버전 관리와 동기화에 관한 한 거의 모든 것을 제 의도에 맞게 통제할 수 있게 해 주었습니다.

처음에는 퍼포스를 바이너리 파일을 잘 다루는 버전 관리 도구로만 생각하고 사용했지만 어느 시점부터는 제가 컴퓨터를 사용해 어떤 행동을 할 때 그 행동을 기록하는 용도로 전용하기 시작했습니다. 컴퓨터 앞에서 작업할 때 제가 직접 텍스트를 만들어내는 상황이라면 컨플루언스를 사용하지만 위키에 기록할 만한 작업을 하는 것이 아니라면 작업 과정을 남기기 좀 까다로울 때가 있습니다. 오피스 파일을 만들 때처럼 직접적으로 파일을 생성하고 있다면 앞에서 설명한 대로 파일을 수정하며 일정한 맥락을 달성할 때마다 그 상태를 서브밋 해 새 버전을 생성할 수 있습니다. 하지만 어떤 페이지를 읽고 있거나 블로그에 글을 옮겨 쓰고 있는 등 특별히 파일 단위로 표현 되지 않는 행동을 기록하기는 쉽지 않습니다. 사실 이런 행동은 굳이 기록할 필요가 없기도 하고 거의 모든 사람들이 그런 행동을 굳이 기록하지 않습니다.

주의력이 부족한 사람의 일상 기록에서 온갖 방법을 동원해 제가 하는 행동을 기록한다는 이야기를 했었는데 퍼포스 역시 시간이 지남에 따라 비슷한 역할을 하기 시작했습니다. 가령 오늘 뉴스레터에 올릴 여러 글을 작성하면서 글을 작성할 때마다 상황을 퍼포스에 고스트 백업 모양으로 등록하고 있습니다. 새 글을 하나 만들 때마다 새 백업 파일이 생기고 이 파일은 퍼포스에 한 리비전 모양으로 올라갑니다. 이들을 여러 파일을 한 번에 볼 수 있는 ‘Submitted’ 뷰를 통해 살펴보면 하루 종일 컴퓨터 앞에서 제가 어떤 행동들을 했고 그 행동의 근거가 되는 파일들을 조회해볼 수 있어 큰 도움이 됩니다.

비슷한 맥락에서 이전에는 여러 스크랩 도구를 전전하곤 했습니다. RSS를 긁어다가 읽기 편한 모양으로 만들어주는 도구를 사용하기도 하고 명시적으로 페이지를 스크랩하면 이를 저장했다가 여러 기계에서 보여주는 서비스를 사용해보기도 했는데요, RSS는 망한다. 아니 망했다에서 주장한 대로 RSS는 여러 웹사이트로부터 안정적으로 글을 획득할 수 있는 좋은 방법이 아니며 스크랩 서비스는 스크랩 된 페이지를 실제로 저장하고 이들에 대한 검색을 위해서는 비용을 지불해야 했는데 제 관점에서 이 서비스에 비용을 내는 건 썩 좋은 생각이 아니라고 느꼈습니다. 문득 제가 하고 싶은 일은 그저 웹에서 마주친 글을 스크랩했다가 나중에 읽고 아카이빙 하는 것 뿐인데 이런 작업 역시 그냥 퍼포스에 의존할 수 있겠다는 생각을 했습니다. 그래서 브라우저 익스텐션으로 페이지를 html 포멧으로 저장한 다음 그냥 이들을 한 디렉토리에 서브밋 해 놨다가 시간이 날 때 읽은 다음 다른 디렉토리로 옮겨 아카이빙 해 놓고 있습니다. 이 과정마다 서브밋을 반복하기 때문에 무슨 글을 스크랩했는지, 무슨 글을 읽었는지, 어떤 글들을 아카이빙 했는지를 모두 기록으로 볼 수 있고 글들이 여전히 로컬에 파일 모양으로 남아 있으니 이들로부터 검색을 하는 것은 문제도 아닙니다.

또 여러 기계에 걸쳐 설정을 동기화 하는데도 활용합니다. 가령 윈도우의 여러 귀찮은 기능을 꺼 버릴 수 있는 'O&O ShutUp10++'라는 유틸리티가 있습니다. 시간이 흐를수록 윈도우는 자신이 다른 소프트웨어를 동작하게 만드는 기반이라는 사실을 망각하고 아무 때나 튀어나와 작업을 방해하고 주의를 잃게 만드는 등 온갖 쓰레기 같은 짓을 하고 있습니다. 이럴 때 저 유틸리티를 사용해 윈도우가 제 주의를 잃게 만드는 온갖 시도를 꺼 버릴 수 있는데 기왕이면 같은 설정을 서로 다른 여러 윈도우 기계에 적용할 수 있으면 좋겠다 싶었는데 이 유틸리티와 설정 파일을 퍼포스에 넣고 다른 기계에서 받은 다음 실행해 설정을 불러와 적용하면 되어 별도로 설정 동기화를 제공하지 않는 유틸리티라도 여러 기계에 걸쳐 설정을 동기화하고 유지할 수 있어 좋았습니다. 이 유틸리티 뿐 아니라 다른 몇몇 자잘한 유틸리티도 아예 실행파일을 퍼포스에 올려 놓고 설정 파일 역시 버전 관리 하고 있는데 새 버전이 나오면 실행 파일을 업데이트 하면 되고 한 기계에서 설정을 바꾸면 다른 기계에서 이 설정을 받아 적용하면 되어 여전히 설정 동기화를 직접 제공하는 유틸리티에 비해 불편할 수 있지만 제 관점에서는 이 동기화 과정을 직접 통제하고 관리할 수 있어 굉장히 마음에 듭니다.

퍼포스는 처음에 바이너리 파일을 군소리 없이 잘 관리해 주는 강력한 도구로 시작했지만 시간이 지나며 용도가 확장되어 작업 진행을 기록하고 문서를 스크랩하고 읽은 상태롤 기록할 뿐 아니라 추가로 비용을 들이지 않고 페이지를 모두 저장하고 있다가 텍스트 검색을 할 수 있을 뿐 아니라 기계 사이에 설정 동기화를 제공하지 않는 유틸리티라도 여러 기계 사이에 설정을 동기화하는 용도로도 사용하고 있습니다. 특히 이 모든 동기화 과정을 전적으로 제가 직접 통제할 수 있다는 점, 그리고 모든 동기화 내역이 각각의 서브밋 기록을 통해 모두 남아 있어 제가 실수했을 때 무슨 실수를 했는지 파악할 수도 있고 또 버전 관리 도구의 기본에 충실하도록 오래된 파일 버전을 되찾아 올 수 있는 기능 역시 확실하게 동작해 굉장히 만족스럽습니다. 또 서버 측에서 스토리지 사용량을 강력하게 직접 통제할 수 있는 장점도 있는데 이건 나중에 퍼포스 서버 관리에 대해 따로 소개하면 좋을 것 같습니다.

퍼포스는 주로 기업에서 사용하는 버전 관리 도구이지만 개인이 사용하기에 충분한 무료 사용 범위를 제공합니다. 또 깃과 달리 비엔지니어가 바이너리 파일을 다룰 때 아주 잘 동작해 깃을 사용할 때 겪던 온갖 이상한 문제로부터 완전히 해방되었습니다. 일단 제가 전적으로 통제할 수 있는 버전 관리 및 동기화 환경을 갖추자 웹 페이지 스크랩, 설정 동기화, 작업 기록 같은 파일에 근거한 다양한 영역으로 용도를 확장하고 있습니다. 의외로 퍼포스가 무료입니다. 퍼포스 쓰세요.