Fastapi

Chapter 4-3 MySQL로 Meeting 생성하기 - FastAPI & Tortoise ORM

Chansman 2025. 5. 28. 10:18

📌 MySQL로 Meeting 생성하기 - FastAPI & Tortoise ORM

1. Docker로 MySQL 8 설치

docker run --name mydb -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8
  • 기본 포트 3306 사용
  • root 비밀번호: 1234 설정
  • lsof -i:3306 으로 포트 점유 여부 확인 가능

2. PyCharm에서 DB 연결 테스트

SELECT VERSION();
  • 버전이 8.x이면 성공적으로 연결된 것

3. 패키지 설치 및 환경 설정

poetry add "tortoise-orm[asyncmy]==0.23.0"
poetry add cryptography==44.0.0
poetry add aerich==0.8.1 tomlkit==0.13.2
poetry add pydantic_settings==2.7.1

📦 주요 패키지 설명:

  • tortoise-orm: async 지원 ORM, Django ORM과 유사한 문법
  • aerich: tortoise 전용 migration 도구
  • pydantic_settings: 환경변수 관리
  • cryptography: mysql 접속 시 필요한 암호화 패키지

app/configs/base_config.py

class Config(BaseSettings):
    MYSQL_HOST: str = "localhost"
    MYSQL_PORT: int = 3306
    MYSQL_USER: str = "root"
    MYSQL_PASSWORD: str = "1234"
    MYSQL_DB: str = "when2meet_vod"

app/configs/tortoise_config.py 에 커넥션 정보 설정 및 초기화 함수 작성

def initialize_tortoise(app: FastAPI) -> None:
    Tortoise.init_models([...], "models")
    register_tortoise(app, config=TORTOISE_ORM)

4. Database 생성

CREATE DATABASE when2meet_vod;

5. Tortoise 모델 생성 및 등록

app/tortoise_models/base_model.py

class BaseModel:
    id = fields.BigIntField(primary_key=True)
    created_at = fields.DatetimeField(auto_now_add=True)

app/tortoise_models/meeting.py

class MeetingModel(BaseModel, Model):
    url_code = fields.CharField(max_length=255, unique=True)

    class Meta:
        table = "meetings"

    @classmethod
    async def create_meeting(cls, url_code: str) -> MeetingModel:
        return await cls.create(url_code=url_code)

6. Aerich로 마이그레이션

aerich init -t app.configs.tortoise_config.TORTOISE_ORM
aerich init-db
  • 이후 aerich migrate, aerich upgrade 로 진행 가능

7. 테스트 환경 구성 및 작성

conftest.py 작성하여 tortoise 테스트 설정 구성

@pytest.fixture(scope="session", autouse=True)
def initialize(...):
    ...
    initializer(modules=...)
    yield
    finalizer()

poetry add httpx==0.28.1

app/tests/apis/v1/test_meeting_router_mysql.py

async def test_api_create_meeting_mysql(self):
    response = await client.post("/v1/mysql/meetings")
    assert response.status_code == HTTP_200_OK
    assert (await MeetingModel.filter(url_code=url_code).exists())

8. Meeting 생성 기능 구현

app/services/meeting_service_mysql.py

def service_create_meeting_mysql():
    return await MeetingModel.create_meeting(Base62.encode(uuid.uuid4().int))

app/apis/v1/meeting_router.py

@mysql_router.post("", description="meeting 을 생성합니다.")
async def api_create_meeting_mysql():
    return CreateMeetingResponse(url_code=...)  # 실제 서비스 호출로 대체

9. CI 환경에서 MySQL 설정

.github/workflows/ci.yml

- name: Start Mysql
  run: |
    sudo systemctl start mysql
    mysql -e "ALTER USER ... IDENTIFIED BY '1234';"
    mysql -e 'CREATE DATABASE when2meet_vod;'

💡 Github Ubuntu 이미지에는 MySQL 기본 설치되어 있음. 시작만 시켜주면 됨!


✅ 요약

  • Docker 기반 MySQL 설치 → Tortoise ORM 설정 → Aerich 마이그레이션
  • TDD 기반 테스트 작성 후 실제 기능 구현
  • GitHub Actions에서 CI 환경에서도 자동 테스트 가능

🎯 다음 목표: 생성된 meeting 정보를 수정하거나 삭제하는 API 확장!