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 확장!