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

2025. 5. 28. 10:18·Fastapi

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

'Fastapi' 카테고리의 다른 글

Chapter 4-1 📌 EdgeDB 소개 및 설치 가이드  (1) 2025.05.28
Chapter 3-3 고유하고 짧은 alphanumeric 식별자 만들기 – Base62 접근 방식  (0) 2025.05.27
Chapter 3-4 Base62 디버깅과 디버깅 스킬의 중요성  (0) 2025.05.27
Chapter 3-1 미팅 생성 API 스펙 만들기  (0) 2025.05.27
Chapter 2-6 Github Action 설정 및 캐싱 가이드  (0) 2025.05.23
'Fastapi' 카테고리의 다른 글
  • Chapter 4-1 📌 EdgeDB 소개 및 설치 가이드
  • Chapter 3-3 고유하고 짧은 alphanumeric 식별자 만들기 – Base62 접근 방식
  • Chapter 3-4 Base62 디버깅과 디버깅 스킬의 중요성
  • Chapter 3-1 미팅 생성 API 스펙 만들기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (807)
      • Python (32)
      • 프로젝트 (116)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (42)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    americaparty
    americanlaw
    homebartrend
    hotcoffeecase
    btsjungkook
    urbantrends
    RM
    chinanightlife
    basalcellcarcinoma
    bts
    trumpmuskclash
    travel ban
    btsreunion
    gpterror
    smartphonedurability
    global politics
    chatgpterror
    btsdischarge
    self-growth
    newpoliticalparty
    life reflection
    college reunions
    titaniumcase
    classaction
    lawsuitculture
    뷔
    livebroadcast
    btscomeback
    youngprofessionals
    remittance
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 4-3 MySQL로 Meeting 생성하기 - FastAPI & Tortoise ORM
상단으로

티스토리툴바