Open dasd412 opened 1 year ago
커넥션을 클래스에서 관리하고, logger를 호출할 때마다 그 logger의 이름을 이용해서 커넥션의 collection_name과 db_name을 매번 설정해 주는 식으로 해결할 수도 있을 것 같습니다.
한 명의 User의 호출에 대해서 3개의 커넥션을 만드는 것은 너무 큰 낭비가 맞으니 위처럼 해결하고, 여러 사람이 여러 커넥션을 사용하는 것은 MongoDB의 풀링 기능을 이용하면 될 것 같습니다.
자세한 내용은 좀 더 리서치를 해봐야 할 것 같습니다.
flask_pymongo
와 flask-mongoengine
은 모두 Flask와 MongoDB를 통합하는 확장 패키지지만, 목적과 사용 방식에는 몇 가지 차이점이 있습니다.
두 확장 패키지 중 어떤 것을 선택할지는 프로젝트의 요구 사항과 개발자의 선호에 따라 결정됩니다.
flask_pymongo
를 사용하여 MongoClient를 관리하면 Flask 애플리케이션과의 통합이 간단해지고, 직접 MongoClient를 관리하는 것보다 여러 가지 편리한 기능을 제공받을 수 있습니다. 아래에 주요 차이점을 정리하겠습니다.
flask_pymongo, flask_mongoengine에 대한 예시가 있는데 flask_mongoengine은 스프링에서 ORM처럼 ODM(Object-Document Mapper)을 기반으로 해서 @Entity
처럼 document modeling을 위한 클래스를 추가해야 하는 것으로 보입니다.
아래 예시를 보면 좀 더 이해가 쉬울 것 같습니다.
from flask import Flask
from flask_pymongo import PyMongo
app = Flask(__name__)
app.config['MONGO_URI'] = 'mongodb://localhost:27017/myDatabase'
mongo = PyMongo(app)
@app.route('/add_user')
def add_user():
users = mongo.db.users
users.insert_one({'name': 'John', 'age': 30})
return 'User added.'
@app.route('/get_user')
def get_user():
users = mongo.db.users
user = users.find_one({'name': 'John'})
return f"User: {user['name']} Age: {user['age']}"
from flask import Flask
from flask_mongoengine import MongoEngine
app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
'db': 'myDatabase',
'host': 'localhost',
'port': 27017
}
db = MongoEngine(app)
class User(db.Document):
name = db.StringField()
age = db.IntField()
@app.route('/add_user')
def add_user():
user = User(name='John', age=30)
user.save()
return 'User added.'
@app.route('/get_user')
def get_user():
user = User.objects(name='John').first()
return f"User: {user.name} Age: {user.age}"
커넥션 풀링 기능이나 MongoClient 관리는 직접 구현하기보다 이미 구현된 기능을 활용하는 것이 훨씬 좋을 것으로 판단해서
flask_pymongo나 flask_mongoengine을 이용해서 MongoClient를 만들어서(flask_pymongo의 mongo = PyMongo(app)
, flask_mongoengine의 db = MongoEngine(app)
) MongoHandler에서도 가져다 쓰고, 그 외에도 DB에 데이터를 저장하는 것과 같이 활용하면 될 것 같습니다.
에서 언급된 내용 업데이트.
다음 코드에서 핸들러가 생성될 때마다 MongoClient에서 db 커넥션을 맺고 있습니다. 이는 불필요한 리소스 낭비일 수 있습니다. 특히 로거 만들때마다 커넥션 맺으면 굉장한 낭비가 될 수 있습니다. 해당 핸들러를 싱글톤으로 만들 수 있는지 확인바랍니다.