React

React - 실시간 동작을 처리하기 위해 사용되는 라이브러리 및 도구

hminor 2024. 7. 6. 17:17
반응형

해당 포스팅은 추후에 사용해보고 싶은
실시간 동작을 처리하기 위해 사용되는 라이브러리 및 도구의 목록으로
현재는 Socket.IO, SSE, FireBase 만 사용해봤기에
기억해두고자 작성함.


1. Socket.IO

  • 설명: WebSocket 프로토콜을 사용하여 브라우저와 서버 간의 실시간 양방향 통신을 가능하게 하는 라이브러리입니다.
  • 특징:
    • 자동 재연결
    • 이벤트 기반 통신
    • 브로드캐스팅 기능
  • 사용 예제:
import { io } from "socket.io-client";

const socket = io("http://localhost:3000");

socket.on("connect", () => {
  console.log("Connected to server");
});

socket.on("message", (data) => {
  console.log("Received message:", data);
});

socket.emit("sendMessage", { text: "Hello, server!" });

2. Pusher

  • 설명: 채팅, 실시간 알림, 라이브 데이터 스트리밍 등에 자주 사용되는 실시간 푸시 서비스.
  • 특징:
    • 간편한 설정
    • 다양한 클라이언트 SDK 제공
    • 보안 기능 내장
  • 사용 예제:
import Pusher from 'pusher-js';

const pusher = new Pusher('YOUR_APP_KEY', {
  cluster: 'YOUR_APP_CLUSTER'
});

const channel = pusher.subscribe('my-channel');
channel.bind('my-event', function(data) {
  alert('An event was triggered with message: ' + data.message);
});

3. Firebase Realtime Database

  • 설명: Google의 Firebase 플랫폼에서 제공하는 실시간 데이터베이스 서비스.
  • 특징:
    • 실시간 데이터 동기화
    • 클라이언트 라이브러리를 통해 간편하게 사용 가능
    • 사용자 인증 기능 내장
  • 사용 예제:
import firebase from "firebase/app";
import "firebase/database";

const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  databaseURL: "YOUR_DATABASE_URL",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID"
};

firebase.initializeApp(firebaseConfig);
const database = firebase.database();

const messagesRef = database.ref("messages");
messagesRef.on("value", (snapshot) => {
  const messages = snapshot.val();
  console.log("Messages:", messages);
});

messagesRef.push({
  text: "Hello, world!"
});

4. Apollo Client with GraphQL Subscriptions

  • 설명: GraphQL을 사용하여 실시간 데이터를 구독하는 방법. Apollo Client는 GraphQL 클라이언트 라이브러리입니다.
  • 특징:
    • GraphQL을 통한 데이터 쿼리 및 구독
    • WebSocket 링크를 통한 실시간 업데이트
  • 사용 예제:
import { ApolloClient, InMemoryCache } from "@apollo/client";
import { WebSocketLink } from "@apollo/client/link/ws";
import { split, HttpLink } from "@apollo/client";
import { getMainDefinition } from "@apollo/client/utilities";

const httpLink = new HttpLink({
  uri: 'http://localhost:4000/graphql'
});

const wsLink = new WebSocketLink({
  uri: `ws://localhost:4000/graphql`,
  options: {
    reconnect: true
  }
});

const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return (
      definition.kind === 'OperationDefinition' &&
      definition.operation === 'subscription'
    );
  },
  wsLink,
  httpLink,
);

const client = new ApolloClient({
  link: splitLink,
  cache: new InMemoryCache()
});

// 사용 예제는 특정 GraphQL 서버와의 연동이 필요

5. Ably

  • 설명: Pub/Sub 메시징, 실시간 데이터 스트리밍 등을 제공하는 서비스.
  • 특징:
    • WebSocket, MQTT, SSE 등을 지원
    • 다양한 클라이언트 SDK 제공
    • 확장성 및 고가용성
  • 사용 예제:
import Ably from 'ably';

const realtime = new Ably.Realtime('YOUR_API_KEY');
const channel = realtime.channels.get('test');

channel.subscribe('update', (message) => {
  console.log('Received message:', message.data);
});

channel.publish('update', { text: 'Hello, world!' });

 

6. Meteor

  • 설명: 실시간 웹 애플리케이션 개발을 위한 풀스택 프레임워크입니다.
  • 특징:
    • 실시간 데이터 업데이트
    • 클라이언트와 서버 간의 일관된 API
    • MongoDB와의 통합이 용이
  • 사용 예제:
// 클라이언트 코드
import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';

Tracker.autorun(() => {
  const messages = Messages.find().fetch();
  console.log("Messages:", messages);
});

Meteor.call('addMessage', { text: 'Hello, world!' });

// 서버 코드
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';

const Messages = new Mongo.Collection('messages');

Meteor.methods({
  addMessage(message) {
    Messages.insert(message);
  }
});

Meteor.publish('messages', function() {
  return Messages.find();
});

7. SignalR

  • 설명: ASP.NET을 위한 라이브러리로, 서버와 클라이언트 간의 실시간 웹 기능을 쉽게 구현할 수 있습니다.
  • 특징:
    • 다양한 전송 프로토콜 지원 (WebSockets, Server-Sent Events, Long Polling 등)
    • 자동 재연결
    • 그룹 메시징 기능
  • 사용 예제:
import * as signalR from "@microsoft/signalr";

const connection = new signalR.HubConnectionBuilder()
  .withUrl("/chatHub")
  .build();

connection.on("ReceiveMessage", (user, message) => {
  console.log(user + ": " + message);
});

connection.start().then(() => {
  connection.invoke("SendMessage", "User1", "Hello, world!");
});

8. SSE (Server-Sent Events)

  • 설명: 서버에서 클라이언트로 실시간 이벤트를 전송하기 위한 표준 기술입니다.
  • 특징:
    • 단방향 통신 (서버 -> 클라이언트)
    • 간단한 설정 및 사용
    • HTTP/2와 호환 가능
  • 사용 예제:
// 서버 코드 (Express 사용)
const express = require('express');
const app = express();

app.get('/events', (req, res) => {
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');

  setInterval(() => {
    res.write('data: ' + JSON.stringify({ text: 'Hello, world!' }) + '\n\n');
  }, 1000);
});

app.listen(3000);

// 클라이언트 코드
const eventSource = new EventSource('http://localhost:3000/events');

eventSource.onmessage = function(event) {
  const data = JSON.parse(event.data);
  console.log(data.text);
};

9. Primus

  • 설명: WebSocket 라이브러리로, 다양한 실시간 전송 프로토콜을 지원합니다.
  • 특징:
    • 다양한 전송 프로토콜 지원 (WebSockets, Server-Sent Events, Long Polling 등)
    • 플러그인 시스템
    • 단순한 API
  • 사용 예제:
// 서버 코드
const http = require('http');
const Primus = require('primus');

const server = http.createServer();
const primus = new Primus(server, { transformer: 'websockets' });

primus.on('connection', (spark) => {
  spark.write('Hello, world!');
});

server.listen(3000);

// 클라이언트 코드
const Primus = require('primus');
const Socket = Primus.createSocket({ transformer: 'websockets' });

const socket = new Socket('http://localhost:3000');

socket.on('data', (data) => {
  console.log(data);
});

10. Deepstream.io

  • 설명: 실시간 데이터 서버로, 데이터 동기화, RPC, 이벤트 시스템 등을 제공합니다.
  • 특징:
    • 실시간 데이터 동기화
    • 이벤트 시스템
    • RPC 호출 지원
  • 사용 예제:
const deepstream = require('deepstream.io-client-js');

const client = deepstream('localhost:6020').login();

const record = client.record.getRecord('some-record');

record.subscribe((data) => {
  console.log('Received data:', data);
});

record.set({ text: 'Hello, world!' });