PubNub 프레즌스 활성화 및 구성 방법
Published: 2024-05-14 07:03:24

사용자가 언제 온라인 또는 오프라인 상태가 되는지, 클라이언트 디바이스의 연결 여부와 연결이 끊어지는 시점을 어떻게 감지할 수 있을까요? PubNub 프레즌스 기능을 사용하면 채널에 연결된 사용자를 실시간으로 추적하고 연결 상태가 변경되면 알림을 받을 수 있습니다.

  
[![Embedded YouTube Video](https://img.youtube.com/vi/YGrrFUlO_Ys/0.jpg)](https://www.youtube.com/watch?v=YGrrFUlO_Ys)  
[비디오 보기](https://www.youtube.com/watch?v=YGrrFUlO_Ys)

프레즌스 시스템은 매우 유연하며 다음과 같은 사용 사례를 지원합니다:

-   사용자가 채팅 대화에 참여하거나 떠날 때 모니터링하기
-   사용자의 온라인 또는 오프라인 상태 감지
-   IoT 디바이스의 연결 및 사용 가능 여부 확인
-   채널에 연결된 클라이언트 수 계산(채널 점유 수)

또한 관심 있는 모든 수신자가 수신할 클라이언트의 현재 상태에 수반되는 일부 상태 정보(메타데이터)를 정의할 수도 있습니다. 예를 들어, 클라이언트의 현재 상태가 '온라인'이지만 사용자가 사용자 지정 상태를 '외출' 또는 '방해 금지'로 설정하도록 선택할 수 있습니다.

PubNub 프레즌스 기능을 사용 설정하려면 [관리자 포털에](https://admin.pubnub.com?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 로그인하여 프레즌스 기능을 사용 설정하려는 앱과 키 세트로 이동한 다음 해당 키 세트의 구성 화면에서 프레즌스 스위치를 토글합니다:

![Portal Configuration: Presence Enable](https://www.pubnub.com/cdn/3prze68gbwl1/7oSeiiPIy15BnZhVsZ3FsB/840c751c9826f614a75e00537e5d7967/portal_-_presence_on.png)

프레즌스를 사용 설정할 것인지 확인하는 메시지가 표시됩니다.

> 특히 트랜잭션 기반 요금제를 사용하는 경우 프레즌스를 사용 설정하면 트랜잭션 수가 훨씬 더 많이 발생할 수 있습니다. 트랜잭션 수를 제어하려면 이 문서의 뒷부분에 설명된 '프레즌스 관리' 기능을 사용하면 됩니다.

![Portal Configuration: Presence Enable Confirm](https://www.pubnub.com/cdn/3prze68gbwl1/5DOhGhHU4bj028AJecCu83/bacca2c768b2cf2fe25294adf73acdec/portal_-_presence_enable.png)

키 설정 구성을 수정할 때마다 변경 사항을 저장해야 합니다.

![Portal Configuration: Presence Confirm Changes](https://www.pubnub.com/cdn/3prze68gbwl1/2o4Ftz7WJeD3QA8TWPu9do/09c679b6e94617a702d0095b87d911c4/portal_-_save_changes.png)

발표 모드
-----

이 기능을 활성화하면 클라이언트(사용자 또는 디바이스)가 채널을 구독하거나 구독을 취소할 때 PubNub에서 자동으로 프레즌스 이벤트를 생성합니다.

클라이언트가 채널에 가입하면 `가입` 이벤트가 생성됩니다:

```
{ "채널": "<가입한 채널의 이름>", "action": "join", "occupancy": 2, // 채널 점유 "uuid": "<참여한 클라이언트의 사용자 아이디>", "timetoken": "<가입이 발생한 시점>" }
```

클라이언트가 채널에서 구독을 취소하면 `탈퇴` 이벤트가 생성됩니다:

```
{ "채널": "<탈퇴한 채널 이름>", "action": "leave", "occupancy": 1, // 채널 점유 "uuid": "<이탈한 클라이언트의 사용자 아이디>", "타임토큰": "<이탈이 발생한 시점>" }
```

채널에 연결된 웹 클라이언트에서 사용자가 구독 취소를 허용하지 않고 강제로 탭을 닫았다고 가정해 봅시다:

클라이언트가 명시적으로 구독을 취소하지 않았지만 일정 시간(기본값 300초) 후에 존재하지 않는 것으로 감지되면 `시간` 초과 이벤트가 트리거됩니다:

```
{ "채널": "<시간 초과된 채널 연결 이름>", "action": "timeout", "occupancy":1, // 채널 점유 "uuid": "<시간 초과된 클라이언트의 사용자 아이디>", "타임토큰": "<타임아웃이 발생한 시점>" }
```

### TCP FIN 또는 RST에서 Leave 생성하기

위 시나리오에서 타임아웃 이벤트를 기다리는 대신 네트워크 수준에서 클라이언트가 채널을 떠나는 시점을 감지하는 또 다른 옵션이 있습니다. 키셋에서 'TCP FIN 또는 RST에서 이탈 생성' 옵션을 활성화하면 이 시나리오에서 브라우저 탭을 강제로 닫으면 이제 `타임아웃` 이벤트 대신 즉시 발생하는 `이탈` 이벤트가 생성됩니다.

![Portal Configuration: Presence Generate Leave TCP FIN RST](https://www.pubnub.com/cdn/3prze68gbwl1/5wwJWjGkGOs9R0WFWsJgIu/b95da340d8265dab8edc83f69d94e348/portal_-_generate_leave_on_tcp_fin_or_rst.png)

### 디바운스

네트워크 문제나 애플리케이션 디자인으로 인해 클라이언트가 채널에 빠르게 `가입했다가` `탈퇴하는` 경우가 있습니다. 과도한 `가입` 및 `탈퇴` 이벤트를 방지하려면 `디바운스` 값을 초 단위로 지정하세요. 예를 들어 클라이언트가 `가입` 이벤트를 생성한 후에는 2초 동안 다른 `가입` 이벤트를 생성할 수 없습니다.

![Portal Configuration: Presence Debounce](https://www.pubnub.com/cdn/3prze68gbwl1/4j08CDBzBT3UOPoTraPoj4/e713d84db1011937c4c26700bc623e78/portal_-_debounce.png)

간격 모드
-----

### 최대 발표

채널의 클라이언트 수가 '최대 공지' 설정(기본값은 20명) 미만으로 유지되는 한 `참여` 및 `탈퇴` 이벤트가 즉시 트리거됩니다.

![Portal Configuration: Presence Announce Max](https://www.pubnub.com/cdn/3prze68gbwl1/5YNhk0OXtAoi9JYG2TpN3H/3ad226821767b7e806f8867806b83e1a/portal_-_announce_max.png)

채널의 참여자 수가 증가함에 따라 `참여` 및 `퇴장` 이벤트의 수도 증가하지만, 어느 시점에서는 클라이언트가 이러한 모든 이벤트를 실시간으로 유지하려고 시도하는 것이 낭비적이 됩니다. 200명의 참가자가 있는 그룹 채팅을 생각해 보세요. 클라이언트는 참가자가 온라인 또는 오프라인 상태가 될 때마다 모든 참가자의 온라인 상태를 업데이트해야 할까요? 이는 사람이 추적할 수 있는 것보다 더 많은 정보가 될 것입니다.

`최대 발표` 수를 1에서 100 사이로 구성할 수 있습니다. **채널의 클라이언트 수가 '최대 공지'를 초과하면** 참여 **`,` `탈퇴` 및 `시간`** 초과 **이벤트가 더 이상 생성되지** 않고 **`간격` 이벤트로 대체됩니다**:

```
{ "channel: "<이벤트가 적용되는 채널의 이름>", "action": "간격", "점유": 4, // 채널 점유 "타임토큰": "<인터벌 이벤트가 발생한 시기>" }
```

### Interval

`간격` 구성 옵션을 수정하여 간격 이벤트가 발생할 빈도를 구성할 수 있습니다. 10초에서 300초(5분) 사이의 값을 사용할 수 있습니다.

![Portal Configuration: Presence Interval](https://www.pubnub.com/cdn/3prze68gbwl1/6c0nFLx1IzyRD4ky0xoixt/06b7ec3a799b8b15a07e2902019ab7d7/portal_-_interval.png)

`간격` 이벤트는 '프레즌스 델타'를 활성화하지 않는 한 채널 점유율에 대해서만 알림을 보냅니다.

### 프레즌스 델타

![Portal Configuration: Presence Deltas](https://www.pubnub.com/cdn/3prze68gbwl1/13VfH53S8l6KdQ8ap18PUp/0f843d5a9eb2e7cf40fd8c0e51b36d6f/portal_-_presence_deltas_on.png)

'프레즌스 델타'를 활성화하면 `인터벌` 이벤트에 이전 `인터벌` 이벤트 이후 채널에 참여하거나 떠난 사용자에 대한 정보도 포함됩니다.

```
{ "channel": "<이벤트가 적용되는 채널의 이름>", "action": "interval", "occupancy": 3, // 채널 점유 "join": ["member4"], "leave": ["member3"], "timetoken": "<인터벌 이벤트가 발생한 시점>" }
```

기타 설정
-----

### 활성 공지 채널

채널에 연결된 클라이언트 수나 해당 클라이언트가 누구인지에는 관심이 없고, 채널에 가입한 사람이 있는지 여부에만 관심이 있을 수 있습니다. 채널에 구독자가 0명인 경우 `비활성` 상태로 간주됩니다. 구독자가 1명 이상인 채널은 `활성` 채널로 간주됩니다.

'활성 알림 채널'을 지정하여 채널이 '활성' 또는 '비활성'이 될 때 알림을 받도록 등록할 수 있습니다.

![Portal Configuration: Presence Active Notice Channel](https://www.pubnub.com/cdn/3prze68gbwl1/41uqM2t7RZbv7OhYQ0Sdnp/5a7bc69d5bfc4d0c35be69e8f99b1448/portal_-_active_notice_channel_populated.png)

지정하면 이 채널에서 메시지를 받게 됩니다(이 예에서 메시지를 받는 채널 이름은 "알림\_채널"입니다):

```
{ "채널": "<활성 또는 비활성화된 채널의 이름>", "상태": "활성", // 또는 비활성 "정확한_타임스탬프": "<인터벌 이벤트가 발생한 시점>" }
```

`활성` 이벤트는 채널 점유율이 0 이상으로 올라가는 즉시 전송되지만, 채널 `비활성` 이벤트는 채널 점유율이 300초 이상 0인 경우에만 발생한다는 점에 유의하세요.

### 스트림 필터링

스트림 필터링을 비활성화하는 옵션은 레거시상의 이유로 유지되며, 개발자는 이 설정을 해제해도 별다른 이점을 얻을 수 없습니다. 스트림 필터링은 프레즌스 채널에 게시된 이벤트에 프레즌스 메타데이터를 포함하므로 [클라이언트 필터가](https://www.pubnub.com/docs/general/channels/subscribe#message-filters?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 이러한 프레즌스 이벤트에 적용될 수 있습니다. 스트림 필터링을 비활성화해도 프레즌스 이벤트 수가 줄어드는 것은 아니며, 클라이언트가 수신하는 이벤트를 필터링할 수 있을 뿐이므로 이 문서의 뒷부분에서 설명하는 프레즌스 관리를 사용하여 프레즌스 이벤트 수를 줄여야 합니다.

![Portal Configuration: Presence Stream Filtering](https://www.pubnub.com/cdn/3prze68gbwl1/7MVxG7hUQ8T8txFn8ceil2/b7239d86329c74585defe51e15dbb855/portal_-_stream_filtering.png)

### 웹훅

이전에는 키 집합 구성 페이지에서 다음 이벤트 중 하나라도 발생할 때 실행될 여러 웹후크를 지정할 수 있었습니다:

-   `참가` 이벤트 발생
-   `leave` 이벤트 발생
-   `시간` 초과 이벤트 발생
-   `간격` 이벤트 발생
-   `상태 변경` 이벤트 발생
-   `채널 활성` 또는 `채널 비` 활성 이벤트가 발생했습니다.

이러한 웹후크는 더 이상 키설정 구성의 일부가 아니며 이벤트 및 작업 기능으로 마이그레이션되었습니다. 웹후크는 이 문서의 범위에서 다루지 않지만 자세한 내용은 이벤트 및 작업 문서의 [웹후크 페이로드 작업](https://www.pubnub.com/docs/serverless/events-and-actions/events#webhook-payload?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 섹션을 참조하세요.

상태 변경
-----

클라이언트의 프레즌스와 관련된 일부 메타데이터를 교환하려는 경우 가장 좋은 방법은 프레즌스 상태 기능을 사용하는 것입니다. 예를 들어, 앞서 설명한 `가입` 및 `탈퇴` 이벤트는 클라이언트가 온라인 상태인지 오프라인 상태인지 알려주지만 사용자가 '바쁨' 또는 '방해 금지' 상태인지는 알려주지 않습니다.

클라이언트는 PubNub SDK를 사용하여 특정 `채널` 또는 `채널 그룹에` 사용자 지정 상태를 설정할 수 있습니다. 설정된 상태는 다른 클라이언트에 전파되어 `상태 변경` 이벤트로 수신됩니다.

```
{ "channel": "<상태 변경과 관련된 채널의 이름>", "uuid": "<상태가 적용되는 클라이언트의 ID>" "action": "state-change", "상태": {<상태를 정의하는 JSON 객체>} "점유": 3, // 채널 점유 "타임토큰": "<상태 변경이 발생한 때>" }
```

상태 변경은 매우 유연하며 직렬화 가능한 모든 데이터를 교환하는 데 사용할 수 있습니다. 예를 들어, 협업 데모에서는 존재 상태를 사용하여 `그리기` 이벤트가 발생할 때 리스너에게 알림으로써 모든 시청자에게 실시간으로 낙서가 표시되는 협업 그리기 애플리케이션을 사용할 수 있습니다.

```
"state": {"x": 5, "y": 10, "color":"#FFFF00"}  // 그리기 애플리케이션의 상태 페이로드 예시
```

**상태 변경 이벤트의 유일한 주의 사항은 지속되지 않으므로** 각 클라이언트가 추적해야 하는 임시 데이터나 데이터에만 사용해야 한다는 것입니다.

프레즌스 관리를 사용하여 수신할 이벤트 제어하기
--------------------------

앞서 언급했듯이 사용자 기반이 증가함에 따라 프레즌스 이벤트의 수가 매우 많아지기 쉽습니다. 지정된 채널에서 어떤 이벤트가 실행될지 보다 효과적으로 제어할 수 있도록 셀프 서비스 '프레즌스 관리' 도구를 도입하여 어떤 프레즌스 이벤트가 실행될지 제어하는 규칙을 만들 수 있도록 했습니다:

프레즌스 관리 도구는 키설정 구성 화면의 해당 버튼에서 실행할 수 있습니다:

![Portal Configuration: Presence Management](https://www.pubnub.com/cdn/3prze68gbwl1/3L5SZ54NPceHIcBn0hRDIg/9fd5c24690e40a9a05d616acb0900d6d/portal_-_presence_management.png)

왼쪽 메뉴의 'BizOps 워크스페이스' 섹션에서 이 도구에 액세스할 수도 있습니다.

관리 규칙을 구성하는 방법에 대한 자세한 설명은 [프레즌스 관리 설명서를](https://www.pubnub.com/docs/bizops-workspace/presence-management?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 참조하시기 바라며, 요약하면 다음과 같습니다:

1.  새 규칙을 만듭니다. 애플리케이션에 대해 트리거하려는 프레즌스 이벤트를 완전히 정의하기 위해 여러 개의 규칙을 가질 수 있습니다.
2.  `가입,` `퇴장,` `시간 초과,` `상태 변경` 및 `간격을` 포함하여 이 규칙으로 제어할 이벤트를 지정합니다. 이 문서에서는 이러한 규칙이 무엇이며 언제 실행되는지에 대해 설명했습니다.
3.  와일드카드 패턴을 지정하여 이 규칙이 적용되는 채널 또는 채널 그룹을 정의합니다(예: `개인-*는` `개인으로` 시작하는 모든 채널에 `적용됨-`).
4.  '만들기'를 클릭하고 규칙이 적용될 순서를 정의합니다.

PubNub API를 통한 프레즌스 관리
----------------------

모든 SDK를 통해 프레즌스 이벤트를 수신할 수 있습니다. 이 문서에서는 주로 SDK 이벤트 리스너를 통해 수신되는 프레즌스 이벤트에 중점을 두었지만, 여기서는 특정 채널`(여기 지금`)에서 누가 듣고 있는지, 특정 사용자가 어디에 가입되어 있는지`(어디 지금`) 확인할 수 있는 추가 기능도 지원합니다.

자바스크립트에서 [hereNow API는](https://www.pubnub.com/docs/sdks/javascript/api-reference/presence?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 다음과 같이 호출하여 지정된 채널을 구독 중인 사용자를 확인할 수 있습니다:

```js
try {
  const result = await pubnub.hereNow({
    channels: ["my_channel"],
    includeState: true,
    includeUUIDs: true
  });
  console.log(“total occupancy: “ + result.totalOccupancy)
} catch (status) {
  console.log(status);
}
```

추가 리소스
------

현재 상태는 PubNub 플랫폼의 가장 가치 있고 유연한 기능 중 하나입니다. 누가 온라인에 있는지 정확히 파악하고 그 상태를 실시간으로 업데이트하는 기능을 통해 고객들은 지난 몇 년 동안 흥미로운 솔루션을 구축할 수 있었습니다.

-   프레즌스 [기본](https://www.pubnub.com/docs/general/presence/overview?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 문서는 프레즌스의 개념을 이해하기 위한 좋은 출발점입니다.
-   `프레즌스가` 활성화된 채널을 구독하는 방법을 보여주는 예제는 구독 [문서를](https://www.pubnub.com/docs/general/channels/subscribe?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 참조하고, 프레즌스 이벤트에 대한 리스너 콜백을 추가하는 방법을 보여주는 API 예제는 SDK별 문서(예: JavaScript SDK의 경우 [이 페이지](https://www.pubnub.com/docs/sdks/javascript/api-reference/publish-and-subscribe#add-listeners?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) )를 참조하세요.
-   더 많은 실습을 위해 대부분의 튜토리얼에 프레즌스 기능이 포함되어 있으며, 초보 개발자에게는 여러 프로그래밍 언어를 다루는 시작하기 [튜토리얼이](https://www.pubnub.com/tutorials/getting-started-chat-sdk/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 좋은 출발점이 될 수 있습니다. 튜토리얼에서는 채널에서 누가 채널을 듣고 있는지 확인하기 위한 '지금 여기' API와 같은 다른 프레즌스 기능에 대해서도 다룹니다.

마지막으로, 도움이나 지원이 필요한 경우 언제든지 [전담 pubnub 지원팀에](https://support.pubnub.com/hc/en-us?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 문의하거나 개발자 관계팀( [devrel@pubnub.com](mailto:devrel@pubnub.com))으로 이메일을 보내주세요.

펍넙이 어떤 도움을 드릴 수 있나요?
====================

이 글은 원래 [PubNub.com에](https://www.pubnub.com/how-to/admin-portal-presence/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 게시되었습니다.

저희 플랫폼은 개발자가 웹 앱, 모바일 앱 및 IoT 디바이스를 위한 실시간 인터랙티브를 구축, 제공 및 관리할 수 있도록 지원합니다.

저희 플랫폼의 기반은 업계에서 가장 크고 확장성이 뛰어난 실시간 에지 메시징 네트워크입니다. 전 세계 15개 이상의 PoP가 월간 8억 명의 활성 사용자를 지원하고 99.999%의 안정성을 제공하므로 중단, 동시 접속자 수 제한 또는 트래픽 폭증으로 인한 지연 문제를 걱정할 필요가 없습니다.

PubNub 체험하기
-----------

[라이브 투어를](https://www.pubnub.com/tour/introduction/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 통해 5분 이내에 모든 PubNub 기반 앱의 필수 개념을 이해하세요.

설정하기
----

PubNub [계정에](https://admin.pubnub.com/signup/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 가입하여 PubNub 키에 무료로 즉시 액세스하세요.

시작하기
----

사용 사례나 [SDK에](https://www.pubnub.com/docs?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 관계없이 [PubNub 문서를](https://www.pubnub.com/docs?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 통해 바로 시작하고 실행할 수 있습니다.