실시간 대시보드: 심박수 모니터 구축으로 원격 건강 추적 강화

발행: (2026년 1월 11일 오전 10:00 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

현대 웰니스 세계에서, 웨어러블 센서부터 원격 모니터링까지 실시간 데이터에 대한 수요는 그 어느 때보다 높습니다. 개발자와 헬스‑테크 애호가에게는 서버에서 클라이언트로 연속적인 데이터 스트림을 효율적으로 푸시하는 것이 과제입니다.

반응형 경험을 만들기 위해서는 구식 데이터 가져오기 방식에서 벗어나 지속적인 “실시간” 연결로 전환해야 합니다. 전통적인 웹 애플리케이션은 요청‑응답 모델에 의존하므로 클라이언트가 지속적으로 서버에 업데이트를 요청해야 합니다. 이는 종종 지연이나 모바일 기기의 배터리 소모를 크게 증가시킵니다.

WebSockets는 양방향 통신 채널을 제공함으로써 이를 해결합니다. 서버는 대시보드에 발생하는 정확한 순간에 심박수를 푸시할 수 있어, 끊김 없고 당황스럽지 않은 사용자 경험을 제공합니다.

비교: HTTP 폴링 vs 웹소켓

특징HTTP 폴링웹소켓
통신단방향 (클라이언트 → 서버)양방향 (양쪽 모두)
지연 시간높음 (요청 대기 중)최소 (즉시 푸시)
효율성높은 오버헤드낮은 오버헤드
사용 사례정적 보고서실시간 심박 모니터

Node.js로 ECG 파형 시뮬레이션

현실적인 환경을 만들기 위해 Node.js를 사용해 ECG(심전도) 파형을 시뮬레이션합니다. 이 스크립트는 휴식 상태의 심장에 해당하는 P‑파, QRS 복합체, T‑파를 모방한 데이터 포인트를 생성합니다. 이러한 포인트는 WebSocket 서버를 통해 방송되어, 연결된 모든 사용자가 동시에 동일한 리듬을 볼 수 있게 합니다.

// Example: ECG simulation (Node.js)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

function generateECGPoint() {
  // Simple sine‑based mock; replace with realistic model as needed
  const t = Date.now() / 1000;
  const value = Math.sin(2 * Math.PI * 1.2 * t) * 0.5 + Math.random() * 0.05;
  return { timestamp: Date.now(), value };
}

setInterval(() => {
  const point = generateECGPoint();
  wss.clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify(point));
    }
  });
}, 20); // ~50 points per second

React와 Chart.js를 이용한 프론트엔드 구현

프론트엔드는 React와 Chart.js를 사용해 원시 데이터를 인식 가능한 파형으로 변환합니다. 차트를 최신 50개의 데이터 포인트로 제한함으로써 인터페이스가 깔끔하고 반응성이 유지되며, 디바이스의 프로세서를 과부하시키지 않습니다.

핵심 전략

  • Persistent HooksuseEffect를 사용해 WebSocket 연결을 설정하고 정리합니다.
  • State Management – 새로운 포인트가 도착할 때마다 라벨과 데이터셋을 실시간으로 업데이트합니다.
  • Performance Tuning – 무거운 애니메이션을 비활성화하여 심장 박동의 부드러운 “스크롤” 효과를 보장합니다.
import React, { useEffect, useState } from 'react';
import { Line } from 'react-chartjs-2';

const HeartbeatChart = () => {
  const [dataPoints, setDataPoints] = useState([]);

  useEffect(() => {
    const ws = new WebSocket('ws://localhost:8080');
    ws.onmessage = (event) => {
      const point = JSON.parse(event.data);
      setDataPoints(prev => {
        const updated = [...prev, point.value].slice(-50);
        return updated;
      });
    };
    return () => ws.close();
  }, []);

  const chartData = {
    labels: dataPoints.map((_, i) => i),
    datasets: [
      {
        label: 'ECG',
        data: dataPoints,
        borderColor: 'red',
        fill: false,
        pointRadius: 0,
        tension: 0.1,
      },
    ],
  };

  const options = {
    animation: false,
    scales: {
      x: { display: false },
      y: { min: -1, max: 1 },
    },
  };

  return ;
};

export default HeartbeatChart;

보안 고려 사항

  • WSS (WebSocket Secure) – 전송 중 데이터를 암호화하기 위해 SSL/TLS를 사용합니다.
  • Origin Validation – 신뢰할 수 있는 도메인에서만 연결을 허용합니다.
  • Token‑Based Authentication – JWT 또는 유사한 메커니즘으로 각 클라이언트를 검증합니다.

이러한 단계는 민감한 생리학적 데이터가 사용자와 제공자 사이에만 유지되도록 보장합니다.

WebSocket 기반 심박수 모니터링의 장점

  • 효율성 – WebSocket은 기존 폴링 방식에 비해 서버 부하를 줄여줍니다.
  • 시각화 – 깔끔하고 실시간으로 업데이트되는 차트는 사용자 신뢰와 참여도를 높입니다.
  • 확장성 – 적절한 백엔드 아키텍처는 수천 개의 동시 “심장박동”을 처리할 수 있습니다.

추가 읽기

코드에 대한 전체 walkthrough와 더 고급 구현 세부 사항은 WellAlly의 전체 가이드를 참조하세요.

Back to Blog

관련 글

더 보기 »

초보자를 위한 Pusher vs Socket.io 설명

실시간 기능에 대해 이야기할 때 “그냥 WebSockets를 사용해” 혹은 “Pusher가 더 쉽다” 같은 말을 들어본 적이 있을 겁니다. 처음에는 이 주제가 종종 …

WebSocket과 Socket.IO

이 게시물에는 깜박이는 gif가 포함되어 있습니다. HTTP 요청은 나를 꽤 멀리 데려다 주었지만, 이제 그 한계에 부딪히고 있습니다. 클라이언트에게 서버 업데이트를 어떻게 알려야 할까요?

Node.js 및 Express.js를 활용한 API 설계 모범 사례

소개: 대부분의 API가 규모를 확장하기 전에 실패하는 이유 🚨 오늘 작동하는 API를 만들 수 있지만… 내일은 여전히 ​​깨진 시스템을 구축하고 있을 수 있습니다. 많은 API가 실패하는 이유는…