개발자가 내팔자

[MongoDB] PyMongo MongoEngine의 차이는? (번역) 본문

WEB/Back-end

[MongoDB] PyMongo MongoEngine의 차이는? (번역)

야생의 개발자 2022. 8. 2. 01:58

이 글은 mongodb에 있는 Mongoengine Vs Pymongo를 번역한 것입니다.

 

Mongoengine Vs Pymongo | MongoDB Flask Setup | MongoDB

Learn about the differences between MongoEngine and PyMongo, and how to use both of them in a Flask application in Python.

www.mongodb.com

MongoEngine vs Pymongo with Flask

python에서 mongoDB 연결하는 법

 

Flask application을 MongoDB에 연결하려고 할 때, 몇가지 다양한 옵션들이 있다. 가장 흔한 라이브러리 두 가지는 MongoEngine과 PyMongo다. 각각의 장단점이 있다. 이 글에서는 이 둘 사이의 차이점을 조명하고, 경우에 따라 최적의 라이브러리를 고를 수 있도록 돕고자 한다.

MongoEngine(몽고엔진)이란 무엇인가?

몽고엔진은 MongoDB 데이터베이스와 연결시켜주는 라이브러리인데, 다큐먼츠(documents)를 코드 상에서 객체인 것처럼 쓸 수 있다. 이를 ODM(Object-Document Mapper)라고도 한다. 이 프로젝트의 목표는 다른 ORM(Object-Document Mapper) 라이브러리와 비슷한, MongoDB를 위한 라이브러리를 만드는 것이다.

 

이는 2015년에 처음으로 오픈 소스 프로젝트로 릴리즈되었고, 최신 버전은 MongoDB에 의한 공식 파이썬 드라이버인 PyMongo를 바탕으로 빌드되었다.

 

시작하는 사람들을 위해, MongoEngine은 광범위한 문서를 제공하고 있다.

PyMongo(파이몽고)란 무엇인가?

PyMongo는 MongoDB의 공식 Python native driver다. MongoDB 데이터베이스에 연결을 해주고, MongoDB Query API를 이용하여 저장된 데이터에 query를 할 수 있는 라이브러리다. 이는 document 데이터베이스와 상호작용 할 때 권장되는 방식이다.

 

이는 Github 오픈 소스 라이브러리이기 때문에 사용 가능하고, Python에 친숙한 package installer인 pip로도 설치가 가능하다.

 

게다가, MongoDB에 대한 방대한 문서가 있고, 커뮤니티 포럼에서 도움을 구할 수도 있다.

Flask에서 MongoEngine과 PyMongo를 쓰는 방법

Flask는 직관적인 문법으로 웹 서버를 만드는 강력한 Python micro framework다.

단순하지만 극단적으로 강력하고 모든 규모의 어플리케이션을 위해 사용될 수 있다. MongoDB Atlas 데이터베이스와 결합하여 데이터에 접근하는 API를 만드는 것이 쉽다.

 

Flask로 MongoEngine과 PyMongo를 사용하는 방법을 증명하기 위해, 여기에 두 개의 route와 두 개의 라이브러리가 모두 들어있는 간단한 웹 서버 코드가 있다.

 

이 예제에서는 /create route에서 유저를 랜덤한 이름으로 추가한다. 랜덤 이름은 names 라는 패키지에서 생성된다. /list route는 데이터베이스에서 모든 유저들을 가져와서 그것을 리스팅한다. 브라우저로 두 route에 접근할 수 있다.

Project setup (프로젝트 준비)

우선, 필요한 패키지들을 설치하며 시작하자.

python -m pip install flask mongoengine pymongo[srv] names

그리고 나서 아래의 예제 코드를 포함하는 파일을 생성하고, FLASK_APP 환경 변수를 설정 저 파일과 맞게 설정하고, flask CLI(Command Line Interface) 툴을 이용하여 서버를 시작한다.

touch main.py
export FLASK_APP=main
python -m flask run

Note: 최신 코드를 반영한 서버를 돌리기 위해 main.py 코드를 변경할 때 마다 Ctrl+C를 누르고 명령어를 다시 실행해야 할 필요가 있을 것이다. (역자 : 수정할 때마다 재시작 하라는 뜻. watchdog을 설치하면 이런 번거로운 짓을 할 필요가 없다.)

 

한 번 서버가 실행되고 나면, 브라우저를 열어서 http://127.0.0.1:5000/create 에서 새로운 엔트리를 데이터베이스에 추가할 수 있고, http://127.0.0.1:5000/list에서 users collections으로부터 모든 documents들을 리스트로 가져올 수 있다.

 

Github Repository에서 두 개의 파일을 볼 수 있다.

MongoEngine with Flask

MongoEngine에서는, connect 메서드로 Atlas에 의해 제공되는 connection string을 입력하면 데이터베이스 연결이 끝난다. 그리고 나서, User 객체가 생성될 것이다. 이 객체는 user의 name을 가지는 단 하나의 필드를 가지고 있다. Flask route에서 이 객체가 데이터베이스에서 유저가 create 되거나 유저를 리스팅할 때 사용되는 것을 볼 수 있다.

from flask import Flask
from mongoengine import *
import names

app = Flask(__name__)

connect(host="<CONNECTION_STRING>/flask_example_db")

class User(Document):
    name = StringField()

@app.route("/create")
def add_user():
    new_user = User(name=names.get_full_name())
    new_user.save()
    return str(new_user.id)

@app.route("/list")
def get_user():
    return User.objects.to_json()

PyMongo with Flask

PyMongo로는, Atlas에 의해 제공되는 connection string을 이용하여 데이터베이스에 연결하기 위해 클라이언트가 처음에 생성된다. 그러고 나서, 친숙한 MongoDB Query API가 데이터베이스로부터 생성되고 가져오는 것에 사용된다. 이 예제에서 새로운 객체 id들은 변환이 필요하다는 것을 눈치챌 필요가 있다.

 

그 이유는 PyMongo는 JSON 형식을 추상화하기 보다는 BSON 형식을 이용하기 때문이다.

from pymongo import MongoClient
from flask import Flask
from bson.json_util import dumps
import names

app = Flask(__name__)

client = MongoClient("<CONNECTION_STRING>")
db = client.flask_example_db

@app.route("/create")
def add_user():
  result = db.users.insert_one({"name": names.get_full_name()})
  return str(result.inserted_id)

@app.route("/list")
def get_user():
  users = list(db.users.find({}))
  return dumps(users)

MongoEngine과 PyMongo를 어떻게 비교하는가?

두 라이브러리 모두 다른 feature를 제공한다. MongoEngine은 데이터베이스를 연결하기 위해 PyMongo를 뒤에서 몰래 사용한다. 이는 SQLAlchemy 또는 다른 비슷한 ORM을 이용하여 일하는 것에 익숙한 개발자들을 위해 쉬운 접근성을 의도한 것이다. 이것은 소프트웨어 엔지니어가 처음으로 MongoDB와 그것의 document 모델을 만났을 때 러닝커브를 줄여준다. 그러나, MongoEngine을 이용하는 것은 잘못 사용 되었을 땐 부가적인 비용(cost)을 만나게 될 수 있다.

 

PyMongo는 MongoDB를 위한 공식 native 드라이버이다. 이것은 모든 MongoDB Query API의 기능을 포함한다. 이것은 데이터베이스에서 CRUD(Create-Read-Update-Delete) 연산을 수행하는 강력한 방법이고, aggregation 파이프라인을 구축하는 쉬운 방법을 제공한다.

 

PyMongo를 이러한 파이프라인의 힘을 활용하여 직접적으로 쓸 때는, 개발자들은 데이터베이스의 잠재력을 최대치까지 쓸 수 있다. PyMongo를 이용하면 PyMongo의 batch 커맨드를 사용하는 대신 for 반복문 안에서 ORM을 쓰는 등의 성능 이슈를 유발하는 몇 가지 나쁜 습관 또한 피할 수 있을 것이다.

Summary

PyMongo와 MongoEngine은 모두 MongoDB 데이터베이스로부터 데이터에 접근하기 위해 사용된다.

 

그러나, 이들은 아주 다른 방법으로 다른 feature를 제공한다. PyMongo는 MongoDB 추천 라이브러리이다. 이것은 MongoDB document를 사용하기 쉽게 만들어주고, 친숙한 MongoDB 쿼리 언어에 직접적으로 맵핑해준다. 만약 mongosh 같은 툴을 과거에 써봤다면, 문법은 매우 친숙할 것이다.

 

PyMongo를 쓰면 aggregation pipelinesAtlas Search 같은 친숙한 문법에 더해, Atlas에 의해 제공되는 모든 진보된 feature들을 사용할 수 있을 것이다.

 

Comments