본문 바로가기

Framework/FastAPI

[ORM 선택기] FastAPI 프로젝트에서 Tortoise ORM vs SQLAlchemy vs EdgeDB(gel)

안녕하세요 🙂

이번 글에서는 제가 FastAPI 기반 신규 기능 개발을 진행하면서 사용해본 ORM과 DB 관련 기술들에 대해 이야기해보려고 합니다.
처음에는 Tortoise ORM을 주로 사용했고, 필요에 따라 SQLAlchemy도 써봤으며, 최근에는 EdgeDB도 함께 살펴보고 있는데요.
각 기술의 특징과 제가 느낀 점을 솔직하게 공유합니다.

 

1. SQLAlchemy

SQLAlchemy는 Python에서 가장 전통적이고 인기 있는 ORM입니다.
기본적으로 동기적 코드를 지원하지만, 내부적으로 greenlet 같은 도구를 이용하여 비동기 전환도 가능하며, 제가 직접 테스트해본 결과 성능 차이는 거의 없었습니다.

  • 풍부한 문서와 커뮤니티: 참고 자료가 많아 문제 해결에 용이합니다.
  • 강력한 기능과 유연성: 복잡한 쿼리 작성과 대규모 프로젝트에 적합합니다.
  • 안정성과 검증된 성능: 수년간 널리 쓰여온 만큼 신뢰도가 높습니다.

공식 문서: SQLAlchemy 공식 문서

 

SQLAlchemy

The Database Toolkit for Python

www.sqlalchemy.org

 

다만 러닝커브가 높고 상대적으로 비동기 테스트 환경을 구성하는데 어려움이 있다는 단점이 있습니다.


2. Tortoise ORM

Tortoise ORM은 Django ORM과 매우 유사한 문법과 구조를 가진 비동기 ORM으로, FastAPI 같은 async 프레임워크 환경에서 가볍고 직관적으로 사용할 수 있는 것이 강점입니다. Django ORM과 거의 90% 문법과 구조가 비슷해서 배우기 쉽고, 비동기 환경에 맞춰 설계되어 FastAPI 같은 async 프레임워크와도 찰떡궁합입니다.

  • 모델 선언 방식: Django와 유사해 직관적입니다.
  • QuerySet 사용: 익숙한 쿼리 패턴 제공.
  • 비동기 테스트 지원: tortoise.contrib.test 모듈로 테스트가 편리합니다.
공식 문서: Tortoise ORM 공식 문서
 

Tortoise ORM - Tortoise ORM v0.25.1 Documentation

Tortoise ORM Tortoise ORM is an easy-to-use asyncio ORM (Object Relational Mapper) inspired by Django. Note Tortoise ORM is a young project and breaking changes are to be expected. We keep a Changelog and it will have possible breakage clearly documented.

tortoise.github.io

 

내부 구조는 SQLAlchemy만큼 복잡하거나 성숙하지는 않지만, 러닝커브가 적고 빠르게 적응할 수 있다는 점이 큰 장점입니다.

 

저는 첫 프로젝트를 Django로 시작했기 때문에, Tortoise ORM을 자연스럽게 접하게 되었고
덕분에 빠르게 적응할 수 있었습니다.


3. EdgeDB

EdgeDB는 PostgreSQL 기반의 차세대 데이터베이스이자 ORM 대체 기술로, 객체지향적인 데이터 모델과 GraphQL 스타일의 쿼리 언어인 EdgeQL을 제공합니다. 아직 널리 쓰이는 기술은 아니지만, 단순히 MySQL이나 PostgreSQL 같은 전통적인 RDBMS를 넘어서, 새로운 방식의 데이터 모델링과 쿼리 패러다임을 경험해보고 싶었기에 사용해 보았습니다. 실제로 테스트해본 결과, EdgeDB는 매우 빠른 처리 속도와 유연한 쿼리 구조를 제공한다는 인상을 받았습니다.

  • EdgeDB는 유명 Python 컨트리뷰터인 Yury Selivanov (MagicStack) 등이 만든 프로젝트입니다.
  • 공식 클라이언트로 쿼리를 날리면 자동으로 객체가 리턴되어 ORM을 별도로 쓸 필요가 없습니다.
  • NULL 개념 대신 모든 값이 set이라는 철학으로 설계되어 있습니다.
  • 강력한 인덱싱과 쿼리 분석 도구를 내장해 성능 최적화도 손쉽습니다.

공식 문서: EdgeDB 공식 문서
공식 유튜브: https://youtube.com/@edgedb?feature=shared

 

EdgeDB

The next generation database EdgeDB combines the simplicity of a NoSQL database with relational model’s powerful querying, strictness, consistency, and performance. Subscribe to learn more about EdgeDB, watch latest tutorials, talks, and news.

www.youtube.com

 

또한 설치부터 개발 환경 셋업, 마이그레이션, CRUD 실습 등 다양한 자료가 잘 준비되어 있어 공부하기에도 좋습니다.
VSCode 확장 프로그램으로 EdgeQL 문법 지원도 되어 개발 편의성이 높습니다.



4. 직접 부하 테스트를 통한 성능 비교

ORM 성능을 보다 객관적으로 비교하기 위해, FastAPI + Uvicorn 환경에서 Locust를 활용해 부하 테스트를 진행했습니다.
Locust는 사용자 시나리오 기반으로 웹 애플리케이션의 처리 성능을 측정할 수 있는 Python 기반의 오픈소스 도구로, 실제 사용자가 동시에 요청을 보내는 상황을 시뮬레이션하기에 적합합니다.

성능 평가 기준

이번 테스트에서는 다음 두 가지 지표를 중심으로 성능을 비교했습니다.

  • p95 응답시간: 전체 요청 중 95%가 이 시간 이하로 응답한 수치입니다. 평균보다 실제 체감 속도를 더 잘 반영합니다.
  • RPS (Requests Per Second): 초당 처리 가능한 요청 수로, 서버의 처리량과 확장성을 판단하는 핵심 지표입니다.

테스트 조건

이번 테스트에서는 사용자 50명, 초당 10명씩 증가 (Ramp-up), 테스트 시간 7~8분, 커넥션 풀 5개, 워커 2개 조건으로 진행했습니다.


테스트 결과 요약

  • SQLAlchemy v2

SQLAlchemy v2 orm 성능 테스트 이미지

  • 평균 응답시간: 15.3ms, p95: 30ms, RPS: 24.7
    → 전통적인 ORM으로서 충분히 안정적인 성능을 보였으며, 성능 목표(RPS > 20, 응답시간 < 50ms)를 모두 만족했습니다
  • Tortoise ORM

Tortoise orm 성능 테스트 이미지

  • 평균 응답시간: 13.9ms, p95: 26ms, RPS: 24.5
    → 네이티브한 비동기 ORM답게 좋은 응답시간과 낮은 에러율(0.06%)을 기록했습니다.
  • EdgeDB

EdgeDB 성능 테스트 이미지

  • 평균 응답시간: 11.3ms, p95: 16ms, RPS: 25.5
    → 모든 지표에서 가장 우수한 성능을 보여주었고, 가장 안정적인 처리 결과를 기록했습니다.

 


왜 EdgeDB가 가장 빨랐을까?

직접 테스트해본 결과, EdgeDB가 가장 우수한 성능을 보인 이유는 전통적인 ORM 구조를 사용하지 않기 때문이라고 생각합니다.

Tortoise ORM이나 SQLAlchemy는 런타임 중에 SQL 쿼리를 동적으로 생성 및 최적화합니다. 이러한 변환 과정은 일반적으로 약간의 오버헤드를 발생시킬 수밖에 없습니다.

반면 EdgeDB는 개발 단계에서부터 쿼리(EdgeQL)를 명확하게 정의하고, 내부적으로 최적화된 SQL로 변환하여 실행됩니다. 이는 런타임에서의 오버헤드를 최소화하며, 마치 ORM 없이 DB를 직접 다루는 것과 비슷한 효율성을 제공합니다.

결국, 불필요한 추상화 레이어 없이 빠르게 동작할 수 있다는 구조적 이점이 EdgeDB의 성능 우위로 이어진 것으로 보입니다.


5. 직접 사용해본 후 느낀 점과 선택 기준

실제로 세 가지 ORM/DB를 사용해보면서 다음과 같은 기준을 중심으로 판단하게 됐습니다

  • 러닝커브
    Django 경험자라면 Tortoise는 매우 빠르게 적응할 수 있습니다.
    SQLAlchemy는 구조가 복잡해 진입 장벽이 있지만, 그만큼 문서가 풍부하고 예제가 잘 갖춰져 있어 학습만 하면 다양한 상황에 유연하게 대응할 수 있습니다.
    EdgeDB는 새로운 문법과 철학을 요구하기 때문에 학습에 시간이 소요되고, vibe coding에는 다소 어려움이 있습니다. 직접 사용해본 결과, 문법 오류나 타입 이슈가 잦고, 실전 사례가 많지 않아 시행착오가 많았습니다.
  • 비동기 지원
    세 기술 모두 FastAPI 환경에서 비동기 지원이 가능하므로, 특별히 선택에 있어 제약은 없었습니다.
    다만 SQLAlchemy는 비동기 테스트 환경을 구성하는 과정이 조금 복잡했었습니다.
  • 성능과 구조
    성능을 중요시한다면 EdgeDB가 가장 우수했습니다.
    직접 테스트했을 때도 평균 응답시간과 p95 기준 모두 가장 뛰어났고, 다른 개발자가 테스트한 결과에서는 최대 3배 이상의 속도 차이가 나기도 했습니다.
  • 기술 선택 요약
    빠르게 개발하고 싶다면 Tortoise, 전통적인 설계와 유연성을 원한다면 SQLAlchemy,
    성능과 명확한 타입 중심 설계를 원한다면 EdgeDB가 적합합니다.

마치며

ORM과 데이터베이스 선택은 단순한 기술 비교를 넘어,
팀의 경험, 프로젝트의 특성, 유지보수 용이성 등 다양한 요소를 종합적으로 고려해야 하는 결정이라고 생각합니다.

이번 글에서 소개한 Tortoise, SQLAlchemy, EdgeDB는 각기 다른 강점이 있으므로,
정해진 정답은 없고 직접 사용해보면서 체감하고 판단하는 것이 가장 좋은 방법이라 느꼈습니다.

혹시 직접 실습해보고 싶으신 분이 있다면,
제가 테스트했던 코드를 깃허브에 정리해두었으니 아래 링크를 참고해보세요.

GitHub 프로젝트 바로가기

각 기술의 공식 문서와 예제를 참고하고,
작은 프로젝트라도 직접 구현해보면서 스스로의 기준을 세워가는 과정이 꼭 필요하다고 생각합니다.
함께 고민하고 성장하는 경험이 되시길 바랍니다!