임베디드 관련 카테고리/네이버 클라우드 플랫폼(NCP)
NCP 서버와 TX2를 활용한 REST API 데이터 전송 및 저장
CBJH
2024. 12. 16. 18:13
728x90
반응형
이번 글에서는 NCP 서버와 TX2를 이용하여 REST API를 통해 데이터를 MySQL 데이터베이스에 저장하는 방법을 소개합니다. Flask를 이용해 API를 구현하고, TX2에서 데이터를 전송하며, Docker Compose를 통해 모든 서비스를 컨테이너화하여 효율적으로 관리할 수 있도록 구성해보겠습니다.
구현 개요
NCP 서버
- Flask 기반의 REST API를 만듭니다.
- API는 데이터를 받아서 MySQL 테이블에 하나씩 저장합니다.
TX2
- 데이터를 하나씩 REST API로 보내는 스크립트를 작성합니다.
프로젝트 디렉토리 구조
project-directory/
│
├── docker-compose.yml # Docker Compose 설정 파일 (루트 디렉토리)
├── flask-api/ # Flask API 관련 파일 디렉토리
│ ├── app.py # Flask 애플리케이션 코드
│ ├── Dockerfile # Flask API용 Dockerfile
│ ├── requirements.txt # Flask 의존성 패키지 목록
│
└── mysql-data/ # MySQL 데이터 저장소 (볼륨 바인딩 시 사용)
1. Docker Compose 설정
1.1 docker-compose.yml 파일
프로젝트 루트 디렉토리에 docker-compose.yml 파일을 생성합니다.
version: '3.1'
services:
mysql:
image: mysql:8.0.36
container_name: mysql_server
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: test_db
MYSQL_USER: test_user
MYSQL_PASSWORD: test_password
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
flask-api:
build: ./flask-api
container_name: flask_api
restart: always
ports:
- "5000:5000"
depends_on:
- mysql
volumes:
mysql-data:
2. Flask API 구현
2.1 Flask API 코드 (app.py)
flask-api/ 디렉토리에 app.py 파일을 생성하고 다음 코드를 작성합니다:
from flask import Flask, request, jsonify
import mysql.connector
app = Flask(__name__)
# MySQL 설정
db_config = {
"host": "mysql_server",
"user": "test_user",
"password": "test_password",
"database": "test_db"
}
@app.route('/add_employee', methods=['POST'])
def add_employee():
data = request.json
name = data.get("name")
position = data.get("position")
salary = data.get("salary")
try:
connection = mysql.connector.connect(**db_config)
cursor = connection.cursor()
query = "INSERT INTO employees (name, position, salary) VALUES (%s, %s, %s)"
cursor.execute(query, (name, position, salary))
connection.commit()
return jsonify({"message": "Employee added successfully!"}), 200
except Exception as e:
return jsonify({"error": str(e)}), 500
finally:
cursor.close()
connection.close()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
2.2 Flask API 의존성 목록 (requirements.txt)
flask-api/ 디렉토리에 requirements.txt 파일을 생성합니다:
flask
mysql-connector-python
2.3 Flask API용 Dockerfile
flask-api/ 디렉토리에 Dockerfile 파일을 생성합니다:
FROM python:3.9-slim
WORKDIR /app
COPY app.py /app
COPY requirements.txt /app
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "app.py"]
3. Docker Compose 실행
3.1 디렉토리 생성 및 파일 작성
mkdir -p project-directory/flask-api
cd project-directory
- docker-compose.yml, app.py, requirements.txt, **Dockerfile**을 생성합니다.
3.2 Docker Compose 빌드 및 실행
sudo docker-compose up -d --build
3.3 컨테이너 상태 확인
sudo docker ps
4. TX2에서 데이터 전송
4.1 Python 2.x 환경에서 요청 라이브러리 설치
TX2에서 Python 2.x을 사용하는 경우, requests 라이브러리를 설치해야 합니다.
sudo apt update
sudo apt install -y python-pip
pip install requests
설치된 requests 패키지를 확인합니다:
pip show requests
4.2 TX2 데이터 전송 스크립트
TX2에 send_data.py 파일을 생성합니다:
# -*- coding: utf-8 -*-
import requests
import time
# NCP 서버의 API 주소
API_URL = "http://[NCP 서버의 공인 IP]:5000/add_employee"
# 데이터 리스트
data_list = [
{"name": "Alice", "position": "Manager", "salary": 90000.00},
{"name": "Bob", "position": "Engineer", "salary": 75000.00},
{"name": "Charlie", "position": "HR", "salary": 60000.00},
{"name": "Daisy", "position": "Developer", "salary": 80000.00},
{"name": "Ethan", "position": "Designer", "salary": 70000.00},
{"name": "Fiona", "position": "Analyst", "salary": 72000.00},
{"name": "George", "position": "Technician", "salary": 68000.00},
{"name": "Hannah", "position": "Support", "salary": 55000.00},
{"name": "Ian", "position": "Consultant", "salary": 78000.00},
{"name": "Jane", "position": "Intern", "salary": 40000.00}
]
# 데이터 전송
for employee in data_list:
response = requests.post(API_URL, json=employee)
print "Sending: {} | Response: {}, {}".format(employee, response.status_code, response.json())
time.sleep(1) # 1초 간격으로 전송
4.3 Python 스크립트 실행
TX2에서 데이터를 전송합니다:
python3 send_data.py
5. 결과 확인
- 데이터가 MySQL 테이블에 성공적으로 저장되었는지 확인합니다:
- USE test_db; SELECT * FROM employees;
- MySQL Workbench를 통해 데이터를 확인할 수도 있습니다.
결론
이 구조를 사용하면 Flask와 MySQL을 각각 독립적인 컨테이너에서 실행하고, TX2에서 데이터를 API로 전송하여 효율적으로 관리할 수 있습니다.
문제가 있거나 궁금한 점이 있으면 댓글로 남겨주세요! 😊