Python 프레임워크에 관한 고찰

나르·2021년 11월 15일
0
post-thumbnail

FastAPI를 사용하는 지인의 끝없는 예찬과... 저 또한 매번 프로젝트를 시작할 때마다 Django와 Flask 중에 고민을 거듭하다보니 각 프레임웍에 대해 한번쯤 정리해보고 싶었습니다.
사실 대체 얼마나 좋으면 극찬밖에 없는지 궁금해서 확인해봤는데, FastAPI 코드를 보고나니 이미 마음이 크게 기울어버렸긴 하지만 이참에 개인적인 견해를 섞어 비교 분석을 해보고자 합니다.

🔫 Django

혹자가 말한 것처럼 Django는 밀키트같은 느낌입니다. Django는 쉽고 편한 High-level Framework로, 다음과 같은 디자인 철학을 기본으로 하고 있습니다.

  • 느슨한 결합
    프레임워크의 각 레이어들은 꼭 필요하지 않으면 서로 알 필요가 없습니다. Django는 풀프레임워크지만, 스택의 각 부분은 독립적으로 작동합니다.
  • 적은 코드
    Django는 인트로스펙션과 같은 Python의 동적인 기능을 최대한 활용하며, 가능한 최소한의 코드를 사용합니다.
  • 신속한 개발
    빠르게 개발할 수 있도록 도와줍니다.
  • 반복하지 말 것(Don't Repeat Yourself)
    중복성은 나쁜 것이고, 정규화는 좋은 것입니다. 코드 내용은 프로젝트 내 단 한 번, 단 한 곳에만 있을 수 있도록. 최소한의 정보에서 최대한의 것을 추론할 수 있어야 합니다.

장점

  • 무엇이 필요할지 몰라 다 준비했다.
    기본적인 기능부터 프로 개발자들이 개발해 놓은 각종 패키지들까지 모두 들어가 있습니다. 로그인, 회원가입, 인증, CORS, data parsing 등의 기본적인 기능은 라이브러리를 이용해 간단하게 구현이 가능하며, 내부적으로 ORM도 지원합니다. CSRF, XSS, SQL 인젝션, 클릭재킹등 기본적 보안 완비되어있어 빠른 개발, 빠른 배포, 빠른 업데이트가 가능합니다.

  • 매우 우수한 문서, 매우 큰 생태계
    Django는 ORM을 포함해 아주 디테일하게 문서를 써 두었습니다. 또한, 엄청난 크기의 생태계는 개발자들의 실력과 경험에 상관없이 서로를 보완하는데 상당한 도움이 되어 줍니다. 당신이 무엇을 생각하고 있던, 누군가 이미 만들어 놓았을 것이고, 그것을 원하는대로 받아서 원하는대로 조립하면 됩니다.

  • 확장성
    Start Small, Build Big 정신을 토대로, 처음은 모두 작게 시작하는 것을 원합니다. 장고는 내부 소프트웨어 모듈인 plugin을 통한 프로젝트 스케일링 업, 스케일링 다운이 자유롭습니다.

  • 어드민패널
    Django는 Django Admin이라는 아주 강력한 기능을 지원합니다. 모델의 메타데이터를 읽어서 신뢰할 수 있는 사용자가 사이트의 콘텐츠를 관리할 수 있는 빠른 인터페이스를 제공합니다. 개발자가 직접 손으로 관리자 패널을 구현하려면 상당한 노력이 필요하기 때문에, 이러한 기능은 개발자의 수고를 덜어줍니다.

단점

  • 부담스러운 사이즈와 느린 속도
    장고는 다소 작은 프로젝트를 개발하기에는 너무 큰 프레임워크입니다. 그리고 파이썬이라는 언어적 한계와 더불어 사이즈가 크고 무거운 만큼, Django는 속도가 느립니다. 이 속도를 메꾸기 위해 뛰어난 캐시시스템이 내부에 탑재되어 있지만 제대로 최적화를 하고 확장 가능한 아키텍처를 만들지 않는다면 문제가 될 수도 있습니다.

🌶 Flask

플라스크는 WSGI 기반의 마이크로 프레임워크 입니다. Jinja2를 사용한 SSR과 SQLAlchemy 등을 추가하면 ORM도 사용할 수 있습니다. 또한 URL 라우팅, Template, Unit Test, Debugger 및 개발서버 등 기본 기능이 제공됩니다.

장점

  • Minimal
    코드 5줄 이면 시작할 수 있습니다. Django의 10% 정도 밖에 안되는 코드로 구현된 가벼운 프레임워크 입니다. 꽤 쉽게 이해할 수 있고 꽤 쉽게 개발을 시작할 수 있습니다.
    하지만 그렇다고 작은 앱에만 사용되는 것은 아닙니다. 도저히 1개의 코드베이스에 담을 수 없을만큼 앱이 클 때도 플라스크는 강력한 프레임워크입니다.

  • 매우 빠른 개발 속도
    보안 등 세밀한 부분에 신경을 쓰지 않아도 된다면, 아마 프로토타이핑에 가장 빠른 프레임워크라고 해도 과언이 아닐정도로 빠르게 개발할 수 있습니다. 패키징된 프레임워크 안에 이미 당신이 필요한 모든 것이 들어 있습니다.

  • NoSQL과의 호환성
    이미 기존 MongoDB가 있고 이걸 사용해서 어플리케이션을 개발해야 하면 Flask 와 PyMongo를 사용해야 합니다. 기존 RDB같은경우 inspectdb 와 같은 명령어로 현 데이터베이스 스키마를 불러올 수 있지만, 몽고DB는 할 수 없기 때문입니다. 이 경우 현재 세팅된 몽고DB 각 콜렉션을 스키마로 일일히 만들어줘야 하는데, 이러한 불필요하고 불편한 과정을 줄여 에러를 최소화할 수 있습니다.

단점

  • WSGI의 한계
    WSGI는 구조적으로 많은 트래픽을 처리하기엔 느립니다. 다양한 비동기 조합과 Gunicorn으로 어느정도 퍼포먼스를 올릴순 있지만 이런 점들은 로깅을 힘들게하며 관리 요소가 늘어나는 단점을 가지는 등, WSGI의 구조적 한계를 Gunicorn으로 완전히 지울 수 없는 것이 사실입니다.

  • 가파른 러닝커브
    가벼운 프레임워크라는 말은 개발자가 하나부터 열까지 다 해야한다는 이야기입니다. Flask는 지금 하고 있는 일이 어떤 일인지 정확히 아는 전문가들이 고도화를 해야 하는 프레임워크입니다. 때문에 파이썬이나 웹프레임워크라는 것 자체가 익숙치 않다면, 모든 것을 제공해주는 Django가 더 편할 수 도 있습니다.


⚡️ FastAPI

high performance, easy to learn, fast to code, ready for production

StarlettePydantic에 강결합된 마이크로 웹 프레임워크입니다. flask와 유사하며 asynciotype hint를 적극 활용합니다. FastAPI는 나온지 얼마 되지 않아 강의도 잘 되어 있지 않고 아직 현업에서 사용하는 곳이 많지 않지만, Python 개발자 뿐 아니라 다른 언어 개발자 분들도 유심히 지켜보고 있는 프레임워크입니다.

장점

  • ASGI 사용으로 FastAPI 안에서 비동기 처리를 수행할 수 있습니다.
    앞서의 프레임워크에서는 WSGI의 구조적인 한계를 극복하기 위해 APScheduler 와 같은 백그라운드 Task를 처리해주는 모듈을 사용하거나, Redis-Celery 조합등으로 이를 해쳐 나갔습니다.
    이로 인해 많은 부분에서 관리 포인트가 생성되고, 이는 유지보수를 힘들게 만드는 단점이 있습니다.
    FastAPI는 ASGI 기반으로 위와 같은 단점을 해결하고, python 3.4부터 추가된 asyncio를 이용하기 때문에 비동기 프로그래밍이 가능합니다.

  • Pydantic 을 사용한 벨리데이션
    Pydantic 은 현존 파이썬 벨리데이터 중에 가장 빠릅니다.
    최근에 Django도 3.x대 버전으로 올라오면서 @sync_to_async 라는 Decorator가 생기고, async ... await 으로 비동기를 구현 할 수 있 듯 ASGI를 지원하는 프레임워크가 많습니다만... Pydantic을 이용한 편한 데이터 검증, 빈틈없는 공식 문서와 별다른 Serializer 없이 Pydantic을 통한 Json 데이터 서빙 등은 FastAPI의 특장점입니다.

  • OpenAPI 문서 자동생성
    FastAPI는 파라미터 기반 API 입력으로 엔드포인트를 선언할 수 있습니다. 그리고 이 파라미터를 분석해 Swagger 또는 ReDoc 스타일의 API 문서를 자동으로 만들어 줍니다. (요청과 응답 부분에 pydantic 모델을 사용하며 배포시 자동으로 json 형태 변환되어 스웨거의 요청과 응답 모델에 자동으로 매핑 됩니다.)

  • 뛰어난 문서
    아주 상세한 문서로 빈약한 생태계를 커버하고 있습니다. 공식 문서가 굉장히 자세하기 때문에 레퍼런스가 부족함에도 크게 불편함이 느껴지지 않습니다.

단점

  • 약한 생태계
    확실히 나온지 얼마 안되서 생태계가 빈약합니다. 그말인 즉슨 써드파티 라이브러리와 레퍼런스가 부족하기 때문에 직접 구현해야 하는 부분이 많습니다.

👏 결론은?

앞선 두 프레임워크에 비해 FastAPI는 ASGI,Uvicorn 기반의 비동기를 지원하고, Swagger 문서 생성이 자동화되어있으며 상대적으로 빠른 퍼포먼스를 자랑합니다.
물론 출시된지 얼마 안돼 생태계가 작지만 그것을 커버할 만큼 잘만들어진 공식문서가 있고, 글을 작성하는 현재까지 1.0.0 릴리즈가 안된 것을 고려하면 충분히 성장 가능성이 높은 프레임워크라고 생각됩니다.
너무 편파적인...답정너같은 결론이기는 하지만 내친김에 앞으로 더 많이 사용해보며 FastAPI의 장단점을 계속 파악해보려합니다.😎

Reference.

https://fastapi.tiangolo.com/
https://www.section.io/engineering-education/choosing-between-django-flask-and-fastapi/
https://dingrr.com/blog/post/python-%EC%9B%B9%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%81%9D%ED%8C%90%EC%99%95-%EA%B0%80%EB%A6%AC%EA%B8%B0-django-flask-fastapi-sanic
https://velog.io/@maintain0404/Django%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-FastAPI-%EC%82%AC%EC%9A%A9-%ED%9B%84%EA%B8%B0

profile
💻 + ☕ = </>

0개의 댓글