실행 파일을 프로파일링하는 고객들로부터 오랫동안 들어온 질문이 있습니다. «sgcWebSockets를 추가한 뒤 왜 내 EXE가 커졌나요?» 그 증가분의 일부는 sgcWebSockets 런타임 패키지가 기본적으로 내장하는 리소스 파일에서 비롯됩니다: sgcResources.RES. 이 파일에는 sgcWebSockets 서버가 원격 브라우저에 HTTP로 전달할 수 있는 JavaScript 클라이언트 번들이 들어 있는데 — 대부분의 Delphi 및 C++Builder 애플리케이션이 결코 사용하지 않는 기능입니다.
sgcWebSockets 2026.6부터는 이를 선택적으로 제외할 수 있습니다. 소스 에디션 Setup의 Options 페이지에 새로운 Include Resources 체크박스가 추가되었으며, 이를 해제하면 런타임 패키지가 컴파일되기 전에 sgcVer.inc의 새로운 SGC_RESOURCES 컴파일러 지시문이 정의 해제됩니다. 그러면 리소스가 아예 링크되지 않습니다 — BPL에도, 고객의 EXE에도 들어가지 않습니다.
제거되는 항목
sgcWebSockets 소스의 {$R} 지시문은 이제 {$IFDEF SGC_RESOURCES}로 감싸져 있습니다:
// sgcWebSocket_Protocol_Base_Server.pas
{$IFDEF SGC_RESOURCES}
{$R sgcResources.RES} // sgcWebSockets JS client bundle
{$ENDIF}
SGC_RESOURCES가 정의되지 않으면 링커는 내장할 것이 없습니다. 리소스는 소스에 링크되는 모든 실행 파일에서 그대로 사라집니다.
이 리소스가 필요하지 않은 경우
내장 번들은 sgcWebSockets 서버가 실제로 번들된 JS 클라이언트를 원격 브라우저에 전달할 때만 필요합니다. TsgcWSProtocol_JS_* 구성 요소, 또는 GET /sgcwebsockets.js에 응답하여 번들된 JavaScript를 반환하는 서버에서 그런 경우가 발생합니다.
다음의 경우에는 필요하지 않습니다:
- Delphi / C++Builder WebSocket 클라이언트 — 데이터는 네이티브 코드에서 소비되며, 브라우저에서는 사용되지 않습니다.
- 네이티브 간 서버 — 클라이언트도 Delphi / C++Builder 앱인 서버.
- 커스텀 JS를 제공하는 WebSocket 백엔드 — 자체 JavaScript 클라이언트(자체 번들러, 자체 CDN)를 배포하는 경우, 내장된 것은 불필요한 부담입니다.
- MQTT, AMQP, STOMP, WAMP, MCP 및 프로토콜 전용 서버 — 이들 중 어떤 것도 번들된 JS 클라이언트를 사용하지 않습니다.
활성화 방법
가장 깔끔한 방법은 인스톨러입니다. sgcWebSockets 소스 에디션 setup을 실행할 때 Options 버튼을 누르고 새 항목을 해제하세요:
[ ] Include Resources
인스톨러는 어떤 패키지든 컴파일하기 전에 sgcVer.inc의 {$DEFINE SGC_RESOURCES} 줄을 {.$DEFINE SGC_RESOURCES}로 다시 작성하므로, 디자인 타임 및 런타임 BPL이 내장 번들 없이 생성됩니다.
이미 sgcWebSockets가 설치되어 있고 수동으로 변경하려면, <sgc-install-folder>\Source\sgcVer.inc를 열고 다음 줄을 찾으세요:
{$DEFINE SGC_RESOURCES} { RESOURCES }
그리고 중괄호를 주석 처리하세요:
{.$DEFINE SGC_RESOURCES} { RESOURCES }
그런 다음 런타임 / 디자인 타임 패키지와 애플리케이션을 다시 빌드하세요. IDE에서 Project > Build All Projects를 사용하거나 평소의 빌드 스크립트를 실행하세요.
절약 효과 측정
자신의 프로젝트에서 절약 효과를 확인하려면, 변경 전후로 상세 링커 맵을 생성하세요. 다시 빌드한 후, 생성된 *.map 파일을 열고 리소스 섹션으로 스크롤하세요 — sgcResources.RES가 사라져 있어야 합니다. sgcWebSocket_Protocol_Base_Server의 .text 모듈 크기도 약간 줄어드는데, 리소스를 로드하는 보조 코드가 데드 코드 제거로 사라지기 때문입니다.
정확한 절약 효과는 빌드 구성과 사용하는 sgcWebSockets 에디션에 따라 다르지만, 일반적인 클라이언트 전용 빌드에서 EXE는 눈에 띄게 작아집니다. 이 옵션을 기존의 에디션 수준 스위치(WebAuthn / HTTP2 / OAuth 서버를 제외하기 위한 {$UNDEF SGC_EDT_ENT}, 또는 클라이언트 전용 코드에서 uses sgcWebSocket 대신 uses sgcWebSocket_Client를 사용)와 결합하면, 총 감소량은 상당할 수 있습니다.
하위 호환성
sgcVer.inc의 기본값은 여전히 {$DEFINE SGC_RESOURCES}이므로, 기존 프로젝트는 이전과 정확히 동일하게 컴파일되고 실행됩니다. 새 플래그는 엄격하게 옵트아웃 방식입니다: 인스톨러 체크박스를 통해서든 직접 sgcVer.inc를 편집해서든 명시적으로 리소스를 비활성화하지 않는 한 어떤 것도 변하지 않습니다.
SGC_RESOURCES를 비활성화한 후 번들된 JS 클라이언트(예: TsgcWSProtocol_JS_* 응답 핸들러)를 제공하려는 서버 메서드를 호출하면, 깔끔한 EResNotFound를 받게 됩니다 — 실제로 필요했던 것을 비활성화했다는 분명한 신호입니다. 정의를 다시 활성화하고 다시 빌드하면 됩니다.
제공 시점
새 옵션은 sgcWebSockets 2026.6에서 소스 에디션 인스톨러(Standard, Professional 및 Enterprise)에만 제공됩니다. Trial 인스톨러는 번들된 JS 클라이언트 데모가 바로 작동하도록 리소스를 그대로 내장한 채 유지됩니다.
활성 구독을 보유한 고객은 고객 영역에서 새 빌드를 받을 수 있습니다. 추가적인 크기 감소 스위치에 대한 질문이나 제안이 있으신가요? 문의하기 — 코드를 작성한 사람들로부터 직접 답변을 받게 됩니다.
