FileSharer 개발 노트 10 — 실행 파일에서 설치 프로그램까지, 배포도 하나의 기능이다

Read this article in English

FileSharer 개발 노트 · 10 / 10

세 개발자가 도구, 응용 프로그램과 설치 패키지를 차례로 포장합니다.
AI 일러스트 · 세 개발자가 도구, 응용 프로그램과 설치 패키지를 차례로 포장합니다.

내 PC에서 실행되는 프로그램을 다른 PC에 전달하는 순간 질문이 달라집니다. 어디에 설치되는지, 로그인할 때 자동으로 켜지는지, 이전 공유 목록은 남는지, 삭제하면 무엇까지 없어지는지 설명해야 합니다. FileSharer에는 이 역할을 맡는 Setup.cs가 별도로 있습니다.

Setup.cs와 내장 리소스 참조를 바탕으로 정리한 빌드·설치 흐름도.
Setup.cs와 내장 리소스 참조를 바탕으로 정리한 빌드·설치 흐름도.

연재 마지막 편에서는 배포를 마무리 작업이 아니라 제품 동작의 일부로 읽어 봅니다. 이번 확인은 소스 검토이며, 설치·제거 프로그램 실행, 기존 설치본 덮어쓰기, 레지스트리·방화벽 설정 변경은 하지 않았습니다.

빌드는 안쪽에서 바깥쪽으로 진행한다

외부 공유 중계까지 포함한 구성에서는 세 결과물이 이어집니다.

Go tsproxy 실행 파일
    ↓ gzip 리소스로 포함
C# FileSharer 본체
    ↓ 실행 파일 리소스로 포함
C# FileSharer 설치 프로그램

설치 파일은 실행할 때 인터넷에서 무조건 최신 본체를 가져오는 방식이 아니라, 자신에게 포함된 리소스를 추출합니다. 따라서 본체를 고친 뒤 설치 프로그램을 다시 만들지 않으면 예전 본체를 배포할 수 있습니다. 파일 이름이 같다는 이유만으로 최신 빌드라고 판단할 수 없는 구조입니다.

Go 중계 파일도 마찬가지입니다. C# 소스에는 tsproxy.exe.gz 리소스를 찾지 못했을 때 오류를 만드는 경로가 있습니다. 코드가 컴파일되는지와 필요한 실행 리소스가 빠짐없이 들어 있는지는 서로 다른 확인입니다.

설치 프로그램이 실제로 하는 일

Installer.Run은 실행 중인 본체를 확인한 뒤 설치 폴더를 만들고 리소스에서 본체와 아이콘을 추출합니다. 설치 프로그램 자신을 제거 프로그램 이름으로 복사하는 흐름도 있습니다. 선택에 따라 바탕화면·시작 메뉴 바로가기를 만들고 자동 실행 값을 기록합니다.

기본 설치 위치는 사용자 프로필 아래의 LocalApplicationData 영역입니다. 프로그램 목록과 자동 실행도 Registry.CurrentUser를 사용하는 코드가 보입니다. 이것을 시스템의 모든 사용자에게 설치하는 방식과 구분해야 합니다.

방화벽 설정은 별도 선택이며 기본값은 false입니다. 파일 복사와 사용자 레지스트리 등록이 되는 환경이라도 방화벽 변경까지 같은 권한으로 보장되는 것은 아닙니다. 실제 코드도 방화벽 작업 결과를 따로 기록합니다.

자동 실행은 사용자가 이해할 수 있어야 한다

설치 객체의 AutoStart 기본값은 true이고, 켜져 있을 때 본체를 /tray 인자로 실행하도록 등록합니다. 본체에서 창의 닫기 버튼은 일반적인 경우 종료 대신 트레이 숨김으로 동작합니다. “창이 안 보인다”와 “파일 공유가 끝났다”가 다를 수 있는 조합입니다.

이런 도구에서는 자동 실행 여부, 트레이에 남는 이유, 실제 종료 방법을 설치 화면과 사용 안내에 명확히 드러내는 편이 좋습니다. 네트워크 기능을 가진 프로그램일수록 사용자가 실행 상태를 이해할 수 있어야 합니다. 이번 글은 해당 기본값을 변경한 배포판을 제공하는 것은 아닙니다.

업데이트에는 바이너리와 데이터의 계약이 있다

새 본체가 설치됐다는 사실만 확인하면 충분하지 않습니다. 이전 버전의 공유 저장 행을 새 버전이 어떻게 읽는지, 오래된 필드에 기본값을 어떻게 넣는지도 확인해야 합니다. FileSharer의 저장 로더에는 암호화 키 필드가 없던 행에 새 키를 만드는 처리가 있습니다. 그렇다면 예전 링크를 그대로 사용할 수 있는지도 별도로 다뤄야 합니다.

이 프로젝트에 맞춘 배포 확인 항목은 구체적으로 만들 수 있습니다.

시점 확인할 결과
패키징 전 중계·본체·설치 파일의 빌드 순서와 해시
새 설치 선택한 경로, 바로가기, 실행 옵션
기존 설치 위 업데이트 공유 데이터 형식과 기존 링크 처리
제거 자동 실행 해제와 선택한 데이터 보존

이 표는 소스에서 도출한 점검 제안이며, 실행한 시험 결과는 아닙니다.

‘데이터 유지’의 범위도 목록으로 확인한다

제거 코드는 데이터 유지가 선택되면 settings.txt, shares_db.txt, access_log.txt를 남깁니다. 모든 관련 파일을 일괄 보존하는 의미는 아닙니다. 예를 들어 직전 세대 .bak는 이 세 이름의 목록에 포함돼 있지 않습니다. 사용자가 기대하는 복구 자료와 코드가 남기는 자료가 같은지 확인할 필요가 있습니다.

자기 자신을 제거하는 과정도 일반 파일 삭제와 다릅니다. 원본에는 제거 프로그램이 종료된 뒤 별도 프로세스로 정리하는 경로가 있습니다. 삭제 대상 범위와 실패 시 남는 파일도 검토해야 합니다.

열 편을 통해 본 FileSharer의 중심

처음에는 파일을 보내는 작은 도구였지만, 소스를 따라가면 공유 상태, HTTP 입력, 부분 전송, ZIP 준비, QR, 외부 연결, 로그, 저장, 배포가 하나의 사용 경험을 만듭니다. 어느 하나만 성공했다고 전체가 성공한 것은 아닙니다.

다음 버전을 준비한다면 기능을 더 늘리기 전에 링크 생성부터 수신 확인, 재시작과 제거까지 같은 의미가 이어지는지 점검할 수 있습니다. 이 연재에서 확인한 실행 결과와 정적 분석을 구분해 두는 이유도 여기에 있습니다. 확인한 범위를 정확히 남겨야 다음 변경이 무엇을 개선했는지 비교할 수 있습니다.

소스 근거
Setup.cs:25–51 AppInfo · Setup.cs:160–186 ExtractResource / ResourceSize · Setup.cs:391–506 Installer.Run · Setup.cs:953–1044 제거와 데이터 보존 · FileSharer.cs:1854–1905 ExtractProxy
원본 프로젝트 파일은 수정하지 않았습니다. 본문의 개선안은 적용된 기능과 구분합니다.

 

댓글