백엔드 개발 일지: Python과 Node.js로 구현한 실시간 데이터 처리 경험담
안녕하세요, 오늘은 Python과 Node.js를 활용해 실시간 데이터 처리 시스템을 구축한 경험담을 공유하고자 합니다. 실시간 데이터 처리란 여러 소스에서 발생하는 데이터를 즉각적으로 수집하고 처리해 사용자에게 결과를 보여주는 시스템을 의미합니다. 이러한 시스템은 IoT, 소셜 미디어, 금융 서비스 등 다양한 분야에서 필수적입니다. 이번 프로젝트에서는 Python을 데이터 수집 및 처리에, Node.js를 데이터 전송과 사용자 인터페이스에 사용했습니다.
프로젝트 개요
프로젝트의 목표는 IoT 센서로부터 수집한 데이터를 실시간으로 처리하고 웹 애플리케이션을 통해 시각화하는 것입니다. 센서 데이터는 온도와 습도 값으로, 이를 바탕으로 대시보드를 구성할 계획이었습니다. 데이터 수집은 Python의 Flask 프레임워크를 이용해 API를 구축하고, Node.js의 Socket.IO를 통해 실시간으로 클라이언트에게 데이터를 전송하는 구조입니다.
Python을 이용한 데이터 수집 및 처리
먼저, Flask를 이용해 간단한 API 서버를 구축했습니다. 이 API는 IoT 센서로부터 POST 요청을 통해 데이터를 수집합니다. 아래는 Flask를 이용한 간단한 API 코드입니다.
from flask import Flask, request, jsonify
import json
app = Flask(__name__)
data_store = []
@app.route('/data', methods=['POST'])
def receive_data():
data = request.json
data_store.append(data)
return jsonify({"status": "success", "data": data}), 201
@app.route('/data', methods=['GET'])
def get_data():
return jsonify(data_store), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
위 코드는 POST 요청을 통해 수신된 데이터(온도, 습도)를 data_store 리스트에 저장하고, GET 요청을 통해 저장된 데이터를 반환합니다. 이 API 서버는 데이터 수집의 핵심 역할을 수행합니다.
Node.js로 데이터 전송 및 클라이언트 처리
이제 수집된 데이터를 클라이언트에 실시간으로 전송하기 위해 Node.js와 Socket.IO를 활용했습니다. Socket.IO는 WebSocket 기반의 라이브러리로, 실시간 양방향 통신을 손쉽게 구현할 수 있게 도와줍니다. 아래는 Node.js 서버 코드 예시입니다.
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const axios = require('axios');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
const DATA_API_URL = 'http://localhost:5000/data';
io.on('connection', (socket) => {
console.log('새로운 클라이언트가 연결되었습니다.');
// 5초마다 데이터 요청
setInterval(async () => {
try {
const response = await axios.get(DATA_API_URL);
socket.emit('data_update', response.data);
} catch (error) {
console.error('데이터 요청 실패:', error);
}
}, 5000);
});
server.listen(3000, () => {
console.log('서버가 http://localhost:3000 에서 실행 중입니다.');
});
이 코드는 클라이언트가 Socket.IO를 통해 서버에 연결될 때, 5초마다 Flask API를 호출하여 수집된 데이터를 가져옵니다. 가져온 데이터는 data_update 이벤트를 통해 클라이언트로 전송됩니다.
클라이언트 측 구현
클라이언트 측에서는 Socket.IO 클라이언트 라이브러리를 사용하여 서버로부터 데이터를 수신하고, 이를 화면에 표시합니다. 아래는 간단한 HTML과 JavaScript 코드 예시입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>실시간 데이터 대시보드</title>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<h1>실시간 데이터 대시보드</h1>
<div id="data"></div>
<script>
const socket = io();
socket.on('data_update', function(data) {
const dataDiv = document.getElementById('data');
dataDiv.innerHTML = JSON.stringify(data);
});
</script>
</body>
</html>
위 코드는 Socket.IO 클라이언트 라이브러리를 통해 서버와 연결하고, 서버로부터 수신한 데이터를 화면에 표시합니다.
마무리
이번 프로젝트를 통해 Python과 Node.js를 조합하여 실시간 데이터 처리 시스템을 구현하는 방법을 경험할 수 있었습니다. Python은 데이터 수집과 처리에 강점을 보였고, Node.js는 실시간 데이터 전송과 클라이언트 처리에 적합함을 확인했습니다. 두 언어의 장점을 결합하여 효율적이고 실용적인 시스템을 구축할 수 있었습니다. 앞으로 이러한 경험을 바탕으로 더 나은 실시간 데이터 처리 솔루션을 개발할 수 있도록 노력하겠습니다.