RESTful API와 PyMongo 통합 방법

RESTful API와 PyMongo 통합 방법

Python
Flask
Pymongo
RESTful API와 PyMongo 통합 방법
Author

gabriel yang

Published

October 8, 2024


RESTful API와 PyMongo 통합 방법

RESTful API는 웹 애플리케이션에서 자원을 생성, 읽기, 업데이트, 삭제(CRUD)하는 데 사용되는 HTTP 요청 방식을 따르는 아키텍처 스타일입니다. MongoDB는 NoSQL 데이터베이스로, 이를 Python에서 다루기 위해 PyMongo를 사용합니다. 이 글에서는 Flask 프레임워크와 PyMongo를 사용해 RESTful API와 MongoDB를 통합하는 방법을 단계별로 설명하겠습니다.

1. 필요한 라이브러리 설치

우선, Flask와 PyMongo를 설치해야 합니다. Flask는 Python의 마이크로 웹 프레임워크이고, PyMongo는 MongoDB와 상호작용할 수 있는 라이브러리입니다.

pip install Flask
pip install pymongo

이 외에도 요청(Request)과 응답(Response)을 처리하기 위한 Flask-RESTful 라이브러리를 사용할 수 있습니다.

pip install Flask-RESTful

2. Flask 애플리케이션 설정

Flask 애플리케이션을 설정하는 기본적인 구조는 아래와 같습니다. 이를 통해 간단한 웹 서버를 만들 수 있습니다.

from flask import Flask, jsonify, request
from flask_pymongo import PyMongo

app = Flask(__name__)

# MongoDB 설정
app.config["MONGO_URI"] = "mongodb://localhost:27017/mydatabase"
mongo = PyMongo(app)

@app.route('/')
def index():
    return "Welcome to the Flask-PyMongo API!"

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

위 코드에서 MONGO_URI는 MongoDB 서버의 주소를 설정하는 부분입니다. MongoDB는 기본적으로 localhost:27017에서 실행되며, mydatabase는 사용할 데이터베이스 이름입니다.

3. 데이터 생성 (POST 요청)

RESTful API에서 데이터를 생성하는 것은 HTTP POST 요청을 사용하여 수행됩니다. 사용자가 요청한 데이터를 MongoDB에 저장하는 예시는 다음과 같습니다.

@app.route('/add', methods=['POST'])
def add_user():
    user_data = request.get_json()  # JSON 데이터 받기
    name = user_data.get('name')
    email = user_data.get('email')

    if name and email:
        mongo.db.users.insert_one({'name': name, 'email': email})
        return jsonify({'message': 'User added successfully!'}), 201
    else:
        return jsonify({'error': 'Missing data!'}), 400
  • request.get_json()을 통해 클라이언트로부터 JSON 데이터를 받습니다.
  • 받은 데이터를 MongoDB의 users 컬렉션에 삽입합니다.
  • 성공적으로 데이터를 삽입한 경우, 201 상태 코드를 반환합니다.

4. 데이터 읽기 (GET 요청)

HTTP GET 요청을 사용하여 MongoDB에서 데이터를 읽는 방법을 구현합니다. 모든 사용자의 데이터를 가져오는 API는 다음과 같습니다.

@app.route('/users', methods=['GET'])
def get_users():
    users = mongo.db.users.find()
    user_list = []
    for user in users:
        user_list.append({'name': user['name'], 'email': user['email']})

    return jsonify(user_list), 200
  • mongo.db.users.find()를 사용해 users 컬렉션의 모든 데이터를 검색합니다.
  • 검색된 데이터를 JSON 형식으로 변환하여 클라이언트에게 반환합니다.

5. 데이터 업데이트 (PUT 요청)

데이터를 업데이트하는 것은 HTTP PUT 요청을 사용하여 이루어집니다. 예를 들어, 특정 사용자의 이메일을 업데이트하는 API는 다음과 같습니다.

@app.route('/update/<user_id>', methods=['PUT'])
def update_user(user_id):
    user_data = request.get_json()
    new_email = user_data.get('email')

    if new_email:
        mongo.db.users.update_one({'_id': ObjectId(user_id)}, {'$set': {'email': new_email}})
        return jsonify({'message': 'User updated successfully!'}), 200
    else:
        return jsonify({'error': 'Missing email!'}), 400
  • update_one을 사용해 특정 사용자의 이메일 필드를 업데이트합니다.
  • ObjectId는 MongoDB의 고유한 _id 필드를 처리하기 위한 유틸리티입니다.

6. 데이터 삭제 (DELETE 요청)

HTTP DELETE 요청을 사용하여 데이터를 삭제할 수 있습니다. 특정 사용자를 삭제하는 API는 다음과 같이 구현할 수 있습니다.

@app.route('/delete/<user_id>', methods=['DELETE'])
def delete_user(user_id):
    mongo.db.users.delete_one({'_id': ObjectId(user_id)})
    return jsonify({'message': 'User deleted successfully!'}), 200
  • delete_one을 사용해 MongoDB에서 특정 _id를 가진 문서를 삭제합니다.

RESTful API와 MongoDB 통합 작업 요약

  1. Flask로 API 구축: Flask를 사용해 간단한 API 서버를 설정하고 각 엔드포인트에 대해 CRUD 작업을 정의합니다.
  2. PyMongo를 사용해 MongoDB와 연결: Flask에서 PyMongo 라이브러리를 사용해 MongoDB와의 연결을 설정하고, 데이터를 저장하고 관리합니다.
  3. CRUD 작업 구현: RESTful API의 기본인 CRUD 작업(생성, 읽기, 업데이트, 삭제)을 각각 POST, GET, PUT, DELETE 요청으로 구현합니다.

최종 코드 예시

from flask import Flask, jsonify, request
from flask_pymongo import PyMongo
from bson.objectid import ObjectId

app = Flask(__name__)

app.config["MONGO_URI"] = "mongodb://localhost:27017/mydatabase"
mongo = PyMongo(app)

@app.route('/')
def index():
    return "Welcome to the Flask-PyMongo API!"

@app.route('/add', methods=['POST'])
def add_user():
    user_data = request.get_json()
    name = user_data.get('name')
    email = user_data.get('email')
    if name and email:
        mongo.db.users.insert_one({'name': name, 'email': email})
        return jsonify({'message': 'User added successfully!'}), 201
    else:
        return jsonify({'error': 'Missing data!'}), 400

@app.route('/users', methods=['GET'])
def get_users():
    users = mongo.db.users.find()
    user_list = [{'name': user['name'], 'email': user['email']} for user in users]
    return jsonify(user_list), 200

@app.route('/update/<user_id>', methods=['PUT'])
def update_user(user_id):
    user_data = request.get_json()
    new_email = user_data.get('email')
    if new_email:
        mongo.db.users.update_one({'_id': ObjectId(user_id)}, {'$set': {'email': new_email}})
        return jsonify({'message': 'User updated successfully!'}), 200
    else:
        return jsonify({'error': 'Missing email!'}), 400

@app.route('/delete/<user_id>', methods=['DELETE'])
def delete_user(user_id):
    mongo.db.users.delete_one({'_id': ObjectId(user_id)})
    return jsonify({'message': 'User deleted successfully!'}), 200

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