๊ฒ์ํ์ ๋ณด๋ 2์์ Fast API๋ฅผ ๊ณต๋ถํ๋ ํ์ ์ด ์์๋ค. ๊ทธ ๋น์์๋ ์๋ฒ๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด์ผํ๋ ์ต์ํ์ง ์์ ํ๋ ์์ํฌ๋ณด๋ค flask๋ก ๋ง๋๋๊ฒ ํธํด์ ์ ์ ์ ์ด๋์๋ค. ๊ทธ๋์ flask๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ผ์ ์๊ฐ๋ง๋ค ์ ์ ์ ๋ณด๋ฅผ ์ทจํฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ ์๋ฒ๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๊ณ ์์๋ค. ์กฐ๊ธ์ฉ ๋ด ์ ๋ฌด ์์ญ์ ๋ํ์ ธ์ ํ๋ก ํธ์ ํต์ ํ๋ ์๋ฒ๋จ์์ ๋ด์ชฝ์ผ๋ก ๊ฐ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด ๊ฒฐ๊ณผ๋ฌผ์ ๋ฆฌํดํด์ฃผ๋ ์๋ฒ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ์ด๋ฒ์๋ flask๋ก ๋ง๋ค๊ณ ํ ์คํธ๋ฅผ ํด๋ด์ ์๋์ด ๋ฐฐํฌ๋ฅผ ํ๋๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
๋ฉ์ฒญํ๊ฒ flask๋ฅผ ์ฌ์ฉํ ๋๋ Flask + uWSGI + Nginx ์ธํธ์ ๊ฐ์ด ์ธ๋ถ ์๋ฃ๋ฅผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋๋ฐ flask์ ๋ฌด์งํ๋ค. ๊ทธ๋์ ์ด์ฌํ ์ด๊ฒ์ ๊ฒ ๋ง์ ธ๋ณด๋๋ฐ aws ๊ณ์ ์์ ๋งํ๊ณ , ๋ฒ์ ์์ ๋งํ๊ณ ์ค์ผ์ค๋ฌ์์๋ ๋งํ๊ณ ๋ต๋ตํ๋ค. ์์ ์ FastAPI๋ก ์ฝ๊ฒ ๋ง๋ค์๋ ๊ธฐ์ต์ด ๋ ์ฌ๋ผ FastAPI๋ก ๊ฐ์ํ๊ฒ ๋์๋ค. ๊ทธ๋์ ์๋ฒ๋ฅผ ๋ง๋ค์ด๋๊ฐ๋ฉฐ ์ ๋ก์ฌํญ์ด๋ ๋ง๋ค์๋ ๋ฐฉ์์ ๋ํด ์ ์ด๋ณผ๊น ํ๋ค.
์๋ฒ๋ ์ฐ์ ์ค์ผ์ค๋ฌ๋ก 10๋ถ๋ง๋ค ํ๋ฒ์ฉ DB์์ ๋ฐ์ดํฐ๋ฅผ ๊ธ์ด์์ ๋ก์ปฌ์ ์ ์ฅํด๋๋ค. API์์ฒญ์ด ์ค๋ฉด ๋ก์ปฌ์ ์ ์ฅํด์ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ง๋ค์ด๋ด์ ๋ฆฌํดํด์ค๋ค. ๋ค์ผ๋ฉด ๋๊ฒ ์ฌ์๋ณด์ด์ง๋ง ๋๋ ๋ง๋ค๋ ์๋ฌด ๋์์์ด ๋งจ๋ ์ ํค๋ฉ์ผ๋ก ๋ง๋ ๊ฑฐ๋ผ ์๋นํ ์ค๋ ๊ณต๋ถํ๋ค. ๋ง์ ๋ธ๋ก๊ทธ์ ๊ตฌ๊ธ๋ง์ ํตํด ์ด์ํ๊ฒ ๋ง๋ ๊ฒ์ด ๋ง์ ๊ฒ์ด๋ค. ๊ทธ๋๋ ์์ฑํ์ ๊น๋ํ ์ฝ๋ฉ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ ์ข์ง๋ง ์ด๋ ๊ฒ ์ง์ง๊ธฐ๋ก ๋ง๋ค์ด๋ณธ ๊ฒ์ ๊ณต์ ํด๋ ์ข๋ค๊ณ ์๊ฐํ๋ค. ์ฒซ๋ ์ ๊ณผ์ ๋ถํฐ ์์ ํ๋ ๊ณผ์ ์ ์ฐจ๋ก๋๋ก ์ ์ด๋ณผ ์์ ์ด๋ค. ์ด๋์ ๋ฐฐ์์ ํ๊ฒ ์๋๋ผ ํผ์์ ๊ณต๋ถํ๋ฉฐ ํ ๊ฒ์ด๋ผ '์ ์ ๋ ๊ฒ ํ์ง'๋ผ๊ณ ์๊ฐํ๋ ๋ถ๋ถ์ด ๋ง์๋ ์ดํดํด์ฃผ์ จ์ผ๋ฉด ์ข๊ฒ ๋ค.
ํ๊ฒฝ์ ์๋ง์กด EC2์๋ฒ์์ ๋ฆฌ๋ ์คํ๊ฒฝ์ ๋ฐฐํฌ๋์ด ์๋ ์ํ์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ aws์ mariadb๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ , db๋ ๋๊ตฐ๋ฐ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค.
.
โโโ app
โโโ __init__.py
โโโ crud.py
โโโ database.py
โโโ main.py
โโโ models.py
โโโ settings.py
โโโ schemas.py
ํด๋ ๊ตฌ์กฐ๋ ์์ ๊ตฌ์กฐ์ ๊ฐ์ด ๋ง๋ค์ด ์ฃผ์๋ค. ๊ฒ์์ผ๋ก ์ฐพ์์ ๋๊ฐ์ด ๋ง๋ค์๋๋ฐ ๋๋ ๋ฐ์ดํฐ ์ ๋ ฅ๊ณผ ์์ ์ญ์ ๋ฅผ ํ์ง ์์์ crudํ์ผ์ ๋์ค์๋ ์ญ์ ํ์๋ค. ๊ทธ๋๋ ์ฒซ๋ ๋ถํฐ์ ๊ณผ์ ์ด๋ ๊ทธ๋ฅ ์ ๊ฒ ๋ค.
pip install sqlalchemy
pip install uvicorn
pip install fastapi
----------------------
pip install apscheduler
์ 3๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋จผ์ ์ค์นํด์ฃผ์๋ค. ์ค์ผ์ค๋ฌ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ์ํค์ง ์์๊ฑฐ๋ผ๋ฉด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์นํ์ง ์์๋ ๋๋ค.
# crud.py
from sqlalchemy.orm import Session
import models, schemas
def get_users(db: Session):
return db.query(models.Users).all()
crud.py ํ์ผ์ ๊ฒ์ํ๋ง๋ค๊ธฐ ํ ๋ ํญ์ ๋ฃ๋ Create(์์ฑ), Read(์ฝ๊ธฐ), Update(๊ฐฑ์ ), Delete(์ญ์ ) ์ด๋ค. ๊ฐ๋จํ๊ฒ ํจ์๋ฅผ ๋ง๋ค์ด db์ ํต์ ํ๋ ํ์ผ์ด๋ค.
# database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
import settings
MAIN_DB_URL = f"mysql+pymysql://{settings.DB_ID}:{settings.DB_PW}@{settings.DB_IP}:{settings.DB_PORT}/{settings.DB_NAME}"
ACTION_DB_URL = f"mysql+pymysql://{settings.DB_ID}:{settings.DB_PW}@{settings.ACTION_DB_IP}:{settings.DB_PORT}/{settings.ACTION_DB_NAME}"
main_engine = create_engine(MAIN_DB_URL)
main_session_local = sessionmaker(autocommit=False, autoflush=False, bind=main_engine)
main_base = declarative_base()
action_engine = create_engine(ACTION_DB_URL)
action_session_local = sessionmaker(autocommit=False, autoflush=False, bind=action_engine)
action_base = declarative_base()
database.py ํ์ผ์์๋ database๋ฅผ ์ฐ๊ฒฐ์์ผ์ ์ฌ์ฉํ๋ ํ์ผ์ด๋ค.
- mysql+pymysql : mariadb๋ฅผ ์ง์ํ๋ ๋ฒ์ ์ผ ๊ฒฝ์ฐ
- mariadb+pymysql : mariadb๋ง ์ง์ํ๋ ๋ฒ์ ์ผ ๊ฒฝ์ฐ
- posgresql : postgreSQL์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
MAIN_DB_URL = f"mysql+pymysql://{settings.DB_ID}:{settings.DB_PW}@{settings.DB_IP}:{settings.DB_PORT}/{settings.DB_NAME}"
์ฌ์ฉ์์ด๋ฆ:์ฌ์ฉ์๋น๋ฐ๋ฒํธ@๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฃผ์:๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉํ๋ ํฌํธ๋ฒํธ/๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ
๋๋ mariaDB์ mysql ๋๊ฐ๋ฅผ ์ง์ํด์ฃผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ์ ์์ ๊ฐ์ด ์ ์๋ค. ์์ธํ ์๋ ค์ฃผ๋ ์ฌ๋์ด ์์ด์ ๋์ถฉ ๋๋ ค ๋ฃ์ด๋ดค๋๋ ์๋์๋ค. ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ํธ๋ db์ ์ ์ํ ๋ ์ฐ๋ id์ pw๋ฅผ ์ ์ผ๋ฉด ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฃผ์๋ ๋ก์ปฌ์ด๋ผ๋ฉด ๋ก์ปฌ์ฃผ์๋ฅผ ์ ๊ณ , aws์์ ์ฌ์ฉํ๋ค๋ฉด aws ๋ฐ์ดํฐ๋ฒ ์ด์ค์ IP๋ฅผ ์ ์ผ๋ฉด ๋๋ค. ํฌํธ๋ฒํธ๋ ๋ฐ๋ก ์ค์ ํด์ฃผ์ง ์์๋ค๋ฉด 3306์ผ ๊ฒ์ด๋ค.
# main.py
from typing import List
import uvicorn
from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
import crud, models, schemas, settings
from database import main_session_local, main_engine, action_session_local, action_engine
models.main_base.metadata.create_all(bind=main_engine)
app = FastAPI()
# Dependency ์ด ํจ์๋ก db๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ข
๋ฃํ๋ค.
def get_main_db():
db = main_session_local()
try: yield db
finally: db.close()
# api ํธ์ถํ ๋ /get_users๋ฅผ ๋ถ์ด๋ฉด ์ฌ๊ธฐ๋ก ์ฐพ์์์ ์๋ ํจ์๋ฅผ ์คํ์ํจ๋ค.
@app.get("/get_users")
def get_users(db: Session = Depends(get_main_db)):
return crud.get_users(db)[:10]
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=settings.PORT_NUMBER)
main.pyํ์ผ์์ uvicorn์ ์ฌ์ฉํ๋๋ฐ ์ฌ์ฉํ์ง ์์๋ ๋๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค. flask์์ ์ฌ์ฉํ์ฌ ์ฐ๋ค๋ณด๋ ๊ทธ๋ฅ ๊ฐ์ง๊ณ ์๋๋ฐ ์กฐ๊ธ๋ ๊ณต๋ถํด๋ณด๊ณ ์์ ํด๋ณด๋ ค ํ๋ค.
'๐๐ฎ๐ฉ๐๐ค๐ฃ > ๐๐๐จ๐ฉ ๐ผ๐๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #4 body ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ฃผ๊ณ ๋ฐ๊ธฐ (0) | 2023.02.23 |
---|---|
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #3 pydantic, query, request body (0) | 2023.02.23 |
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #2 ๊ฒฝ๋ก ๋์ ์์ฑ (0) | 2023.02.22 |
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #1 ํน์ง ๋ฐ ์ค์น (0) | 2023.02.22 |
๋๊ธ