Flask

Chapter 3-4 Flask-SQLAlchemy 사용자 관리 라우트 구축(routes/user.py)

Chansman 2025. 4. 21. 10:22

📌 개념 정리

3-4. 사용자 관리 라우트 구축

💻 전체 코드 예시 (routes/user.py)

from flask.views import MethodView
from flask_smorest import Blueprint, abort
from marshmallow import Schema, fields
from db import db
from models import User

# 스키마 정의
class UserSchema(Schema):
    id = fields.Int(dump_only=True)
    name = fields.Str(required=True)
    email = fields.Str(required=True)

# Blueprint 설정
user_blp = Blueprint('users', 'users', url_prefix='/users', description='Operations on users')

@user_blp.route('/')
class UserList(MethodView):
    @user_blp.response(200, UserSchema(many=True))
    def get(self):
        users = User.query.all()
        return users

    @user_blp.arguments(UserSchema)
    @user_blp.response(201, UserSchema)
    def post(self, new_data):
        new_user = User(name=new_data['name'], email=new_data['email'])
        db.session.add(new_user)
        db.session.commit()
        return new_user

@user_blp.route('/<int:user_id>')
class UserResource(MethodView):
    @user_blp.response(200, UserSchema)
    def get(self, user_id):
        user = User.query.get_or_404(user_id)
        return user

    @user_blp.arguments(UserSchema)
    @user_blp.response(200, UserSchema)
    def put(self, new_data, user_id):
        user = User.query.get_or_404(user_id)
        user.name = new_data['name']
        user.email = new_data['email']
        db.session.commit()
        return user

    @user_blp.response(204)
    def delete(self, user_id):
        user = User.query.get_or_404(user_id)
        db.session.delete(user)
        db.session.commit()

🚦 단계별 프로세스 흐름 및 설명

📍 Step 1: Schema 정의

class UserSchema(Schema):
    id = fields.Int(dump_only=True)
    name = fields.Str(required=True)
    email = fields.Str(required=True)
  • 사용자 데이터를 검증하고 직렬화/역직렬화할 Schema를 정의합니다.
  • id는 자동 생성되는 필드로 사용자가 직접 입력하지 않습니다.
  • name, email 필드는 필수 입력 필드로 설정됩니다.

📍 Step 2: Blueprint 설정

user_blp = Blueprint('users', 'users', url_prefix='/users', description='Operations on users')
  • Flask-Smorest의 Blueprint를 사용하여 사용자 관련 API를 그룹화합니다.
  • URL 접두사를 /users로 설정합니다.

📍 Step 3: 전체 사용자 목록 조회 및 추가

GET 요청 (사용자 목록 조회)

@user_blp.route('/')
class UserList(MethodView):
    @user_blp.response(200, UserSchema(many=True))
    def get(self):
        users = User.query.all()
        return users
  • 모든 사용자를 데이터베이스에서 조회하여 리스트 형태로 반환합니다.
  • Schema를 이용하여 데이터 구조를 정의합니다.

POST 요청 (새 사용자 추가)

    @user_blp.arguments(UserSchema)
    @user_blp.response(201, UserSchema)
    def post(self, new_data):
        new_user = User(name=new_data['name'], email=new_data['email'])
        db.session.add(new_user)
        db.session.commit()
        return new_user
  • 새 사용자 데이터를 받아 데이터베이스에 저장합니다.
  • 저장된 사용자 정보를 다시 반환하여 확인할 수 있도록 합니다.

📍 Step 4: 특정 사용자 조회, 수정, 삭제

GET 요청 (특정 사용자 조회)

@user_blp.route('/<int:user_id>')
class UserResource(MethodView):
    @user_blp.response(200, UserSchema)
    def get(self, user_id):
        user = User.query.get_or_404(user_id)
        return user
  • 특정 사용자 ID를 통해 사용자 정보를 조회합니다.

PUT 요청 (사용자 정보 수정)

    @user_blp.arguments(UserSchema)
    @user_blp.response(200, UserSchema)
    def put(self, new_data, user_id):
        user = User.query.get_or_404(user_id)
        user.name = new_data['name']
        user.email = new_data['email']
        db.session.commit()
        return user
  • 특정 사용자의 데이터를 수정하고 변경 사항을 저장합니다.

DELETE 요청 (사용자 삭제)

    @user_blp.response(204)
    def delete(self, user_id):
        user = User.query.get_or_404(user_id)
        db.session.delete(user)
        db.session.commit()
  • 특정 사용자를 데이터베이스에서 삭제합니다.

마무리 요약 및 복습 포인트

  • Schema로 데이터의 구조를 관리하고 유효성을 검증합니다.
  • Blueprint로 사용자 관련 API를 효율적으로 관리합니다.
  • CRUD 기능을 명확히 정의하여 데이터 처리를 간결하게 합니다.