실시간 리액트 네이티브: 게시/서브, 지리적 위치, 프레즌스
Published: 2024-03-08 19:22:04

오늘날과 같이 빠르게 변화하는 세상에서는 집중할 수 있는 시간이 줄어들면서 원활한 상호 작용에 대한 요구가 계속 급증하고 있습니다. 서버 가동이나 이미지 로딩으로 인한 지연은 진정한 실시간 사용자 경험을 방해하는데, 서버리스 아키텍처의 도움으로 이러한 문제를 해결할 수 있습니다. 미디어 소비가 점점 더 증가하는 사회에서 웹사이트나 IoT 디바이스가 로드되기를 기다리는 것은 구시대적인 발상입니다. "지금 당장 5G 연결이 가능한데 왜 종속성을 감수해야 하는가?"와 같은 생각이 사용자들의 머릿속을 자주 스쳐 지나갑니다.

이 블로그의 목적은 제 관점에서 애플리케이션의 미래를 예측하고 앱을 현재의 속도 및 보안 표준에 맞게 조정하는 것이 얼마나 간단한지 설명하는 것입니다. 이는 특히 프로젝트 실행을 위해 언어, 프레임워크 또는 npm 패키지처럼 간단한 것을 선택할지 고민하는 전문가에게 적합합니다. 실시간 시대가 빠르게 다가오고 있으며, 이 속도에 맞춰 진화하지 못하는 시스템은 도태될 가능성이 높습니다.

이러한 실시간 환경의 확대는 기술 생태계를 혁신적으로 변화시켰습니다. 새로운 기술이 발전할 때마다 우리는 디지털 경험을 원활하게 통합하여 더 빠른 결과를 달성하는 데 한 걸음 더 다가갈 수 있습니다. 일반 사용자에게는 이벤트 핸들러와 푸시 알림을 통해 Uber 차량의 위치를 실시간으로 인지할 수 있다는 의미입니다. 개발자에게는 펍/서브 모델을 통해 전 세계의 디바이스를 통합하여 신속하고 원활한 [연결 경험을](https://www.pubnub.com/blog/connected-shared-experiences-a-developers-guide/) 제공할 수 있는 길이 열립니다.

네이티브 실시간 트렌드 반응
---------------

즉각적인 데이터를 요구하는 현대 소비자들의 출현과 Node.js의 기능으로 인해 메시지를 받기 위해 며칠을 기다려도 괜찮았던 시대는 지나갔습니다. 서비스가 즉각적이지 않으면 사용자들은 재빨리 대안을 찾습니다.

전 세계적으로 새로운 연결 속도에 접근할 수 있게 되면서 실시간 대화형 세상에 참여하는 사람들의 수가 증가하고 있습니다. 미국 내 [차량 공유 및 음식 배달 서비스의](https://www.pubnub.com/blog/the-biggest-technological-trend-shaping-the-on-demand-economy/) 성장과 함께 동남아시아 및 인도에서도 같은 산업이 호황을 누리고 있습니다. 인도에서 인기를 끌고 있는 Swiggy와 Zomato 같은 음식 배달 서비스는 하루에 50만 건 이상의 배달을 처리합니다. 이러한 비즈니스와 소비자 모두 파이썬으로 구동되는 실시간 json 데이터 스트림에 크게 의존하고 있습니다. 이러한 서비스 제공이 실험적인 벤처에서 전 세계적으로 일상 생활의 필수적인 부분으로 자리 잡고 있는 것은 분명합니다.

5G의 채택이 증가하고 웹 및 모바일 애플리케이션이 발전함에 따라 잠재적인 병목 현상을 방지하기 위해 소프트웨어 데이터 전송 속도를 개선하는 것이 무엇보다 중요합니다. 이제 애플리케이션은 실시간으로 업데이트할 수 있어 사람들의 연결을 촉진할 수 있습니다. 실시간 응답성을 갖춘 React Native는 기술에 대한 의존도가 점점 더 높아지고 있는 오늘날의 상황을 충족하는 이상적인 솔루션입니다.

실시간 리액트 네이티브란 무엇인가요?
--------------------

속도에 대한 요구에 부응하기 위해 Facebook 개발자들은 React라는 자바스크립트 프레임워크와 이후 JS 파일 사용을 시작했습니다. React는 자바스크립트와 자바스크립트 구문 확장(JSX)을 사용해 빠르고 가벼운 웹 페이지를 만들 수 있게 해줍니다. JSX는 JavaScript의 기능을 유지하면서 XML과 유사한 형식으로 사용자 인터페이스를 쉽게 디자인할 수 있게 해줍니다. 또한 React를 사용하면 웹페이지를 타겟팅하여 업데이트할 수 있으므로 수정을 위해 페이지를 완전히 다시 로드할 필요가 없으므로 웹사이트 속도가 빨라지고 사용자 경험이 풍부해집니다.

웹 페이지용으로 특별히 설계된 React가 만들어진 후, 그 컴포넌트 구조는 React Native로 확장되었습니다. 이 기술을 사용하면 React와 유사한 원리를 사용하여 모바일 애플리케이션을 만들 수 있습니다. JavaScript를 처리하고 모바일 기기에서 직접 실행하며, 브릿지를 사용하여 각 컴포넌트를 네이티브 iOS 또는 Android 컴포넌트에 연결합니다. 브리지는 네이티브 컴포넌트에 정보를 전달하기 위해 자바스크립트를 실행하는 것을 용이하게 합니다.

React Native는 컴포넌트가 다른 컴포넌트를 포함할 수 있는 컴포넌트 구조를 활용합니다. 특정 컴포넌트와 관련된 데이터가 변경되면 해당 컴포넌트만 다시 렌더링됩니다. 이러한 선택적 재렌더링은 앱과 웹 페이지를 더 빠르고 매끄럽고 효율적으로 만듭니다. 이 시스템이 React와 React Native에 내재되어 있기 때문에 실시간 애플리케이션을 제작하는 데 탁월한 리소스입니다.

그러나 React Native는 실시간 채팅 애플리케이션을 위한 이상적인 기반이지만 필요한 연결 서비스를 제공하지 않습니다. 바로 이 부분에서 PubNub은 API 키와 보안 인증 메커니즘을 통해 사용자에게 원활하고 안전한 연결 경험을 제공함으로써 그 간극을 메웁니다.

실시간 서비스로 PubNub을 사용해야 하는 이유는 무엇인가요?
-----------------------------------

React Native를 기본 앱으로 시작하려면 기기 또는 사용자 간의 연결을 설정하는 메커니즘이 필요합니다. 바로 이때 PubNub이 적합한 솔루션입니다. 단순히 사용자를 연결하는 데 그치지 않고 빠르게 연결합니다. PubNub의 글로벌 네트워크는 데이터 현지화를 개선하고 지연 시간을 줄이는 전 세계에 전략적으로 위치한 데이터 센터인 PoP(Point of Presence)를 통해 진정한 글로벌 서비스를 제공할 수 있습니다. 리액트 네이티브와 결합하면 사용자를 공통의 공유 경험으로 연결할 수 있습니다.

PubNub은 Pub/Sub(게시/구독) 및 기타 여러 기능을 손쉽게 사용할 수 있는 선도적인 실시간 네트워크 제공업체 중 하나입니다. PubNub는 한 달에 최대 1,000,000개의 메시지를 무료로 제공합니다! 이러한 넉넉한 무료 티어 외에도 PubNub은 사용하기 쉬워 프로젝트에 몇 가지 스타터 코드를 드롭하고 연결하여 번거로움을 최소화하면서 Pub/Sub 메시징을 시작할 수 있습니다.

더 이상 서버를 설정하거나 여러 연결을 처리하는 것에 대해 걱정할 필요가 없습니다. PubNub은 백엔드를 책임지고 고객에게 중요한 정보를 알려줍니다. 여러분이 구축할 수 있는 견고한 Pub/Sub 인프라를 제공합니다. 데이터를 전송하기만 하면 PubNub가 각 사용자에게 도달하도록 보장합니다. 여기서는 이러한 맥락에서 PubNub의 펍-서브, 히스토리, 프레즌스 기능을 살펴보겠습니다.

다음 섹션에서는 시작 프로세스에 대해 설명하고 일반적인 React Native 사용 사례에 유용한 몇 가지 코드 스니펫을 살펴보겠습니다.

실시간 React Native 기본 사항
----------------------

실시간 앱의 일반적인 기능을 구축하는 데 도움이 되는 PubNub의 몇 가지 기능을 살펴봅니다. 각 예제에서 코드 스니펫과 추가 정보에 대한 링크를 제공할 것입니다.

### PubNub를 React Native에 연결하기

터미널에 다음 코드를 입력하여 PubNub를 React Native 프로젝트에 설치합니다. 이렇게 하면 종속 요소도 기본적으로 설치됩니다.

```js
npm install pubnub
```

다음은 PubNub 사용을 시작하는 데 필요한 모든 컴포넌트가 포함된 일반적인 React Native 앱의 예시입니다.

```js
import React, { Component } from 'react';
import PubNub from 'pubnub';

export default class App extends Component {
  constructor(props) {
    super(props);

    // Initialize a PubNub instance
    this.pubnub = new PubNub({
      publishKey: "INSERT PUBLISH KEY HERE",
      subscribeKey: "INSERT SUBSCRIBE KEY HERE",
      uuid: "yourUniqueUserId" // Optionally set a UUID for this client
    });

    this.state = {
      // Your initial state
    };

    // Bind your event handlers if necessary
    // this.someEventHandler = this.someEventHandler.bind(this);
  }

  componentDidMount() {
    // Set up PubNub listeners and subscribe to channels
    this.pubnub.addListener({
      message: (message) => {
        // Handle new messages
        console.log(message);
      },
      presence: (presenceEvent) => {
        // Handle presence events
      }
      // Add other event handlers as needed
    });
  }

  componentWillUnmount() {
    // Unsubscribe from all channels
    this.pubnub.unsubscribeAll();
  }

  // Your component methods...

  render() {
    // Your render method...
    return (
      <div>
        {/* Your component UI */}
      </div>
    );
  }
}
```

이 코드 스니펫에서는 먼저 파일 상단에서 PubNub를 임포트합니다. 컴포넌트의 생성자 내부에서 콜백 기반 시스템을 통해 PubNub 객체를 생성하고 키를 삽입할 수 있습니다. 상태 객체를 생성한 후 PubNub 객체에서 \`init\` 함수를 사용할 수 있습니다. React Native로 PubNub를 설정하는 방법에 대한 자세한 설명은 [PubNub React SDK 문서에서](https://pubnub.com/docs/sdks/javascript/react) 확인하세요.

### 게시 및 구독

[Pub/Sub 메시징은](https://www.pubnub.com/features/pub-sub-messaging/) PubNub의 핵심 기능입니다. 대부분의 사용 사례는 앱을 실시간으로 만들기 위해 Pub/Sub의 일부 버전이 필요합니다. Pub/Sub는 단일 함수 호출로 구성됩니다. 객체나 문자열을 퍼블리시에 포함시키면 채널을 구독하는 모든 사람이 순식간에 메시지를 받게 됩니다. 한 번의 호출로 구독과 게시가 완료됩니다. 수신 메시지를 처리하는 메시지 핸들러를 만들 수도 있습니다.

```js
 setupListeners() {
    this.pubnub.addListener({
      message: (messageEvent) => {
        console.log(messageEvent.message.name + " loves " + messageEvent.message.awesomeRDSN);
      },
      presence: (presenceEvent) => {
        // Handle presence events if needed
        console.log(presenceEvent);
      }
    });

    this.pubnub.subscribe({
      channels: ["channel1"],
      withPresence: true
    });
  }

  publishMessage() {
    this.pubnub.publish({
      message: {
        name: "Samba",
        awesomeRDSN: "PubNub"
      },
      channel: "channel1"
    }, (status, response) => {
      if (status.error) {
        // Handle publish error
        console.error(status);
      } else {
        console.log("Message Published", response);
      }
    });
  }
```

### 메시징

채팅 앱 또는 채팅 애플리케이션에서의 메시징은 게시/가입의 훌륭한 사용 사례입니다. 일대일, 다대다 또는 그 사이의 어떤 조합이든 PubNub은 모든 것을 처리할 수 있습니다. 테마를 위한 CSS를 사용하여 [React Native에서 채팅 앱을 만드는](https://www.pubnub.com/blog/build-a-fully-featured-react-chat-app/) 방법에 대한 포괄적인 튜토리얼 시리즈가 준비되어 있습니다.

### 저장 및 재생

메시지를 저장하고 검색하는 것은 모든 메시징 앱에서 중요한 부분이며, 여기서 [저장 및 재생이](https://pubnub.com/docs/sdks/javascript/api-reference/storage-and-playback) 중요한 역할을 합니다. 아래는 참고할 수 있는 히스토리 호출 샘플입니다.

```js
function fetchHistory() {
  pubnub.history({
      channel: 'channel1',
      count: 100 // You can adjust this number up to the maximum allowed by your PubNub plan
    },
    (status, response) => {
      if (status.error) {
        // Handle the error case
        console.error('Error retrieving history:', status);
        return;
      }

      // Success - output the response
      console.log('History response:', response);
    }
  );
}
```

이 코드 스니펫에서는 PubNub의 'history' 함수를 사용하고 있습니다. 이 함수는 PubNub 객체와 일련의 인수를 받아 지정된 PubNub 채널을 통해 전송된 이전 메시지를 검색할 수 있도록 합니다. 그러면 과거 메시지가 포함된 호출의 응답을 애플리케이션의 필요에 따라 표시, 구문 분석 또는 활용할 수 있습니다. 이 기능에 대한 자세한 내용은 업데이트된 [저장 및 재생 문서에서](https://pubnub.com/docs/sdks/javascript/react) 확인하세요.

### 위치 정보

PubNub를 사용하면 실시간 위치 업데이트를 스트리밍하거나 근접 알림을 트리거하는 것이 쉬워집니다. [반응형 네이티브 맵을](https://github.com/react-native-maps/react-native-maps) 통합하여 \`MapView\` 컴포넌트와 그 자식들을 가져와서 대화형 지리적 경험을 만들 수 있습니다. 제공된 마커는 사용 사례에 맞게 배치하거나 사용자 정의할 수 있습니다.

```js
import MapView, {Marker} from 'react-native-maps';
```

PubNub의 강력한 기능으로 강력하고 완전한 기능을 갖춘 iOS 및 Android 애플리케이션을 만들 수 있습니다. 이러한 앱은 디바이스 또는 시뮬레이터에서 실행할 수 있어 강력하고 다재다능한 플랫폼을 제공합니다. 기다릴 이유가 없죠? 지금 바로 React Native와 PubNub로 실시간 애플리케이션을 제작하세요!

```js
import React, { Component } from 'react';
import { View } from 'react-native';
import MapView, { Marker } from 'react-native-maps';
import PubNub from 'pubnub';

export default class MapsExample extends Component {
  constructor(props) {
    super(props);

    this.state = {
      region: {
        latitude: 37.78825,
        longitude: -122.4324,
        latitudeDelta: 0.0922,
        longitudeDelta: 0.0421,
      },
      markers: [],
    };

    this.pubnub = new PubNub({
      publishKey: 'your-publish-key',
      subscribeKey: 'your-subscribe-key',
      uuid: "yourUniqueUserId"
    });

    this.onRegionChange = this.onRegionChange.bind(this);
  }

  componentDidMount() {
    this.watchPosition();
  }

  watchPosition() {
    navigator.geolocation.watchPosition(
      position => {
        const { latitude, longitude } = position.coords;
        this.pubnub.publish({
          message: {
            uuid: this.pubnub.getUUID(),
            latitude,
            longitude,
          },
          channel: "global"
        });

        // Update state to re-render markers if needed
        this.setState(prevState => ({
          markers: [
            ...prevState.markers,
            {
              latlng: { latitude, longitude },
              title: "User Location",
              description: "Current user position."
            }
          ]
        }));
      },
      error => console.log("Maps Error: ", error),
      {
        enableHighAccuracy: false,
        distanceFilter: 100
      }
    );
  }

  onRegionChange(region) {
    this.setState({ region });
  }

  render() {
    return (
      <View style={{ flex: 1 }}>
        <MapView
          style={{ flex: 1 }}
          region={this.state.region}
          onRegionChange={this.onRegionChange}
        >
          {this.state.markers.map((marker, index) => (
            <Marker
              key={index}
              coordinate={marker.latlng}
              title={marker.title}
              description={marker.description}
            />
          ))}
        </MapView>
      </View>
    );
  }
}
```

위의 코드 스니펫에서 디바이스가 미리 정해진 거리만큼 이동할 때마다 디바이스의 좌표를 게시하는 기능을 설정한 것을 볼 수 있습니다. 이렇게 하면 지속적으로 위치를 업데이트할 수 있습니다. React Native로 위치 추적 채팅 앱을 만들고 게시/서브 기능을 사용하는 방법에 대한 종합적인 가이드는 [실시간 위치 추적 앱 빌드](https://pubnub.com/blog/realtime-geo-tracking-app-react-native/) 튜토리얼을 참조하세요.

### 모바일 푸시 알림과 IoT

PubNub은 실시간 상호작용을 강화하도록 설계되었을 뿐만 아니라 [모바일 푸시 알림](https://www.pubnub.com/products/mobile-push-notifications/) 발송을 지원하며 IoT 관련 요구사항을 충족합니다. 푸시 알림 기능은 앱을 사용하지 않을 때에도 사용자에게 업데이트에 대한 정보를 제공하여 원활한 사용자 경험을 제공합니다. iOS용 APNS와 Android용 FCM을 모두 지원하여 다양한 디바이스에 걸쳐 폭넓은 범위를 보장합니다.

PubNub는 종속성을 처리하기 위해 npm 지원과 직관적인 CLI를 제공합니다. 맵뷰나 리액트를 JS 파일로 손쉽게 가져올 수 있습니다. PubNub의 안전한 서버리스 아키텍처를 사용하면 백엔드 기능에 Node.js와 Python의 강력한 기능을 활용할 수 있다는 추가적인 이점이 있습니다. PubNub API 키는 간단한 인증을 제공합니다. 게시 및 구독 키를 사용하여 애플리케이션과 JSON 파일 형식의 데이터 스트림을 공유할 수 있습니다.

PubNub 사용의 장점은 쉽게 구성할 수 있는 권한과 이벤트 핸들러가 있어 채팅 애플리케이션에서 효과적으로 사용할 수 있다는 것입니다. Flutter, React Native Maps를 사용하든, CSS를 사용하여 다양한 플랫폼에서 작업하든 PubNub는 앱 구축 과정을 효율적으로 만들어 줍니다.

React Native 애플리케이션에서 [모바일 푸시 알림을](https://pubnub.com/docs/messages/push/send) 통합하는 방법에 대해 자세히 알아보세요. 또한 채팅 애플리케이션에서 원활한 실시간 상호작용을 위해 콜백 함수를 처리하는 방법을 알아보세요.

나머지 섹션은 비슷한 방식으로 계속 진행되며, 더 깊이 있는 내용을 추가하고, 용어를 명확히 하고, 최신 참조 및 가이드를 제공하고, 일반적인 문제를 해결하고, 관련 통계를 통합할 것입니다. 결론에는 독자가 직접 PubNub을 사용해 볼 수 있는 콜투액션이 포함될 것입니다. 또한 모든 링크가 제대로 작동하는지, 시각 자료, 다이어그램 및 GIF가 최신 상태인지 다시 한 번 확인합니다.

마지막으로 PubNub의 시뮬레이터 개선과 같은 새로운 기능이나 발전 사항을 강조하여 개발자가 실시간 인터랙션에 필요한 플랫폼을 제공하기 위해 지속적으로 노력하고 있다는 점을 강조합니다.

#### 내용

[리액트 네이](#h-0)티브 실시간[트렌드리얼타임용 리액트 네이티브란](#h-1)?[실시간 서비스로 PubNub을 사용해야](#h-2) 하는[이유리얼타임 리액트 네이티브](#h-3)[기본사항PubNub과 리액트 네이티브 연결하기퍼블리싱](#h-4)[및](#h-5)[구독메시징저장](#h-6)[및](#h-7)[재생위치정보](#h-8)[모바일](#h-7)[푸시 알림 및 IoT](#h-9)

PubNub이 어떤 도움을 줄 수 있을까요?
========================

이 문서는 원래 [PubNub.com에](https://www.pubnub.com/blog/pubnub-react-native-basics-pub-sub-history-gelocation-presence/) 게시되었습니다.

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

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

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

[라이브 투어를](https://www.pubnub.com/tour/introduction/) 통해 5분 이내에 모든 PubNub 기반 앱의 필수 개념을 이해하세요.

설정하기
----

PubNub [계정에](https://admin.pubnub.com/signup/) 가입하여 PubNub 키에 무료로 즉시 액세스하세요.

시작하기
----

사용 사례나 [SDK에](https://www.pubnub.com/docs) 관계없이 [PubNub 문서를](https://www.pubnub.com/docs) 통해 바로 시작하고 실행할 수 있습니다.