Flask를 실무 흐름으로 이해하기
Flask로 작고 명시적인 Python 웹 서비스를 만듭니다. 라우팅, Blueprint 구조화, 설정 분리, SQLAlchemy 연동, 테스트, WSGI 배포까지 실무 흐름으로 정리했습니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
Flask로 작고 명시적인 Python 웹 서비스를 만듭니다. 라우팅, Blueprint 구조화, 설정 분리, SQLAlchemy 연동, 테스트, WSGI 배포까지 실무 흐름으로 정리했습니다.
Flask로 작고 명시적인 Python 웹 서비스를 만듭니다. 라우팅, Blueprint 구조화, 설정 분리, SQLAlchemy 연동, 테스트, WSGI 배포까지 실무 흐름으로 정리했습니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
문법보다 요청이 들어와 검증, 처리, 저장, 응답으로 이어지는 경계를 먼저 잡습니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 Flask를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
Flask를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
| 구분 | Flask | Django |
|---|---|---|
| 철학 | 작고 명시적인 코어 | batteries included |
| 구조 | Blueprint와 확장으로 직접 구성 | 프로젝트/app 구조 기본 제공 |
| 데이터 | SQLAlchemy 등 선택 | ORM 기본 포함 |
| 적합한 상황 | 작은 API, 마이크로서비스, 빠른 실험 | 관리자/인증/ORM이 필요한 제품형 서비스 |
여기서는 프로젝트 설정을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
uv venv
source .venv/bin/activate
uv pip install flask gunicorn pytest
mkdir -p app tests
touch app/__init__.py app/routes.py tests/test_app.py
flask --app app run --debug여기서는 라우팅을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
from flask import Flask, jsonify, request
def create_app() -> Flask:
app = Flask(__name__)
@app.get("/health")
def health():
return {"status": "ok"}
@app.post("/items")
def create_item():
payload = request.get_json(silent=True) or {}
name = payload.get("name")
if not name:
return jsonify({"error": "name is required"}), 400
return jsonify({"id": 1, "name": name}), 201
return app여기서는 Blueprint 구조을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
from flask import Blueprint, jsonify
bp = Blueprint("users", __name__, url_prefix="/users")
@bp.get("/")
def list_users():
return jsonify([
{"id": 1, "name": "Ada"},
{"id": 2, "name": "Linus"},
])from flask import Flask
from .users import bp as users_bp
def create_app() -> Flask:
app = Flask(__name__)
app.register_blueprint(users_bp)
return app여기서는 설정 분리을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
import os
class Config:
SECRET_KEY = os.getenv("SECRET_KEY", "dev-only")
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///app.db")
JSON_SORT_KEYS = False
class TestConfig(Config):
TESTING = True
DATABASE_URL = "sqlite:///:memory:"여기서는 SQLAlchemy 연동을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
uv pip install flask-sqlalchemyfrom flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), unique=True, nullable=False)
name = db.Column(db.String(80), nullable=False)
def to_dict(self) -> dict:
return {"id": self.id, "email": self.email, "name": self.name}여기서는 테스트을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
from app import create_app
def test_health():
app = create_app()
client = app.test_client()
res = client.get("/health")
assert res.status_code == 200
assert res.get_json() == {"status": "ok"}
def test_create_item_requires_name():
app = create_app()
client = app.test_client()
res = client.post("/items", json={})
assert res.status_code == 400
assert "error" in res.get_json()여기서는 WSGI 배포을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
gunicorn "app:create_app()" \
--bind 0.0.0.0:8000 \
--workers 2 \
--timeout 30 \
--access-logfile -Flask 실무 설계은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 결정 지점 | 확인 질문 | 실무 기준 |
|---|---|---|
| 경계 | Flask 코드에서 바뀌기 쉬운 부분은 어디인가? | 입출력, 설정, 외부 연동, 핵심 규칙을 분리합니다. |
| 상태 | 상태가 어디서 생성되고 어디서 사라지는가? | 상태 소유자와 수명 주기를 코드로 드러냅니다. |
| 장애 | 실패했을 때 호출자는 무엇을 받는가? | timeout, fallback, error contract를 먼저 정합니다. |
이 섹션은 Flask 운영 기준을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.
Flask 검증 전략은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 품질 축 | 검증 방법 | 완료 기준 |
|---|---|---|
| 정확성 | 정상/실패 케이스를 자동화합니다. | 핵심 시나리오가 재현 가능하게 통과합니다. |
| 회귀 방지 | 버그 수정 시 동일 케이스를 테스트로 남깁니다. | 같은 장애가 다시 배포되지 않습니다. |
| 운영성 | 로그, 메트릭, 알림을 확인합니다. | 문제가 생겼을 때 원인 추적 경로가 있습니다. |