[Monitoring System] 5. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (1)

2023. 6. 13. 15:38ยท๐ŸŽผ Project/๐ŸงŠ Monitoring System
728x90
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, TIMESTAMP, Float
from .base import Base

์ œ๋ชฉ์€ ๊ฑฐ์ฐฝํ•˜๊ฒŒ ์จ๋†จ์ง€๋งŒ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•ด์„œ ๊ทธ๋ฆฌ ์˜ค๋ž˜๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์„ ๋ฟ์ด๋‹ค^^.

์šฐ์„  ๋ฐฑ์—”๋“œ๋ฅผ ํ•ด๋ณด๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์ด๋ฒˆ์ด ์ฒ˜์Œ์ด๊ณ , ํ•„์š”์— ์˜ํ•ด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ณต๋ถ€ํ•ด์„œ ํ›„๋‹ฅ๋‹ฅ ๋งŒ๋“ค์–ด์„œ ๋‹ค์†Œ ์กฐ์žกํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์–ด์จŒ๋“  ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ์ž์ฒด๋Š” ์ž˜ ๋™์ž‘ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ํ˜ธ์ŠคํŒ…๋งŒ ๋”ฐ๋กœ ํ•ด์ฃผ๋ฉด ๋‹น์žฅ ์“ธ ์ˆ˜ ์žˆ๋‹ค. Python์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์„œ Python์˜ ๋…ธ์˜ˆ์ธ ๋‚˜์—๊ฒŒ๋Š” ์•„์ฃผ ํŽธํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด์—ˆ๋˜ ๊ฒƒ๋„ ํ•œ ๋ชซํ–ˆ๋‹ค.

0. Fast API ์ž์Šต์„œ

Fast API ๊ณต์‹๋ฌธ์„œ๋กœ ๊ณต๋ถ€ํ•˜๋Š” ์‹œ๊ฐ„์„ ํ•˜๋ฃจ ๊ฐ€์ง€๊ณ  ์ดํ‹€๋™์•ˆ ๊ฐœ๋ฐœ์„ ํ–ˆ๋‹ค. ์•„๋ž˜ ๋‘ ๊ธ€ ์ฐธ๊ณ . ํŠœํ† ๋ฆฌ์–ผ์ด ์˜์–ด๋กœ ๋˜์–ด์žˆ์–ด์„œ ํ•œ๊ตญ์–ด๋กœ ์–ด์„คํ”„๊ฒŒ๋‚˜๋งˆ ๋ฒˆ์—ญํ•˜๊ณ  ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค.

https://dnai-deny.tistory.com/59

 

[FastAPI] Tutorial(1)

โ€ป FastAPI Tutorial์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ดํ•ดํ•œ๋Œ€๋กœ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์œผ๋กœ, ์‹ค์ œ ๋‚ด์šฉ๊ณผ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. โ€ป ์ค‘๊ฐ„์— ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด

dnai-deny.tistory.com

https://dnai-deny.tistory.com/60

 

[FastAPI] Tutorial(2)

โ€ป FastAPI Tutorial์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ดํ•ดํ•œ๋Œ€๋กœ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์œผ๋กœ, ์‹ค์ œ ๋‚ด์šฉ๊ณผ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://fastapi.tiangolo.com/ko/tu

dnai-deny.tistory.com

1. ๊ตฌ์กฐ ๊ตฌ์ƒํ•˜๊ธฐ

๊ฒ‰์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์€ Data ์˜ ๊ฒฝ์šฐ CRUD(Create, Read, Update, Delete)๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๋” ๋งŽ๋‹ค.

A. Data Table

Monitoring System์€ ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์€ ์ž„์˜๋กœ ๋ฐœ์ƒ์‹œ์ผœ์„œ MQTT๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜ค๋Š” ์˜จ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ด ์„ธ ๊ฐ€์ง€์˜ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๋ฐ์ดํ„ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ด๋‹ค.

์ด์ „๊นŒ์ง€์˜ ์ง„๋™ ๋ฐ์ดํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์€ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋กœ, ์›น ์„œ๋ฒ„๋ฅผ ํ†ตํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์ •๋„๋กœ ๊ณ ์†์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜จ๋„ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค๋Š” ์ ์„ ์ฐธ๊ณ  ๋ฐ”๋ž€๋‹ค.

  1. User
    • ๋กœ๊ทธ์ธ / ๊ฐ€์ž…
    • ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์— ๋”ฐ๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง ํŽ˜์ด์ง€ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด
  2. Sensor
    • ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ์žˆ๋Š” ์„ผ์„œ์˜ ์ข…๋ฅ˜
    • ์„ผ์„œ ์ •๋ณด
    • ์„ผ์„œ ๊ด€๋ฆฌ์ž
  3. Degree
    • ์˜จ๋„ ๋ฐ์ดํ„ฐ
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ทจ๋“ํ•˜๊ณ  ์žˆ๋Š” ์„ผ์„œ ์ •๋ณด

B. Pages

์ดํ›„์— ๋” ๋งŽ์€ ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, ํ˜„์žฌ ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋Š” ์ด ์„ธ ๊ฐ€์ง€์ด๋‹ค.

  1. ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
  2. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
  3. ๋ชจ๋‹ˆํ„ฐ๋ง ํŽ˜์ด์ง€

์ด ์ค‘ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ํŽ˜์ด์ง€๋Š” bootstrap ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ•„์ž๊ฐ€ CSS๋ž‘ ์‚ฌ์ด๊ฐ€ ์•ˆ ์ข‹๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง ํŽ˜์ด์ง€๋Š” ์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•œ ๊ทธ๋ž˜ํ”„ ํ•˜๋‚˜ ๊ทธ๋ฆฌ๋Š” ์ •๋„๊ฐ€ ๋ชฉํ‘œ์ด๋ฏ€๋กœ, ๊ตฌ๊ธ€ ๊ทธ๋ž˜ํ”„ api๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋ฆฌ๊ธฐ๋กœ ํ–ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด๊ฑด ์ข€ ๋” ๋‚˜์ค‘ ์–˜๊ธฐ๋‹ค.

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ๋Š” ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , DB์˜ User Table์—์„œ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์„œ ๋กœ๊ทธ์ธ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•œ๋‹ค. ๋งŒ์ผ ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด ํšŒ์›๊ฐ€์ž…์„ ํ•˜์—ฌ DB์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋ชจ๋‹ˆํ„ฐ๋ง ํŽ˜์ด์ง€์—์„œ๋Š” ํ˜„์žฌ ์ˆ˜์ง‘๋˜๊ณ  ์žˆ๋Š” ์˜จ๋„ ๋ฐ์ดํ„ฐ๋ฅผ plotํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

 

2. ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ

vscode ๋“ฑ ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์™€ postgreSQL์ด ํ•„์š”ํ•˜๋‹ค. postgreSQL๊ณผ vscode๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ์„ค์น˜ ๊ฐ€๋Šฅํ•˜๋‹ค. python์ด ์—†๋‹ค๋ฉด ์ด๊ฒƒ๋„ ์„ค์น˜ํ•˜์ž. python 3.11...์ด ์–ธ์ œ ๋ฆด๋ฆฌ์ฆˆ๋์ง€? ํ•„์ž๋Š” ํŒŒ์ด์ฌ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ 3.8์ด๋‹ค. ์ ์ ˆํžˆ ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์ง€ ์•Š์€ ๋ฒ„์ „์œผ๋กœ ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

 

PostgreSQL

The world's most advanced open source database.

www.postgresql.org

 

 

Download Python

The official home of the Python Programming Language

www.python.org

vscode์˜ ํ„ฐ๋ฏธ๋„์—์„œ fastapi๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

!pip install fastapi

 

 

์ค€๋น„๋Š” ๋๋‚ฌ๋‹ค.

์•„ ์•ˆ๋๋‚ฌ๋‹ค.

!pip install sqlalchemy pydantic typing_extension uvicorn

DB ์—ฐ๊ฒฐ์„ ์œ„ํ•ด SQLAlchemy๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ, fastapi ํ™œ์šฉ์„ ์œ„ํ•ด pydantic๊ณผ typing_extension๋„ ์—†์œผ๋ฉด ์„ค์น˜ํ•ด์ฃผ๊ณ , ์„œ๋ฒ„๋ฅผ ๋ผ์ด๋ธŒ๋กœ ๋„์›Œ๋ณด๊ธฐ ์œ„ํ•ด์„œ uvicorn๋„ ์„ค์น˜ํ–ˆ๋‹ค. ์ง„์งœ ๋๋‚ฌ๋‹ค. ํ•„์š”ํ•œ ๊ฒŒ ์ƒ๊ฐ๋‚˜๋ฉด ๊ทธ๋•Œ ๊น”์•„์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

3. api ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

๋ผ์šฐํŠธ ์ฃผ์†Œ์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ๊ฒŒ์‹œํ•˜๊ณ , ์‚ญ์ œํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์“ฐ์ž„์ƒˆ์— ๋”ฐ๋ผ์„œ ๋ผ์šฐํŠธ๋ฅผ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ฝ”๋“œ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋Š” ๋ถ„๋Ÿ‰์ด ๋Š˜์–ด๋‚ฌ์„ ๋•Œ ํ•˜๊ณ , ์šฐ์„ ์€ ๋ฉ”์ธ์— api ๋“ค์„ ์ฝ๊ณ  ์“ฐ๊ณ  ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณด์ž. 

- main.py

from fastapi import FastAPI

app = FastAPI()

# api section
@app.get('/api/')
def root():
    return {"message": "This is backend side API section."}
uvicorn main:app --reload

์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•˜๋ฉด http://127.0.0.1/8000/api ์ฃผ์†Œ์—์„œ message json์„ ๋งŒ๋‚˜๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ๊ณง์žฅ ์œ„์—์„œ ์ด์•ผ๊ธฐํ–ˆ๋˜ ์„ธ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ, User, Sensor, Degree ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜์ž. ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผํ•  ๊ฒƒ์€ PostgreSQL๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. PostgreSQL ํด๋ผ์ด์–ธํŠธ(pg Admin ์ด๋ผ๋Š” ์ด๋ฆ„์ด๋‹ค)์— ๋“ค์–ด๊ฐ€์„œ ๊ธฐ๋ณธ์ •๋ณด๋ฅผ ๋“ฑ๋กํ–ˆ๋‹ค๋ฉด, ์ƒˆ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. databases์—์„œ ์šฐํด๋ฆญํ•˜๊ณ  createํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐฝ์ด ๋œฌ๋‹ค. ์ด๋ฆ„์„ ์ ๋‹นํžˆ ๋“ฑ๋กํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ๋‹ค์‹œ vscode๋กœ ๋Œ์•„์™€์„œ, SQLAlchemy engine์„ ์„ ์–ธํ•ด์ฃผ์ž. core ํด๋” ํ•˜์œ„์— base.py ํŒŒ์ผ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์„œ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

a. ๋ฐ์ดํ„ฐํ…Œ์ด๋ธ” ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "postgresql://{server_username}:{server_password}@localhost:5432/{database_name}"

engine = create_engine(SQLALCHEMY_DATABASE_URL)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

๋‹น์žฅ ์ดํ•ดํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๊ทธ๋Ÿผ ๋ฐ”๋กœ ์„ธ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

PostgreSQL์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฏ€๋กœ ํ…Œ์ด๋ธ”์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผํ•˜์ง€๋งŒ(์–ด๋–ค DB๋“  ์•ˆ ๊ทธ๋Ÿฌ๊ฒ ๋ƒ๋งŒ์€) ์ด๋ฒˆ์—๋Š” ๋‹ค๋ฃฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ๊ณ  ์„œ๋กœ ๊ด€๊ณ„๋„ ๋ช…ํ™•ํ•˜๋ฏ€๋กœ ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•ด๋ณด๊ฒ ๋‹ค. 

1. User

from sqlalchemy import Boolean, Column, ForeignKey,  Integer, String, TIMESTAMP, Float
from sqlalchemy.orm import relationship
from .base import Base

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, index=True)
    email = Column(String, unique=True, index=True)
    password = Column(String, index=True)
    disabled = Column(Boolean, index=True, default=False)
    sensors = relationship("Sensor", back_populates="owner")
  • id๊ฐ€ ๋Œ€ํ‘œ ํ‚ค๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
  • email์€ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค
  • disabled(๋น„ํ™œ์„ฑํ™”)์˜ ๊ธฐ๋ณธ ๊ฐ’์€ False์ด๋‹ค.

2. Sensor & Degree

class Sensor(Base):
    __tablename__ = "sensors"

    id = Column(Integer, primary_key=True, index=True)
    administer_id = Column(Integer, ForeignKey("users.id"))
    owner = relationship("User", back_populates="sensors")
    degrees = relationship("Degree", back_populates="sensor")

class Degree(Base):
    __tablename__ = "degrees"

    id = Column(Integer, primary_key=True, index=True)
    time = Column(TIMESTAMP, index=True)
    degree = Column(Float, index=True)
    sensor_id = Column(Integer, ForeignKey("sensors.id"))
    sensor = relationship("Sensor", back_populates="degrees")
  • Sensor์˜ administer_id์™€ Degree์˜ sensor_id๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ํ•œ column์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ์™ธ๋ถ€ํ‚ค(Foreign key)๋ผ๊ณ  ํ•˜๋Š”๋ฐ, FastAPI์™€ SQLAlchemy์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•ด์ค€๋‹ค. 
  • User์˜ sensors, Sensor์˜ degrees์™€ Degree์˜ sensor์€ relationship์ด๋ผ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

b. ์Šคํ‚ค๋งˆ ๋งŒ๋“ค๊ธฐ

๊ฐ™์€ ๋œป ๊ฐ™์ง€๋งŒ, ์ข€ ๋” ๋ถ„๋ฆฌํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ fastapi ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค์–ด์ค„ ๊ฒƒ์ด๋‹ค. ์œ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ”์„ ํ˜•์„ฑํ•˜๋Š” ๋‹จ๊ณ„์— ๊ฐ€๊น๊ณ , ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” FastAPI์—์„œ ํ˜ธ์ถœํ•ด์„œ ์ƒ์„ฑํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‚ญ์ œํ•  ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

1. User

from typing import List, Union
from pandas import Timestamp
from pydantic import BaseModel

# user
class UserBase(BaseModel):
    username: str
    email: str = None

class UserCreate(UserBase):
    password: str

class User(UserBase):
    id: int
    sensors: List[Sensor] = []
    disable: bool = False

    class Config:
        orm_mode = True
  • ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ” ๋‹น ์„ธ ๊ฐœ์˜ ์Šคํ‚ค๋งˆ๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ, Base๋Š” pydantic์˜ BaseModel์„ ์ƒ์†๋ฐ›์•„ username, email์˜ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค. 
  • ๋‘ ๋ฒˆ์งธ Create์—์„œ๋Š” ๊ธฐ๋ณธ ์ •๋ณด์— ํ…Œ์ด๋ธ” ์ƒ์„ฑ์„ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ์™„์„ฑ๋œ ํด๋ ˆ์Šค์—์„œ๋Š” ์•ž์„œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ•„์š”ํ–ˆ๋˜ ๋ชจ๋“  ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. 
    • ๋งˆ์ง€๋ง‰์— password๋ฅผ ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. ๋‚˜์ค‘์— ํ•ด์‰ฌ ๋ฐฉ์‹์œผ๋กœ ๋ณด์•ˆ์„ ์กฐ๊ธˆ์ด๋‚˜๋งˆ! ์ถ”๊ฐ€ํ•œ ๋’ค์— ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.
class Config:
    orm_mode = True

์ด pydantic์˜ orm_mode๋ฅผ True๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด, User๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ €์„ ๋•Œ ๋ฐ˜ํ™˜ํ˜•์„ ๋งŒ๋“ค์–ด์„œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. 

2. Sensor

# sensor
class SensorBase(BaseModel):
    administer_id : int

class SensorCreate(SensorBase):
    pass

class Sensor(SensorBase):
    id : int
    degrees : List[Degree] = []
    class Config:
        orm_mode = True
  • ์„ผ์„œ๋Š” ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ ์ •๋ณด์—์„œ ์ถ”๊ฐ€ํ•ด์•ผํ•  ๊ฒƒ์ด ๋ณ„๋„๋กœ ์žˆ์ง€ ์•Š๋‹ค.

3. Degree

class DegreeBase(BaseModel):
    time: Timestamp
    degree: float
    sensor_id: int

class DegreeCreate(DegreeBase):
	pass 
    
class Degree(DegreeBase):
    id: int
    class Config:
        orm_mode = True
  • ์˜จ๋„ ๋ฐ์ดํ„ฐ๋Š” ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ ์ •๋ณด์—์„œ ์ถ”๊ฐ€ํ•ด์•ผํ•  ๊ฒƒ์ด ๋ณ„๋„๋กœ ์žˆ์ง€ ์•Š๋‹ค.

 

4. ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”๊ฐ€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  main ํŒŒ์ผ์— ๋‘๊ฐ€์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

from core import models

models.Base.metadata.create_all(bind=engine)

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

models.Base.metadata.create_all(bind=engine)์€ ์šฐ๋ฆฌ๊ฐ€ models์— ๋งŒ๋“ค์–ด๋†“์€ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. uvicorn์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด table๋“ค์ด ์ƒ๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

get_db ํ•จ์ˆ˜๋Š” db session ์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ผ์ข…์˜ db ์ ‘๊ทผ ๊ถŒํ•œ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ ์œ ์ €๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ์–ด์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ๋‘ ๊ฐœ ๋„ฃ์—ˆ๋‹ค.

@app.get('/api/users')
def get_users(skip: int = 0, limit: int = 100, db = Depends(get_db)):
    # db์˜ User table์—์„œ [skip : limit] ๊นŒ์ง€์˜ ๋ฆฌ์ŠคํŠธ
    return db.query(models.User).offset(skip).limit(limit).all()

@app.get('/api/createuser')
def creat_user(username: str, password: str, email: str, db = Depends(get_db)): # ๋‚˜์ค‘์— User Create ๊ฐ์ฒด๋กœ ๋ฐ›์•„์˜ค๋„๋ก ์ˆ˜์ •
    # User ๊ฐ์ฒด ์ƒ์„ฑ
    db_user = models.User(username=username, password=password, email=email)
    # db์— ์ถ”๊ฐ€
    db.add(db_user)
    # ๋ฐ˜์˜
    db.commit()
    # ์ƒˆ๋กœ๊ณ ์นจ
    db.refresh(db_user)
    return db_user

์ด์ œ ์ฃผ์†Œ์ฐฝ์„ ํ†ตํ•ด์„œ ์œ ์ €๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

http://localhost:8000/api/createuser/?username=dnai&password=1234&email=dmelli0505@gmail.com

์›๋ž˜๋Š” get์ด ์•„๋‹Œ post๋กœ ์ „๋‹ฌํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” form ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ผ๋‹จ ๋„ฃ์–ด์„œ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์ด get์„ ์‚ฌ์šฉํ•ด์„œ ์ž„์‹œ ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.

์ด์ œ postgreSQL์—์„œ ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ users ํ…Œ์ด๋ธ”์„ ๋ณด๋ฉด ์ž˜ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

http://localhost:8000/api/users ๋กœ ์ ‘์†ํ•˜๋ฉด ๋ฐฉ๊ธˆ ์ถ”๊ฐ€ํ•œ ์œ ์ €๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‚ด์šฉ์ด ์ œ๋ฒ• ๊ธธ์–ด์กŒ์œผ๋ฏ€๋กœ ๋‹ค์Œ ๋ฒˆ์—๋Š” sensor ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๊ณ , ์ด์ „์— ๊ตฌํ˜„ํ•ด๋‘” mqtt๋ฅผ ํ™œ์šฉํ•ด ์˜จ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด ๋„ฃ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ผฌ์ด์ง€๋Š” ์•Š๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ–๋„๋ก ํ•˜๊ฒ ๋‹ค. 

https://dnai-deny.tistory.com/62

 

[Monitoring System] 2. MQTT ํ†ต์‹ 

: Message Queuing Telemetry Transport ๊ฐ€์žฅ ๋จผ์ € ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์œ„ํ•ด MQTT ํ†ต์‹ ์ด ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์›๋ฆฌ Publish - Subscribe ๋ชจ๋ธ ๋ฉ”์„ธ์ง€ ๋ฐœ์‹ ์ž์™€ ์ˆ˜์‹ ์ž๋ฅผ ๊ตฌ๋ถ„ํ•จ ๋ธŒ๋กœ์ปค ๋ผ๋Š” ์ œ 3์˜ ๊ตฌ์„ฑ์š”

dnai-deny.tistory.com

ํ‹€๋ ธ๊ฑฐ๋‚˜ ์ด์ƒํ•œ ์ ์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค! 

+) ๋‹ค์Œ ํฌ์ŠคํŒ…์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

2023.08.07 - [Project/Monitoring System] - [Monitoring System] 6. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (2) - MQTT ๋ฐ์ดํ„ฐ ์ ์žฌ / ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

 

[Monitoring System] 6. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (2) - MQTT ๋ฐ์ดํ„ฐ ์ 

2023.06.13 - [Project/Monitoring System] - [Monitoring System] 5. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (1) [Monitoring System] 5. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (1) f

dnai-deny.tistory.com

 

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€

'๐ŸŽผ Project > ๐ŸงŠ Monitoring System' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Monitoring System] 7. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. Google Chart) (3) - ๋งˆ์นจ๋‚ด ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ ๅฎŒ  (0) 2023.09.25
[Monitoring System] 6. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (2) - MQTT ๋ฐ์ดํ„ฐ ์ ์žฌ / ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„  (0) 2023.08.07
[Monitoring System] 4.1 ์„ธ์ƒ์— ๋” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด - pyqtgraph  (2) 2023.04.27
[Monitoring System] 4. UDP ํ†ต์‹ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ง„๋™ ๋ฐ์ดํ„ฐ FFT / STFT์‹œ๊ฐํ™”(numpy, tensorflow, pytorch)  (0) 2023.04.25
[Monitoring System] 3. UDP ํ†ต์‹ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ง„๋™ ๋ฐ์ดํ„ฐ Plotting(feat. matplotlib)  (0) 2023.04.19
'๐ŸŽผ Project/๐ŸงŠ Monitoring System' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Monitoring System] 7. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. Google Chart) (3) - ๋งˆ์นจ๋‚ด ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ ๅฎŒ
  • [Monitoring System] 6. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (2) - MQTT ๋ฐ์ดํ„ฐ ์ ์žฌ / ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • [Monitoring System] 4.1 ์„ธ์ƒ์— ๋” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด - pyqtgraph
  • [Monitoring System] 4. UDP ํ†ต์‹ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ง„๋™ ๋ฐ์ดํ„ฐ FFT / STFT์‹œ๊ฐํ™”(numpy, tensorflow, pytorch)
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
      • ๐Ÿฌ ML & Data (50)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (12)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐Ÿณ Docker & Kubernetes (3)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (8)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[Monitoring System] 5. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (1)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”