Delphi에서 닫힌 브라우저에 도달하기

· 컴포넌트
Delphi에서 닫힌 브라우저에 도달하기

여러분의 애플리케이션이 무언가 알려주기를 기다리는 사용자에는 세 종류가 있습니다. 페이지를 보고 있는 사용자, 회사 프록시가 WebSocket을 통과시켜주지 않는 사용자, 그리고 두 시간 전에 브라우저를 닫아버린 사용자입니다. sgcWebSockets 2026.10은 이 세 가지를 모두 다룹니다.

WebSocket을 통과시키지 않는 프록시

Server-Sent Events는 그냥 HTTP입니다. 계속 열려 있는 GET 요청과 텍스트 스트림이죠. 경로 어디에서도 이걸 반대할 이유가 없습니다. 이제 sgcHTML 엔진은 WebSocket 대신 이 방식으로 업데이트를 전달할 수 있으며, 페이지가 스스로 결정하도록 맡길 수도 있습니다:

FEngine.SSE.Enabled := True;
FEngine.SSE.Endpoint := '/events';
FEngine.SSE.PostEndpoint := '/events/send';
FEngine.SSE.ReplaySize := 100;

FTemplate.Transport := htAuto;   { htWebSocket, htSSE or htAuto }

htAuto를 사용하면 페이지는 WebSocket을 열고, 그것이 불가능할 때는 스스로 이벤트 스트림으로 전환합니다. 재생 버퍼 덕분에 잠시 연결이 끊겼던 독자는 자리를 비운 사이 놓친 업데이트를 그대로 받게 되며, 빈틈이 생기지 않습니다.

강조할 만한 부분은 이것입니다. 이것은 일반 HTTP 서버에서도 동작합니다. 페이지에 업데이트를 푸시하는 데 더는 WebSocket 서버가 전혀 필요하지 않습니다.

브라우저를 닫은 사용자

Web Push는 여러분의 페이지에 있지 않은 브라우저, 심지어 실행조차 되고 있지 않은 브라우저에도 도달합니다. 페이지가 구독하고, 여러분의 애플리케이션은 그 구독 정보를 자신이 데이터를 저장하는 곳 어디에든 저장하며, 호출 한 번으로 알림을 보냅니다:

uses
  sgcHTML_WebPush;

FWebPush := TsgcHTMLWebPush.Create(Self);
FWebPush.Enabled := True;
FWebPush.VAPIDPublicKey := ReadSetting('vapid.public');
FWebPush.VAPIDPrivateKey := ReadSetting('vapid.private');
FWebPush.Subject := 'mailto:info@example.com';
FWebPush.OnSaveSubscription := DoSaveSubscription;
FWebPush.OnLoadSubscriptions := DoLoadSubscriptions;
FWebPush.OnDeleteSubscription := DoDeleteSubscription;

FEngine.WebPush := FWebPush;

FWebPush.Send('user-42', 'Order 1042 shipped',
  'It left the warehouse this morning.', '/orders/1042');

라이브러리는 프로토콜을 책임집니다. 암호화된 페이로드, VAPID 서명, TTL, 그리고 긴급도 헤더입니다. 여러분의 애플리케이션은 세 가지 이벤트를 통해 저장을 책임지는데, 구독 정보가 어디에 존재할지는 오직 여러분만이 내릴 수 있는 결정이기 때문입니다. 푸시 서비스가 폐기한 구독은 OnSubscriptionExpired를 통해 돌아오므로, 여러분이 그것을 삭제할 수 있습니다.

둘 중 하나를 결정하는 컴포넌트

두 개의 채널을 갖는 것은 무언가가 그중 하나를 선택해줄 때만 쓸모가 있습니다. 이제 알림 컴포넌트가 그 역할을 합니다. 페이지를 보고 있는 사용자는 페이지 안에서 알림을 받고, 그렇지 않은 사용자는 애플리케이션이 허용한다고 말할 때 web push를 받습니다. 알림 하나, 호출 한 번, 그리고 사용자는 두 번 알림을 받지 않습니다.

그리고 그 주위의 두 컴포넌트

알림 수신함. 읽지 않음 배지가 달린 종 모양 아이콘과 한 사용자의 알림들, 그리고 읽음 표시와 지우기 기능이 있어, 놓친 알림이 잃어버린 알림이 되지 않습니다.

알림 환경설정 테이블. 사람이 각 종류의 알림을 어떻게 받을지 체크하는 곳입니다. 다들 미루기 마련인 부분이면서, 알림을 받겠다고 요청하지 않은 사람들과의 문제를 피하게 해주는 부분이기도 합니다.

두 컴포넌트 모두 WebSocket을 통해서든 Server-Sent Events를 통해서든, 모든 에디션에서 동작합니다.

에디션

Server-Sent Events, 수신함, 환경설정 테이블은 sgcHTML의 일부입니다. 닫힌 브라우저에 도달하는 부분인 Web Push 자체는 SGC_WEBPUSH가 필요하며, 이는 Enterprise와 All-Access 에디션입니다.

업그레이드

여기 있는 모든 기능은 기본적으로 꺼져 있습니다. 기존 페이지는 Transport를 설정하거나, WebPush를 지정하거나, 두 새 컴포넌트 중 하나를 폼에 올리기 전까지는 자신의 WebSocket 전송 방식을 그대로 유지하며 동일한 마크업을 렌더링합니다.

다음 읽을거리

영상으로 보기

이에 관한 짧은 영상eSeGeCe 채널에 있습니다.

질문, 피드백, 마이그레이션 도움이 필요하신가요? 문의하기 — 코드를 작성한 사람들에게서 직접 답변을 받으실 수 있습니다.