프로그래밍/Python

[Python 강의] 26강 - Flask 애플리케이션에 대한 최적화 기법

월횽 2024. 11. 4. 06:30
728x90
반응형
SMALL

안녕하세요! 그레이 해커 월횽입니다. 오늘은 Flask 애플리케이션 최적화에 대해 알아보겠습니다. 최적화는 성능을 높이고 애플리케이션의 응답 속도를 개선하는 데 중요한 역할을 합니다. 오늘은 캐싱, 데이터베이스 최적화, 비동기 처리 등 다양한 기법을 다루어 보겠습니다.

 

 

1. 캐싱(Caching)

캐싱은 자주 요청되는 데이터를 미리 저장해 두어 데이터베이스나 서버에 부담을 줄이고 응답 속도를 높이는 방식입니다.

 

Flask-Caching 설정

Flask에서는 Flask-Caching을 이용하여 쉽게 캐시를 설정할 수 있습니다.

pip install Flask-Caching
반응형
from flask import Flask
from flask_caching import Cache

app = Flask(__name__)
app.config['CACHE_TYPE'] = 'simple'  # 메모리 기반 캐시
cache = Cache(app)

 

 

캐시 적용 예시

@app.route('/expensive_query')
@cache.cached(timeout=60)  # 60초 동안 캐시
def expensive_query():
    # 데이터베이스에서 복잡한 쿼리 실행
    result = "복잡한 데이터"
    return result

 

 

 

2. 데이터베이스 최적화

Flask에서 데이터베이스 쿼리를 최적화하여 성능을 개선할 수 있습니다. 쿼리 최적화와 인덱스를 활용하는 것이 중요합니다.

 

SQLAlchemy 예시

SQLAlchemy를 사용할 때 데이터베이스 호출을 최소화하고 필요한 데이터만 요청하여 성능을 높일 수 있습니다.

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)

# 예시 쿼리 최적화
@app.route('/users')
def get_users():
    users = db.session.query(User).options(load_only(User.name, User.email)).all()
    return jsonify([user.to_dict() for user in users])

 

 

 

3. 비동기 작업 처리

비동기 처리는 요청에 대한 응답과 별개로 시간이 오래 걸리는 작업을 수행할 때 유용합니다. Flask에서는 Celery와 같은 라이브러리를 사용해 비동기 작업을 처리할 수 있습니다.

 

Celery 설치 및 설정

pip install celery
728x90
from celery import Celery

def make_celery(app):
    celery = Celery(
        app.import_name,
        backend='redis://localhost:6379/0',
        broker='redis://localhost:6379/0'
    )
    celery.conf.update(app.config)
    return celery

celery = make_celery(app)

 

 

비동기 작업 예시

@celery.task
def background_task(data):
    # 데이터 처리 작업
    pass

@app.route('/process', methods=['POST'])
def process_data():
    data = request.get_json()
    background_task.delay(data)  # 비동기 작업 호출
    return jsonify({"message": "처리가 시작되었습니다."})

 

 

 

4. 템플릿 최적화

Flask에서는 템플릿 상속을 통해 공통 레이아웃을 정의하고, 정적 파일을 압축하여 불필요한 렌더링을 줄일 수 있습니다.

· 템플릿 상속: 공통 요소를 포함해 불필요한 HTML 중복을 줄입니다.
· 정적 파일 압축: CSS, JavaScript 등의 파일을 압축하여 로딩 시간을 단축합니다.

 

 

5. API 응답 최적화

API에서 큰 데이터를 반환할 경우, 페이징(pagination)과 지연 로딩(lazy loading)을 사용해 네트워크 부담을 줄이고, 클라이언트의 응답 시간을 개선할 수 있습니다.

 

페이징 예시

@app.route('/items')
def get_items():
    page = request.args.get('page', 1, type=int)
    items = Item.query.paginate(page, per_page=10).items
    return jsonify([item.to_dict() for item in items])

 

 

 

6. 성능 테스트 및 모니터링

애플리케이션의 성능을 주기적으로 점검하는 것은 필수적입니다. Locust와 같은 부하 테스트 도구나 New Relic을 사용하여 애플리케이션 성능을 모니터링할 수 있습니다.

SMALL
pip install locust
locust -f locustfile.py

 

 

 

7. 로드 밸런싱

요청이 많은 환경에서는 로드 밸런서를 통해 서버 간의 부하를 분산하여 성능을 높일 수 있습니다. NGINX나 AWS ELB와 같은 로드 밸런서를 활용해 트래픽을 분산하고 안정성을 높입니다.

 

다음 시간에는 Flask 애플리케이션을 위한 보안 최적화에 대해 알아보겠습니다!

 

 

 

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST