본문 바로가기

Programming/python

파이썬 플라스크(Flask)를 활용한 실전 꿀팁 모음 – 실무 예제와 함께 배우는 웹 개발

728x90
반응형
파이썬 플라스크(Flask)를 활용한 실전 꿀팁 모음 – 실무 예제와 함께 배우는 웹 개발


Python의 마이크로 웹 프레임워크인 Flask는 빠르고 유연하며 배우기 쉬운 웹 프레임워크로, 개인 프로젝트부터 스타트업 MVP, 간단한 백엔드 API 구축에 이르기까지 다양한 환경에서 널리 활용된다. 하지만 단순한 "Hello, World!" 튜토리얼 이후엔 뭘 해야 할지 막막한 경우가 많다.

이번 글에서는 실제 예제를 중심으로 플라스크 개발 실전 꿀팁들을 정리해보겠다. 초보자도 이해할 수 있도록 설명하면서도, 실무자 입장에서도 도움이 되는 심화 내용까지 다룬다.

 


 

1. 기본적인 구조 잡기 – Blueprint로 규모 확장 고려하기

초기에는 단일 파일로 개발을 시작해도 괜찮지만, 실제 서비스를 운영하거나 API가 늘어나기 시작하면 코드가 급격히 복잡해진다. 이때 유용한 것이 Blueprint.

🔹 Blueprint란?

Blueprint는 Flask 앱을 여러 개의 모듈로 나누어 관리할 수 있는 구조화된 방식이다.

# routes/user.py
from flask import Blueprint

user_bp = Blueprint('user', __name__)

@user_bp.route('/login')
def login():
    return 'User Login Page'

 

# app.py
from flask import Flask
from routes.user import user_bp

app = Flask(__name__)
app.register_blueprint(user_bp, url_prefix='/user')

if __name__ == '__main__':
    app.run(debug=True)

 

✅ 꿀팁

  • url_prefix를 활용하면 라우팅을 일관성 있게 유지 가능
  • Blueprints를 모듈화해두면 테스트, 유지보수, 확장이 쉬움

 

  • url_prefix를 활용하면 라우팅을 일관성 있게 유지 가능
  • Blueprints를 모듈화해두면 테스트, 유지보수, 확장이 쉬움

2. 환경설정 분리 – Config 클래스를 활용하자

실무에서는 개발, 테스트, 운영 환경마다 설정이 달라야 한다.

# config.py
class Config:
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = 'sqlite:///default.db'

class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'

class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = 'mysql://user:password@host/db'
# app.py
from config import DevelopmentConfig

app = Flask(__name__)
app.config.from_object(DevelopmentConfig)

✅ 꿀팁

  • 환경변수를 이용해서 실행 시점에 동적으로 선택하도록 하자
  • .env 파일 + python-dotenv 라이브러리를 함께 사용하면 더 깔끔

3. 데이터베이스 연동 – SQLAlchemy 제대로 쓰기

Flask에는 기본적으로 ORM(Object Relational Mapper)인 SQLAlchemy가 탑재된다. 초보자는 단순한 .query.all()까지만 쓰는 경우가 많지만, 실무에서는 다음 같은 팁들이 매우 유용하다.

🔹 모델 정의

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    created_at = db.Column(db.DateTime, server_default=db.func.now())

 

🔹 관계 설정

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    user = db.relationship('User', backref=db.backref('posts', lazy=True))

✅ 꿀팁

  • 관계형 쿼리는 joinedload 등으로 N+1 문제 해결
  • Flask-Migrate로 DB 변경사항 자동 관리 (alembic 기반)

4. RESTful API 만들기 – Flask-Restful vs Flask 자체 방식

Flask 기본 방식으로도 RESTful API를 만들 수 있지만, Flask-RESTful은 더 구조화된 방식 제공.

🔹 Flask 기본 방식

@app.route('/api/user/<int:id>', methods=['GET'])
def get_user(id):
    user = User.query.get(id)
    return jsonify({'username': user.username})

 

🔹 Flask-RESTful 방식

from flask_restful import Resource, Api

api = Api(app)

class UserResource(Resource):
    def get(self, id):
        user = User.query.get(id)
        return {'username': user.username}

api.add_resource(UserResource, '/api/user/<int:id>')

 

✅ 꿀팁

  • Flask-RESTful + Marshmallow 조합은 직렬화/역직렬화에 강력
  • Swagger와 결합하면 API 문서화까지 한방에 가능 (Flasgger 추천)

5. 사용자 인증 – JWT 기반 인증 적용

플라스크에서 인증 기능을 구현할 땐 Flask-JWT-Extended가 가장 널리 쓰인다.

from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app.config['JWT_SECRET_KEY'] = 'super-secret'
jwt = JWTManager(app)

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    token = create_access_token(identity=username)
    return jsonify(access_token=token)

@app.route('/protected')
@jwt_required()
def protected():
    current_user = get_jwt_identity()
    return jsonify(logged_in_as=current_user)

✅ 꿀팁

  • JWT 토큰은 클라이언트에 저장되므로, 토큰 만료/갱신 로직도 함께 설계 필요
  • 실제 서비스에서는 HTTPS 사용 필수

6. 폼 처리 – Flask-WTF로 안정적인 폼 처리

플라스크는 기본적으로 폼 처리가 까다로운데, Flask-WTF를 쓰면 CSRF 보호, 폼 검증을 간편하게 처리할 수 있다.

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class NameForm(FlaskForm):
    name = StringField('Your Name', validators=[DataRequired()])
    submit = SubmitField('Submit')
@app.route('/form', methods=['GET', 'POST'])
def form():
    form = NameForm()
    if form.validate_on_submit():
        return f"Hello, {form.name.data}!"
    return render_template('form.html', form=form)

마무리하며 – Flask는 심플하지만 강력하다

Flask는 처음엔 작고 가볍지만, 위에서 소개한 다양한 확장 기능과 구조화 방법을 적용하면 기업용 서비스까지도 커버할 수 있다. 이번 글에서 소개한 팁들은 단순한 튜토리얼을 넘어 실제 웹서비스를 구축하거나 API 백엔드를 만들 때 반드시 마주치는 문제와 그 해결책들이다.

이제 Flask를 단순한 토이 프로젝트 도구가 아닌, 강력한 실전 프레임워크로 활용해보자. 그리고 가장 중요한 건, 언제나 확장성과 유지보수를 고려한 설계를 습관화하는 것이다.

728x90
반응형