Chapter 2-7 Flask MySQL CRUD 애플리케이션 구현

2025. 4. 18. 19:49·Flask

📌 Flask MySQL CRUD 애플리케이션 구현

이번 포스팅에서는 Flask와 MySQL을 활용한 사용자 관리 API와 웹 인터페이스를 구현하는 방법을 다루겠습니다. 이 프로젝트는 사용자를 추가, 조회, 수정 및 삭제하는 기능을 제공하며, 이를 위한 Blueprint와 HTML 템플릿을 포함한 전체 코드를 제공하겠습니다.


🚦 1. Flask 애플리케이션 설정

(1) MySQL 연결 설정 및 Flask 애플리케이션 기본 설정

app.py에서는 Flask 애플리케이션을 설정하고, MySQL과 연결한 후, Blueprint를 등록하여 사용자 관련 API 엔드포인트를 만듭니다.

from flask import Flask
from flask_mysqldb import MySQL
from flask_smorest import Api
from user_routes import create_user_blueprint

app = Flask(__name__)

# MySQL 연결 설정
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'oz-password'
app.config['MYSQL_DB'] = 'oz'

mysql = MySQL(app)

# blueprint 생성 및 등록
app.config["API_TITLE"] = "My API"
app.config["API_VERSION"] = "v1"
app.config["OPENAPI_VERSION"] = "3.1.3"
app.config["OPENAPI_URL_PREFIX"] = "/"
app.config["OPENAPI_SWAGGER_UI_PATH"] = "/swagger-ui"
app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"

user_blp = create_user_blueprint(mysql)
api = Api(app)
api.register_blueprint(user_blp)

from flask import render_template
@app.route('/users_interface')
def users_interface():
    return render_template('users.html')

if __name__ == '__main__':
    app.run(debug=True)
  • mysql은 flask-mysqldb를 사용하여 MySQL과 연결하는 객체입니다.
  • create_user_blueprint는 user_routes.py에서 정의된 Blueprint를 생성하고 등록하는 함수입니다.
  • /users_interface URL을 통해 사용자 인터페이스를 제공하는 HTML 페이지를 렌더링합니다.

💻 2. 사용자 관리 API 구현 (user_routes.py)

user_routes.py에서는 사용자 관련 API를 CRUD 방식으로 구현합니다. 사용자는 GET, POST, PUT, DELETE 방식으로 관리할 수 있습니다.

(1) 사용자 관리 Blueprint 생성

from flask_smorest import Blueprint, abort
from flask import request, jsonify

def create_user_blueprint(mysql):
    user_blp = Blueprint('user_routes', __name__, url_prefix='/users')

    # 모든 사용자 조회
    @user_blp.route('/', methods=['GET'])
    def get_users():
        cursor = mysql.connection.cursor()
        cursor.execute("SELECT * FROM users")
        users = cursor.fetchall()
        cursor.close()

        # 튜플을 딕셔너리로 변환
        users_list = []
        for user in users:
            users_list.append({
                'id': user[0],
                'name': user[1],
                'email': user[2]
            })

        return jsonify(users_list)

    # 사용자 추가
    @user_blp.route('/', methods=['POST'])
    def add_user():
        user_data = request.json
        cursor = mysql.connection.cursor()
        cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)", 
                       (user_data['name'], user_data['email']))
        mysql.connection.commit()
        cursor.close()
        return jsonify({'message': 'User added successfully'}), 201

    # 사용자 수정
    @user_blp.route('/<int:user_id>', methods=['PUT'])
    def update_user(user_id):
        user_data = request.json
        cursor = mysql.connection.cursor()
        cursor.execute("UPDATE users SET name = %s, email = %s WHERE id = %s",
                       (user_data['name'], user_data['email'], user_id))
        mysql.connection.commit()
        cursor.close()
        return jsonify({'message': 'User updated successfully'})

    # 사용자 삭제
    @user_blp.route('/<int:user_id>', methods=['DELETE'])
    def delete_user(user_id):
        cursor = mysql.connection.cursor()
        cursor.execute("DELETE FROM users WHERE id = %s", (user_id,))
        mysql.connection.commit()
        cursor.close()
        return jsonify({'message': 'User deleted successfully'})

    return user_blp
  • GET /users: 모든 사용자 데이터를 조회합니다.
  • POST /users: 새로운 사용자를 추가합니다.
  • PUT /users/<user_id>: 특정 사용자의 데이터를 수정합니다.
  • DELETE /users/<user_id>: 특정 사용자를 삭제합니다.

🧪 3. 사용자 인터페이스 구현 (templates/users.html)

이 HTML 파일은 웹 페이지에서 사용자를 관리할 수 있는 인터페이스를 제공합니다. JavaScript를 사용하여 비동기적으로 사용자 데이터를 추가하고 수정하며 삭제할 수 있습니다.

(1) HTML 사용자 인터페이스

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Users</title>
    <script>
      function fetchUsers() {
        fetch("/users")
          .then((response) => response.json())
          .then((users) => {
            const usersList = document.getElementById("users-list");
            usersList.innerHTML = "";
            users.forEach((user) => {
              const userItem = document.createElement("li");
              userItem.textContent = `ID: ${user.id}, Name: ${user.name}, Email: ${user.email}`;
              usersList.appendChild(userItem);
            });
          })
          .catch((error) => console.error("Error:", error));
      }

      function addUser() {
        const name = document.getElementById("name").value;
        const email = document.getElementById("email").value;
        fetch("/users", {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({ name: name, email: email }),
        })
          .then((response) => response.json())
          .then((data) => {
            console.log(data);
            fetchUsers();
          })
          .catch((error) => console.error("Error:", error));
      }

      window.onload = fetchUsers;

      function updateUser() {
        const userId = document.getElementById("update-user-id").value;
        const name = document.getElementById("update-name").value;
        const email = document.getElementById("update-email").value;
        fetch(`/users/${userId}`, {
          method: "PUT",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({ name: name, email: email }),
        })
          .then((response) => response.json())
          .then((data) => {
            console.log(data);
            fetchUsers();
          })
          .catch((error) => console.error("Error:", error));
      }

      function deleteUser() {
        const userId = document.getElementById("update-user-id").value;
        fetch(`/users/${userId}`, {
          method: "DELETE",
        })
          .then((response) => response.json())
          .then((data) => {
            console.log(data);
            fetchUsers();
          })
          .catch((error) => console.error("Error:", error));
      }
    </script>
  </head>
  <body>
    <h1>Users</h1>
    <ul id="users-list"></ul>

    <h2>Add User</h2>
    <input type="text" id="name" placeholder="Name" />
    <input type="email" id="email" placeholder="Email" />
    <button onclick="addUser()">Add User</button>

    <h2>Update/Delete User</h2>
    <input type="number" id="update-user-id" placeholder="User ID" />
    <input type="text" id="update-name" placeholder="New Name" />
    <input type="email" id="update-email" placeholder="New Email" />
    <button onclick="updateUser()">Update User</button>
    <button onclick="deleteUser()">Delete User</button>
  </body>
</html>
  • 이 HTML 파일은 사용자 목록을 화면에 표시하고, 사용자를 추가, 수정, 삭제하는 기능을 제공합니다.
  • 각 기능은 JavaScript의 fetch API를 사용하여 서버와 비동기적으로 통신합니다.

✅ 마무리 요약 및 복습 포인트

  1. Flask와 MySQL 연동: flask-mysqldb를 사용하여 Flask 애플리케이션과 MySQL을 연결하고, 사용자 정보를 저장하고 조회하는 API를 구현했습니다.
  2. Blueprint 활용: Blueprint를 사용하여 사용자 관련 기능을 별도의 모듈로 관리하며, Flask 애플리케이션에 등록하였습니다.
  3. 웹 인터페이스 구현: HTML과 JavaScript를 사용하여 사용자가 웹에서 직접 데이터를 추가, 수정, 삭제할 수 있는 UI를 제공했습니다.

'Flask' 카테고리의 다른 글

Chapter 3-2 Flask-SQLAlchemy 구축(app.py)  (0) 2025.04.21
Chapter 3-1 ORM이란? Flask-SQLAlchemy란?  (0) 2025.04.21
Chapter 2-6 Flask-MySQLdb 설정 및 사용법  (0) 2025.04.18
Chapter 2-5 Flask-Smorest 활용하여 REST API 생성  (0) 2025.04.18
Chapter 2-4 Flask-Smorest 활용하여 REST API 생성  (0) 2025.04.18
'Flask' 카테고리의 다른 글
  • Chapter 3-2 Flask-SQLAlchemy 구축(app.py)
  • Chapter 3-1 ORM이란? Flask-SQLAlchemy란?
  • Chapter 2-6 Flask-MySQLdb 설정 및 사용법
  • Chapter 2-5 Flask-Smorest 활용하여 REST API 생성
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (472) N
      • Python (31)
      • 프로젝트 (43)
      • 과제 (21)
      • Database (40)
      • 멘토링 (7) N
      • 특강 (18)
      • 기술블로그 (126) N
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (34) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 2-7 Flask MySQL CRUD 애플리케이션 구현
상단으로

티스토리툴바