[파이썬] Flask 앱 성능 최적화

Flask는 Python으로 작성된 가벼운 웹 애플리케이션 프레임워크로, 빠른 개발과 유연성을 제공합니다. 하지만 Flask 앱이 대량의 트래픽을 처리하거나 복잡한 작업을 수행할 때 성능이 저하될 수 있습니다. 이러한 상황에서 Flask 앱의 성능을 최적화하는 방법을 살펴보겠습니다.

1. 캐싱 사용하기

Flask에서는 Flask-Caching과 같은 확장을 사용하여 캐싱을 구현할 수 있습니다. 캐싱은 반복적인 계산 또는 데이터베이스 쿼리 등의 작업을 한 번 실행한 후 결과를 메모리에 저장해두고, 이후 동일한 요청이 들어오면 저장된 결과를 반환하는 방식입니다. 이를 통해 반복적인 계산을 피하고 앱의 응답 속도를 향상시킬 수 있습니다.

from flask import Flask
from flask_caching import Cache

app = Flask(__name__)
cache = Cache(app)

@app.route('/')
@cache.cached(timeout=60)  # 60초 동안 캐싱된 결과 반환
def index():
    # 특정 작업 수행
    return 'Hello, World!'

2. 데이터베이스 연결 풀링

Flask 앱에서 데이터베이스를 사용하는 경우, 매번 새로운 연결을 만들어 사용하는 것은 비용이 큽니다. 대신, 데이터베이스 연결 풀링을 통해 미리 생성된 연결을 재사용할 수 있습니다. 이를 위해 Flask-SQLAlchemy과 같은 확장을 사용할 수 있습니다.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'database://user:password@localhost/db'
db = SQLAlchemy(app)

# 데이터베이스 모델 정의
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)

@app.route('/')
def index():
    # 데이터베이스 연산 수행
    users = User.query.all()
    return 'Hello, World!'

3. 비동기 작업 사용하기

Flask는 기본적으로 동기적인 작업을 처리하는 방식입니다. 따라서 앱에서 오래 걸리는 작업을 실행하면 전체 앱의 응답 속도가 저하될 수 있습니다. 이를 해결하기 위해 비동기 작업을 사용할 수 있습니다. Flask-Executor와 같은 확장을 사용하여 비동기 작업을 처리할 수 있습니다.

from flask import Flask
from flask_executor import Executor

app = Flask(__name__)
executor = Executor(app)

@app.route('/')
def index():
    # 비동기 작업 실행
    executor.submit(do_long_task)
    return 'Hello, World!'

def do_long_task():
    # 오래 걸리는 작업 실행
    pass

4. 정적 파일 캐싱

Flask는 정적 파일을 제공하기 위해 Flask-Static-Caching과 같은 확장을 사용할 수 있습니다. 정적 파일은 변하지 않는 파일로, 매번 요청이 들어올 때마다 파일을 읽어오는 것은 비효율적입니다. 이러한 경우, 캐싱을 통해 정적 파일을 메모리에 저장해두고 요청 시 저장된 파일을 바로 반환할 수 있습니다.

from flask import Flask
from flask_static_caching import FlaskStaticCaching

app = Flask(__name__)
cache = FlaskStaticCaching(app)

@app.route('/static/<path:filename>')
@cache.cached(timeout=3600)  # 3600초 동안 캐싱된 정적 파일 반환
def static_file(filename):
    # 정적 파일 제공
    return send_file(filename)

Flask 앱의 성능을 최적화하면 앱의 응답 속도를 대폭 향상시킬 수 있습니다. 캐싱 사용, 데이터베이스 연결 풀링, 비동기 작업, 정적 파일 캐싱과 같은 방법을 통해 Flask 앱의 성능을 향상시켜보세요.