본문 바로가기

Study Information Technology

Flask로 사용자 정보 데이터베이스를 관리하는 RESTful API 설계

728x90
반응형

Flask로 사용자 정보 데이터베이스를 관리하는 RESTful API 설계

Overview

Flask는 Python으로 작성된 마이크로 웹 프레임워크로, RESTful API를 설계하고 구현하기에 매우 적합합니다. Flask는 간결하고 유연한 구조를 제공하여, API를 빠르고 효율적으로 만들 수 있도록 돕습니다. 이번 설명에서는 Flask를 사용하여 사용자 정보 데이터베이스를 관리하는 RESTful API를 설계하는 방법을 자세히 다루겠습니다.

1. 프로젝트 설정

1.1. 가상 환경 설정

프로젝트를 시작하기 전에 가상 환경을 설정하는 것이 좋습니다. 이는 프로젝트의 종속성을 관리하고, 다른 프로젝트와의 충돌을 방지하는 데 도움이 됩니다.

python -m venv venv
source venv/bin/activate  # Unix/MacOS
venv\Scripts\activate     # Windows

1.2. 필요한 패키지 설치

Flask와 Flask-SQLAlchemy는 데이터베이스 작업을 쉽게 해주는 패키지입니다. 이들을 설치합니다.

pip install Flask Flask-SQLAlchemy

2. Flask 애플리케이션 설정

2.1. 기본 Flask 애플리케이션 생성

app.py라는 파일을 생성하고, 기본 Flask 애플리케이션을 설정합니다.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

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

이 코드는 Flask 애플리케이션을 생성하고, 기본적인 "Hello, World!" 라우트를 정의합니다. debug=True는 코드 변경 시 자동으로 서버를 재시작하도록 도와줍니다.

2.2. 데이터베이스 설정

Flask-SQLAlchemy를 사용하여 데이터베이스를 설정합니다. app.py에 데이터베이스 설정을 추가합니다.

from flask_sqlalchemy import SQLAlchemy

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

여기서는 SQLite 데이터베이스를 사용합니다. sqlite:///users.db는 현재 디렉토리에 users.db라는 파일을 생성하여 데이터베이스를 관리합니다.

3. 데이터베이스 모델 정의

3.1. 사용자 모델 정의

사용자 정보를 저장할 모델을 정의합니다. models.py라는 파일을 생성하고 다음과 같이 작성합니다.

from app import db

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)

def __repr__(self):
return f'<User {self.username}>'

User 클래스는 사용자 정보를 나타내며, id, username, email 필드를 갖습니다. id는 기본 키로 설정되어 있습니다.

3.2. 데이터베이스 생성

데이터베이스와 테이블을 생성하려면, Flask 쉘을 사용하여 다음 명령어를 실행합니다.

python
from app import db
db.create_all()

이 명령어는 정의된 모델을 기반으로 데이터베이스와 테이블을 생성합니다.

4. RESTful API 엔드포인트 구현

4.1. 사용자 생성 API

사용자를 생성할 수 있는 엔드포인트를 추가합니다. app.py에 다음과 같이 작성합니다.

from flask import request, jsonify
from models import User

@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
username = data.get('username')
email = data.get('email')

if not username or not email:
return jsonify({'message': 'Username and email are required'}), 400

if User.query.filter_by(username=username).first():
return jsonify({'message': 'User already exists'}), 400

user = User(username=username, email=email)
db.session.add(user)
db.session.commit()

return jsonify({'id': user.id, 'username': user.username, 'email': user.email}), 201

여기서는 POST 요청을 통해 사용자 정보를 생성하고, 이미 존재하는 사용자가 있는지 확인합니다. 만약 존재하면 400 상태 코드를 반환합니다.

4.2. 사용자 조회 API

특정 사용자의 정보를 조회할 수 있는 엔드포인트를 추가합니다.

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

이 엔드포인트는 GET 요청을 통해 특정 사용자의 정보를 조회합니다. 사용자가 존재하지 않으면 404 상태 코드를 반환합니다.

4.3. 사용자 목록 조회 API

모든 사용자 정보를 조회할 수 있는 엔드포인트를 추가합니다.

@app.route('/users', methods=['GET'])
def get_users():
users = User.query.all()
return jsonify([{'id': user.id, 'username': user.username, 'email': user.email} for user in users])

이 엔드포인트는 GET 요청을 통해 모든 사용자 정보를 반환합니다.

4.4. 사용자 수정 API

사용자 정보를 수정할 수 있는 엔드포인트를 추가합니다.

@app.route('/users/<int:id>', methods=['PUT'])
def update_user(id):
data = request.get_json()
user = User.query.get_or_404(id)

if 'username' in data:
user.username = data['username']
if 'email' in data:
user.email = data['email']

db.session.commit()

return jsonify({'id': user.id, 'username': user.username, 'email': user.email})

이 엔드포인트는 PUT 요청을 통해 사용자의 정보를 수정합니다. 수정할 필드를 JSON 데이터로 전달합니다.

4.5. 사용자 삭제 API

사용자를 삭제할 수 있는 엔드포인트를 추가합니다.

@app.route('/users/<int:id>', methods=['DELETE'])
def delete_user(id):
user = User.query.get_or_404(id)
db.session.delete(user)
db.session.commit()

return jsonify({'message': 'User deleted successfully'})

이 엔드포인트는 DELETE 요청을 통해 사용자를 삭제합니다. 삭제된 후에는 성공 메시지를 반환합니다.

5. 에러 처리

API 개발 중에 발생할 수 있는 다양한 에러를 처리하는 것도 중요합니다. Flask에서는 @app.errorhandler 데코레이터를 사용하여 사용자 정의 에러 핸들러를 추가할 수 있습니다.

@app.errorhandler(404)
def not_found_error(error):
return jsonify({'message': 'Not found'}), 404

@app.errorhandler(500)
def internal_error(error):
return jsonify({'message': 'Internal server error'}), 500

이 코드는 404와 500 에러에 대해 사용자 정의 메시지를 반환합니다.

6. 테스트

작성한 API를 테스트하여 예상대로 동작하는지 확인합니다. Postman과 같은 도구를 사용하거나, Python의 requests 라이브러리를 사용할 수 있습니다.

6.1. Postman 사용하기

Postman을 통해 각 엔드포인트를 테스트합니다. POST, GET, PUT, DELETE 요청을 통해 API의 모든 기능을 검증합니다.

6.2. Python requests 라이브러리로 테스트하기

테스트 스크립트를 작성하여 API를 자동으로 테스트할 수 있습니다.

import requests

# 사용자 생성
response = requests.post('http://127.0.0.1:5000/users', json={'username': 'testuser', 'email': 'test@example.com'})
print(response.json())

# 사용자 조회
response = requests.get('http://127.0.0.1:5000/users/1')
print(response.json())

# 사용자 수정
response = requests.put('http://127.0.0.1:5000/users/1', json={'username': 'updateduser'})
print(response.json())

# 사용자 삭제
response = requests.delete('http://127.0.0.1:5000/users/1')
print(response.json())

이 스크립트는 API 엔드포인트를 호출하여 응답을 출력합니다.

참고문서

  1. Flask 공식 문서
  2. Flask-SQLAlchemy 문서
  3. SQLite 공식 문서
  4. HTTP 상태 코드 목록
반응형