하이브리드 앱 개발 환경

백엔드(FastAPI) + DB(MySQL) 연결

오류나면꽥꽥 2025. 3. 10. 13:15

1️⃣ MySQL을 설치한 후, 실행하고 계정 생성

CREATE DATABASE myapp_db;
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myuser'@'%';
FLUSH PRIVILEGES;

myapp_db라는 데이터베이스를 사용 가능

 

 

 

 

2️⃣ docker-compose.yml (MySQL 포함)

version: '3.8'

services:
  mysql:
    image: mysql:8
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp_db
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app-network

  backend:
    build: ./backend
    container_name: backend
    ports:
      - "8000:8000"
    depends_on:
      - mysql
    environment:
      DB_HOST: mysql
      DB_USER: myuser
      DB_PASSWORD: mypassword
      DB_NAME: myapp_db
    volumes:
      - ./backend:/app
    networks:
      - app-network

  frontend:
    build: ./frontend
    container_name: frontend
    ports:
      - "3000:3000"
    depends_on:
      - backend
    networks:
      - app-network

  nginx:
    build: ./nginx
    container_name: nginx
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mysql_data:

 

 

 

 

 

3️⃣ backend/requirements.txt

fastapi
uvicorn
pymysql
sqlalchemy

 

 

 

 

 

4️⃣ backend/main.py (FastAPI + MySQL 연결 코드)

import os
from fastapi import FastAPI, HTTPException
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker

app = FastAPI()

# 환경 변수에서 DB 설정 가져오기
DB_USER = os.getenv("DB_USER", "myuser")
DB_PASSWORD = os.getenv("DB_PASSWORD", "mypassword")
DB_HOST = os.getenv("DB_HOST", "localhost")  # 로컬 테스트 시 'localhost'
DB_NAME = os.getenv("DB_NAME", "myapp_db")

# MySQL 연결 URL
DATABASE_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}"

# 데이터베이스 엔진 생성
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

@app.get("/")
def read_root():
    return {"message": "Hello from FastAPI with MySQL!"}

@app.get("/users")
def get_users():
    try:
        with engine.connect() as conn:
            result = conn.execute(text("SELECT * FROM users"))
            users = [dict(row) for row in result.mappings()]
        return {"users": users}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

 

 

 

 

 

5️⃣ backend/Dockerfile 작성

FROM python:3.10

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

 

 

 

 

 

 ✅ 실행하기

docker-compose up -d --build
 
 

 

▶ API 테스트 (Postman 또는 브라우저)

  1. FastAPI 실행 확인
    • 브라우저에서 http://localhost:8000/ 확인 → {"message": "Hello from FastAPI with MySQL!"} 응답 확인
  2. MySQL에서 사용자 조회
    • http://localhost:8000/users 요청 → {"users": [...]} 응답 확인