본문 바로가기

[Python]/[FastAPI]

[FastAPI] 추천시스템 프로젝트의 시작

728x90

[프로젝트 : 사용자 텍스트 기반 이미지, 음악 추천 시스템]

    이번에 새로운 추천시스템 프로젝트를 시작하기로 했다. 사용자 텍스트 기반으로 이미지, 음악 추천 시스템을 제작하는 것이 목표이다. 아마 분산처리 아키텍처와 벡엔드 서버를 구성하는 것, 그리고 전반적인 자연어처리 모델링이 내 역할이 될 것 같다. 사실 어설프게만 알지, 서비스에 직접 적용할 정도로 각각의 프로덕트를 만져본 경험은 없다. 따라서 서비스에 적용가능한 수준으로 지식을 쌓고, 결과물을 도출해 내는 것이 개인적인 목표이다.

6주간의 프로젝트를 진행하면서 얻어가고 싶은 것은 심플하다.

  • 분산처리시스템을 직접 구축해 본다. (Hadoop, Spark, Kafka)
  • 새롭게 각광받고 있는 Fast-API를 공부해보고 프로젝트에 적용시킨다.

문서화 중인 API 명세서

 

[시작하며...]

    "데이터에 대해 잘 알아야 하고, 왜 그것을 사용하는지 알아야 하며, 직접 만들어 봐야한다".  지난 T사 데이터 엔지니어 면접에서, 현직에 계신 선배 개발자분들께서 해주신 조언이다. 곱씹고 되뇌이면서 절로 고개가 끄덕여졌다. 사실 솔직하게 Fast-API를 써보고 싶어진 이유는 거창하지 않고 단순하다. "빠르고, 핫하니까!". 하지만 개발 경험은 쌓이는데, 조언해주신 저 3가지 관점에 대해 초급자 수준에 머물러 있다면 그저 그런 수준에 그치지 않을까 하는 생각이 들었다. 그래서 부족하지만 Fast-API에 대한 정리를 하고 넘어가도록 한다.

 

[Fast-API란??]

 

FastAPI

FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https://github.com/tiangolo/fastapi FastAPI is a modern, fast (high-performance), web framework for buil

fastapi.tiangolo.com

    공식 문서를 보면 FastAPI는 high performance, easy to learn, fast to code, ready for production 라 적혀있다. 이 4가지가 이 프레임워크의 핵심인듯 하다. 좀더 세분화된 특징들을 살펴보면 다음과 같다.

  • Fast: Very high performance, on par with NodeJS and Go (thanks to Starlette and Pydantic). One of the fastest Python frameworks available.
  • Fast to code: Increase the speed to develop features by about 200% to 300%. *
  • Fewer bugs: Reduce about 40% of human (developer) induced errors. *
  • Intuitive: Great editor support. Completion everywhere. Less time debugging.
  • Easy: Designed to be easy to use and learn. Less time reading docs.
  • Short: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.
  • Robust: Get production-ready code. With automatic interactive documentation.
  • Standards-based: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema.

    이 중에서 나는 표시한 3가지 특징에 주목했다.

1. 먼저 빠르다는 것. 그것도 NodeJS와 Go만큼이나! python 은 다양한 활용범위와 훌륭한 라이브러리들이 지원되지만, 항상 속도에서 문제가 지적되어져 왔다. 하지만 fastapi는 web micro framework인 Starlette를 사용한다.

Starlette는 다른 파이썬 웹 프레임워크에 비해 가볍고 강력한 ASGI(Asynchronous Server Gateway Interface) 프레임워크/툴킷이다. 기존의 프레임워크는 WSGI를 사용했는데, WSGI와 ASGI의 차이점을 잘 설명한 블로그가 있어 밑에 기록해 둔다. 가장 큰 차이점은 ASGI는 모든 요청이 비동기 방식으로 이루어져, 기존의 WSGI에서 차용하던 Celery를 사용하지 않아도 되며(내가 삽질한,,,이런 젠장!!) 기본적으로 Websocket 과 HTTP2.0프로토콜을 지원한다고 한다.

 

[Python] REST API 개발로 알아보는 WSGI, ASGI

REST API 서버를 개발하기 위해서는 이제 특정 언어를 배워야 할 필요 없이 원하는 언어로 자유롭게 개발할 수 있는 세상이 오게 되었습니다. Python 언어 또한 다양한 프레임워크를 제공함으로써 RE

blog.neonkid.xyz

더불어 Starlette이 강력한 성능을 보장하는 이유는 내부적으로 uvicorn을 사용하고 있기 때문이다. uvicorn은 uvloops와 httptools를 사용하는 초고속 ASGI 서버이다. uvloop의 성능 비밀은 libuv과 Cython에 있다. 그 중에서 libuv는 Node.js가 동작하는 환경이라고 한다.  이렇게 보니, FastAPI가 빠른 이유를 어느정도 이해할 수 있을 것 같다. (pydantic에 대한 내용도 있는데, pydantic은 Data-Validation을 위해 사용한다고 한다.)

2. 직관적이다.  훌륭한 편집기가 지원되며, 모든 곳에서 자동완성 기능을 제공하고, 디버깅 시간이 굉장히 짧다고 한다. 자동완성은 개발자라면 누구나 공감할 만한 내용이다. Flask를 사용하면서 자동완성기능이 어떨땐 작동하고, 아닐때도 있어서 굉장히 답답했는데... FastAPI..이미 합격이다.

3. 표준 기반의 API에 대해 완벽하게 호환되는 OpenAPI (이전에 Swagger로 알려졌던) 및 JSON 스키마를 지원한다. Swagger다. 비단 Spring에만 적용되는 것이 아니라 다양하게 쓸 수 있다고 말은 전해들었는데 그걸 프레임워크 수준에서 지원한다고 한다. 이전에 DRF를 사용할 때는 api에 대한 요약내용을 확인할 수는 있었는데 Spring-Boot를 쓰면서 이 Swagger의 유용함에 감탄했던 기억이 난다. 그런데 이게 python 프레임웍에 떡하니 있다. 얼른 Rest-API 개발을 끝내고 분산처리 아키텍쳐에 집중할 수 있을 것 같다.

 

[번외]

    직접 사용해보니 정말 쓰기 편하다! 그리고 배우기 쉽다! 혹시 나처럼 '한번 써볼까?'하는 개발자분들은 꼭 써보시길!

728x90

'[Python] > [FastAPI]' 카테고리의 다른 글

[AWS S3] FastAPI - S3 Image upload  (0) 2021.09.24