FastAPI - (1) FastAPI 소개 및 python 웹프레임워크 비교

이영락·2024년 10월 7일

개발자 기본기

목록 보기
35/53

🏖️ 파이썬 웹 프레임워크 비교 - Django, Flask, FastAPI 알아보기

FastAPI의 성장

세바스티안 라미레즈(Sebastián Ramírez)가 2018년에 발표한 모던 파이썬 웹 프레임워크, FastAPI는 Flask와 Django를 빠르게 따라잡으며 성장했습니다. GitHub 스타 수를 기준으로 2023년 말에 FastAPI가 Flask를 앞지르면서 두 번째로 인기 있는 파이썬 웹 프레임워크가 되었습니다.


Flask

Flask의 특징

  • Flask는 마이크로프레임워크로, 기본 뼈대를 제공하며 서드파티 패키지를 통해 기능을 확장합니다.
  • WSGI를 기반으로 하는 동기식 프레임워크이며, ASGI를 기본적으로 지원하지 않습니다.

Q1. 마이크로프레임워크란?

마이크로프레임워크(Microframework)는 최소한의 기능만을 제공하는 웹 애플리케이션 프레임워크. 즉, 필요한 핵심 기능들만 포함하고, 추가적인 기능들은 사용자가 필요에 따라 확장하거나 외부 라이브러리로 보완할 수 있는 프레임워크를 의미합니다. 일반적인 웹 프레임워크에 비해 경량화된 형태이며, 복잡한 기능이나 미리 정의된 구조가 적기 때문에 개발자가 자유롭게 설계를 할 수 있다는 장점이 있습니다.

마이크로프레임워크는 다음과 같은 특징을 가집니다:

1.	간결함: 불필요한 기능을 배제하고 기본적인 기능만 제공하므로 코드가 간단하고 유지보수하기 쉽습니다.
2.	확장 가능성: 필요한 기능(예: 데이터베이스 연결, 인증, 세션 관리 등)을 플러그인 형태로 추가할 수 있습니다.
3.	경량성: 복잡한 설정 없이 빠르게 실행 가능한 경량 구조를 가집니다.

Q2. WSGI란?

WSGI(Web Server Gateway Interface)는 파이썬을 위한 웹 서버와 웹 애플리케이션 간의 인터페이스입니다. WSGI는 파이썬에서 웹 애플리케이션을 개발할 때 표준 인터페이스 역할을 하여, 다양한 웹 서버와 애플리케이션이 호환되도록 돕습니다.

동기식 프레임워크는 요청을 처리할 때 한 번에 하나씩 순차적으로 처리하는 방식입니다. 요청을 받아들인 후 그 요청이 완전히 처리될 때까지 다른 요청을 처리하지 않고 대기합니다. 즉, 각 요청 처리가 완료되기 전까지 다음 요청을 처리하지 않으므로, 많은 요청이 들어오면 성능 병목이 생길 수 있습니다. 그러나 코드가 단순하고 직관적이기 때문에 개발자가 관리하기 쉽습니다.

WSGI 기반 동기식 프레임워크의 특징

1.	동기식 처리 방식: 요청이 들어오면 서버는 그 요청을 처리한 후 응답을 반환하기 전까지 다른 작업을 수행하지 않습니다.
2.	간단한 구조: 동기식 코드는 비동기 코드보다 상대적으로 간단하며, 개발자가 논리를 작성하기 더 쉽습니다.
3.	멀티스레드/멀티프로세스: 성능을 개선하기 위해 동시성을 제공할 수 있지만, 동기식 방식 자체는 하나의 요청에 대해 하나의 스레드나 프로세스를 사용합니다.
4.	범용성: WSGI는 파이썬 웹 애플리케이션 표준이므로 다양한 웹 서버와 프레임워크가 WSGI를 지원합니다. 덕분에 WSGI 기반의 동기식 프레임워크는 여러 웹 서버와 호환됩니다.

동기식 프레임워크의 한계

동기식 프레임워크는 요청을 순차적으로 처리하기 때문에, 다수의 동시 요청을 효율적으로 처리하는 데 한계가 있을 수 있습니다. 특히 I/O 작업이 많은 환경(예: 데이터베이스 쿼리, 외부 API 요청 등)에서 비동기 방식보다 성능이 떨어질 수 있습니다. 이 경우에는 비동기 프레임워크나 비동기 처리 기법을 도입하는 것이 더 적합할 수 있습니다.

요약하자면, WSGI 기반 동기식 프레임워크는 파이썬에서 전통적으로 널리 사용되는 웹 애플리케이션 개발 방식으로, 간단하고 직관적인 코드 작성을 지원하지만, 동시성 처리에 있어서는 성능상의 한계가 있을 수 있는 방식입니다.

1) 경로

  • Flask와 FastAPI는 모두 데코레이터를 사용해 경로를 웹 엔드포인트와 연결합니다.
  • Flask의 경우, jsonify() 함수로 데이터를 JSON으로 변환해 반환하며, 최신 버전에서는 딕셔너리를 자동으로 JSON으로 변환합니다.

2) 쿼리 매개변수

  • Flask는 request.args 객체를 통해 쿼리 매개변수를 처리합니다. 쿼리 매개변수는 딕셔너리 형태로 저장됩니다.

3) 본문

  • Flask는 요청 본문을 JSON 형식으로 받아 request.json에 저장합니다.

4) 헤더

  • Flask는 요청 헤더 데이터를 request.headers 객체에 저장하며, 대소문자를 구분하지 않습니다.

Django

Django의 특징

  • Django는 Flask와 FastAPI보다 더 크고 복잡한 모놀리식 프레임워크입니다.
  • 내장된 ORM(Object-Relational Mapper)을 사용하여 데이터베이스를 쉽게 처리할 수 있습니다.
  • Django는 WSGI 기반 애플리케이션이었지만, 3.0 버전부터 ASGI를 지원해 비동기 프로그래밍을 할 수 있게 되었습니다.

경로

  • Django는 Flask나 FastAPI와 달리 데코레이터 대신 단일 URLConf 테이블에서 경로를 설정합니다.

FastAPI

FastAPI의 특징

  • FastAPI는 빠른 웹 API 개발에 최적화된 프레임워크로, 비동기 지원, 파이썬 타입 힌트, Pydantic을 사용한 데이터 검증 등을 제공합니다.
  • 성능은 Node.js나 Go에 필적할 만큼 뛰어나며, 자동 API 문서 생성을 지원합니다.

주요 기능

  • 파이썬 타입 힌트 지원
  • 비동기 지원을 포함한 Starlette 기반
  • 데이터 검증 및 정의를 위한 Pydantic

Django, Flask, FastAPI의 장/단점 비교

프레임워크장점단점
Django풀스택 프레임워크, 강력한 ORM, 보안 기능학습 곡선이 가파름, 소규모 프로젝트에 과도함
Flask가볍고 유연성 있음, 확장성 높음대규모 프로젝트에 구조화 어려움, 비동기 지원 부족
FastAPI매우 빠른 성능, 자동 API 문서, 비동기 지원커뮤니티 규모가 작음, 일부 기능에 추가 라이브러리 필요

🏖️ 결론

세 프레임워크는 각각의 특징과 장단점이 있으며, 프로젝트의 규모와 요구 사항에 따라 선택이 달라집니다. FastAPI는 비동기 지원과 빠른 성능을 필요로 하는 API 프로젝트에 적합하며, Django는 큰 규모의 데이터베이스 및 완벽한 웹 애플리케이션을 개발하는 데 유리합니다. Flask는 간단하고 유연한 프로젝트에 적합하며, 확장 가능한 마이크로프레임워크로 사용할 수 있습니다.

차이점?

FastAPI로 작성한 API는 리액트나 Vue.js, Svelte와 같은 Frontend 웹 프레임워크에서 사용할 수 있고 안드로이드나 아이폰 앱에서도 사용할 수 있다. 만약 장고나 플라스크로 웹 서비스를 만들었다면 이에 대응하는 안드로이드나 아이폰 앱을 위한 API 개발을 따로 해야 하지만 FastAPI는 한번 만든 API를 여러 클라이언트에서 변경없이 사용할 수 있다.


🏖️ FastAPI 소개

FastAPI는 현대적이고 빠르며 고성능의 웹 프레임워크로, Python 3.8+에서 파이썬 표준 타입 힌트를 사용하여 API를 쉽게 빌드할 수 있게 도와줍니다.

FastAPI의 특징

  • 빠른 코드 작성: 더 적은 코드로 더 많은 기능을 구현할 수 있습니다.
  • 적은 버그: 타입 힌트와 Pydantic 모델을 사용하여 코드의 신뢰성과 품질을 높입니다.
  • 직관적이고 쉬운 사용법: 직관적인 설계로 개발자의 경험을 개선합니다.
  • 대화형 API 제공: Swagger UI를 통해 자동으로 문서를 생성하며, 이를 사용하여 API를 테스트할 수 있습니다.
  • 대안 API 제공: 다양한 API 스타일을 지원합니다.
  • 속도가 빠르다: Starkette라는 비동기프레임워크를 사용해 GO와 Node.JS와 대등할 만큼 높은 성능으로 파이썬 웹 프레임워크 중 가장 빠르다.
  • 프로덕션 환경 지원: Uvicorn과 Hypercorn을 사용하여 빠르고 안정적인 프로덕션 환경을 제공합니다.
  • API 문서 자동 생성: 입출력 정의와 입출력 값을 정의하는 것이 패턴화되어 있고 정의된 입출력을 통해 API 문서가 자동으로 생성됨.

환경 설정

1. Python 버전 설정

Python 버전 3.10을 설치하기 위해 다음 명령어를 사용하세요:

conda create -n fastapi python=3.10

2. 가상 환경 실행

가상 환경을 활성화하려면 다음 명령어를 실행:

# conda activate <환경명>
conda activate fastapi
  1. FastAPI 설치

FastAPI를 설치하려면 다음 명령어를 실행:

pip install fastapi
  1. 서버 실행 확인

다음은 FastAPI 서버를 실행하기 위한 예시 코드:

from fastapi import FastAPI, Request
import uvicorn

app = FastAPI()

@app.get("/")
def home(request: Request):
    return {"name": "Hello World"}

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8080)
  1. 서버 실행(terminal에서 서버 실행)

서버를 실행하려면 다음 명령어를 실행:

python app.py
  1. 웹 브라우저에서 확인

웹 브라우저에서 localhost:8080에 접속하여 결과를 확인할 수 있습니다.


주요 개념

  • HTTP 메서드: FastAPI는 다양한 HTTP 메서드를 지원합니다 (GET, POST, PUT, DELETE 등).
  • HTML 템플릿: 웹 페이지 템플릿을 Jinja2를 사용하여 작성할 수 있습니다.
  • 데이터베이스: FastAPI는 SQLAlchemy와 같은 ORM을 사용하여 데이터베이스와의 통합을 쉽게 할 수 있습니다.

🏖️ Svelte 개발환경 준비하기

FastAPI로 만든 백엔드 서버에 데이터를 요청하고 응답을 받아서 처리하는 프로그램을 개발하기 위해서는 프론트엔드 프레임워크가 필요하다. 프론트엔드 프레임워크로 스벨트(Svelte)를 사용할 것이다. 이번 장에서는 Svelte 개발에 필요한 환경을 구성해 보자.

Svelte란?

: React, Vue.js 등과 비슷한 역할을 하는 프론트엔드용 웹 프레임워크이다. 2016년에 Rich Harris에 의해 최초 발표되었으며 현재 꾸준한 인기를 얻고 있다.

  • Write less code: 다른 프레임워크에 비해 작성해야 할 코드가 적다.
  • No virtual Dom: React나 Vue.js는 가상 돔을 사용하지만 Svelte는 가상 돔 없이 실제 DOM에 바로 반영한다.
  • Truly reactive: 복잡한 상태 관리 지식이나 라이브러리 없이 순수 자바스크립트로 쉽게 구현된다.

Node.js 설치하기

Svelte를 사용하려면 Node.js가 필요하다. Node.js는 자바스크립트로 애플리케이션을 개발할 수 있게 해주는 도구이다. 명령창에서 아래 명령어로 Node.js가 설치되었는지 확인하자.

c:\ > node -v

만약 설치되지 않았다면 Node.js 공식 사이트에서 최신 버전을 다운로드하여 설치하자.

Svelte 설치하기

Node.js가 설치되면 npm도 함께 설치된다. Svelte는 npm을 사용해 설치할 수 있다. 아래 명령을 입력하여 Svelte 프로젝트를 생성하자.

(myapi) c:/projects/myapi> npm create vite@latest frontend -- --template svelte
(myapi) c:/projects/myapi/frontend> npm install

Svelte 애플리케이션을 실행 명령어:

(myapi) c:/projects/myapi/frontend> npm run dev

자바스크립트 타입 체크 설정 끄기

Svelte는 기본적으로 자바스크립트 타입을 체크하도록 설정되어 있다. 파이보 프로젝트는 타입스크립트를 사용하지 않기 때문에 이 설정을 끄도록 하자. jsconfig.json 파일을 열고 checkJs 옵션을 false로 설정한다.

{
  "compilerOptions": {
    "checkJs": false
  }
}

Svelte 서버 실행하기

VSCode 터미널에서 다음 명령어로 Svelte 서버를 실행하자:

frontend % npm run dev

브라우저에서 http://127.0.0.1:5173/ 주소를 입력하면 Svelte 애플리케이션이 실행된다.

프론트엔드 서버가 필요한 이유?

Svelte 코드를 실시간으로 변환하고 브라우저에서 확인하려면 Node.js 서버가 필요하다. 하지만 운영 단계에서는 Svelte 코드가 빌드되어 순수 HTML, CSS, Javascript 파일로 배포되므로 Node.js 서버는 필요 없다.


profile
AI Engineer / 의료인공지능

0개의 댓글