Python으로 MongoDB 사용

Bookshelf 가이드의 이 부분에서는 샘플 앱에서 영구 데이터를 MongoDB 데이터베이스에 저장하는 방법을 보여줍니다.

이 페이지는 여러 페이지로 구성된 가이드의 일부입니다. 처음부터 시작하여 설정 안내를 보려면 Python Bookshelf 앱으로 이동하세요.

Google Compute Engine에서 MongoDB 실행

Mongo 인스턴스를 설정하지 않은 경우, GCP의 Atlas 또는 mLab을 사용하여 Google Cloud Platform 상위에서 실행되는 관리형 인스턴스를 만들 수 있습니다. Compute Engine에서 실행되는 비관리형 MongoDB 인스턴스를 사용하려면 Bitnami의 사전 구성된 클릭하여 배포 솔루션을 확인하세요.

최적의 성능을 위해 MongoDB 인스턴스는 Google Cloud Platform에서 호스팅되고 앱과 동일한 지역에 있어야 합니다.

기본적으로 MongoDB는 통신에 포트 27017을 사용합니다. MongoDB 인스턴스를 설정한 후에 이 포트와 주고받는 트래픽을 허용하는 방화벽 규칙을 구성해야 하는 경우도 있습니다. Google Cloud Platform에서 실행되는 인스턴스에 대한 안내는 방화벽 규칙 사용을 참조하세요.

설정 구성

이 섹션에서는 2-structured-data 디렉토리의 코드를 사용합니다. 이 디렉토리에서 파일을 수정하고 명령어를 실행하세요.

  1. 수정하기 위해 config.py를 엽니다.
  2. PROJECT_ID 값을 GCP 콘솔에 표시되는 프로젝트 ID로 설정합니다.
  3. DATA_BACKEND 값을 mongodb로 설정합니다.
  4. PROJECT_ID 값을 Google Cloud Platform Console에 표시되는 프로젝트 ID로 설정합니다.
  5. MONGO_URI 값을 설정합니다. mLab을 사용하는 경우 제어판에서 URI를 사용할 수 있습니다. 이전에 설명된 대로 자체 MongoDB 클러스터를 배포한 경우 URI를 해당 섹션에서 메모해 놓은 외부 IP로 설정합니다. 외부 IP 주소는 gcloud compute instances list를 실행하여 찾을 수도 있습니다.
  6. config.py를 저장하고 닫습니다.

종속 항목 설치

다음 명령어를 입력하여 가상 환경을 만들고 종속 항목을 설치합니다.

Linux/macOS

virtualenv -p python3 env
source env/bin/activate
pip install -r requirements.txt

Windows

virtualenv -p python3 env
env\scripts\activate
pip install -r requirements.txt

로컬 머신에서 앱 실행:

  1. 로컬 웹 서버를 시작합니다.

    python main.py
    
  2. 웹브라우저에서 다음 주소를 입력합니다.

    http://localhost:8080

이제 앱의 웹페이지를 찾아보고 도서를 추가, 편집, 삭제할 수 있습니다.

작업자를 종료한 다음 로컬 웹 서버를 종료하려면 Control+C를 누르세요.

App Engine 가변형 환경에 앱 배포

  1. 샘플 앱을 배포합니다.

    gcloud app deploy
    
  2. 웹브라우저에서 다음 주소를 입력합니다. [YOUR_PROJECT_ID]를 프로젝트 ID로 바꿉니다.

    https://[YOUR_PROJECT_ID].appspot.com
    

앱을 업데이트하는 경우 앱을 처음 배포할 때 사용한 같은 명령어를 입력하여 업데이트된 버전을 배포할 수 있습니다. 새로 배포하면 앱의 새 버전을 만들고 기본 버전으로 승격합니다. 이전 버전의 앱은 연결된 VM 인스턴스와 마찬가지로 유지됩니다. 이러한 모든 앱 버전과 VM 인스턴스는 청구 가능한 리소스입니다.

기본 이외의 앱 버전을 삭제하여 비용을 줄일 수 있습니다.

앱 버전을 삭제하는 방법은 다음과 같습니다.

  1. GCP Console에서 App Engine 버전 페이지로 이동합니다.

    버전 페이지로 이동

  2. 삭제할 표준이 아닌 앱 버전 옆의 확인란을 클릭합니다.
  3. 페이지 상단의 삭제 버튼을 클릭하여 앱 버전을 삭제합니다.

청구 가능한 리소스 삭제에 대한 자세한 내용은 이 가이드의 마지막 단계에서 삭제를 참조하세요.

애플리케이션 구조

다음 다이어그램은 샘플 애플리케이션 구성요소가 서로 연결된 방식을 보여줍니다. 애플리케이션은 모든 영구 데이터를 MongoDB에 저장합니다.

Bookshelf 앱 배포 프로세스 및 구조

코드 이해하기

이 섹션에서는 애플리케이션 코드에 대해 단계별로 알아보고 이 코드의 작동 방식을 설명합니다.

양식으로 사용자 제출 처리

추가/수정 HTML 양식을 사용하면 앱 내에서 도서 제출을 추가하고 수정할 수 있습니다.

추가/수정 양식 이미지

HTML 양식은 Flask의 기본 템플릿 엔진인 Jinja2를 사용하여 작성됩니다. 다음 템플릿은 제목, 작성자, 게시 날짜, 설명에 대한 입력 필드가 있는 간단한 양식을 정의합니다.

{% extends "base.html" %}

{% block content %}
<h3>{{action}} book</h3>

<form method="POST" enctype="multipart/form-data">

  <div class="form-group">
    <label for="title">Title</label>
    <input type="text" name="title" id="title" value="{{book.title}}" class="form-control"/>
  </div>

  <div class="form-group">
    <label for="author">Author</label>
    <input type="text" name="author" id="author" value="{{book.author}}" class="form-control"/>
  </div>

  <div class="form-group">
    <label for="publishedDate">Date Published</label>
    <input type="text" name="publishedDate" id="publishedDate" value="{{book.publishedDate}}" class="form-control"/>
  </div>

  <div class="form-group">
    <label for="description">Description</label>
    <textarea name="description" id="description" class="form-control">{{book.description}}</textarea>
  </div>

  <button type="submit" class="btn btn-success">Save</button>
</form>

{% endblock %}

양식 제출 처리

사용자가 도서 추가를 클릭하면 crud.add 뷰에 양식이 표시됩니다. 사용자가 도서 추가 양식을 작성하고 저장을 클릭하면 동일 뷰에서 양식의 HTTP POST 작업이 처리됩니다. 이렇게 하면 데이터를 get_model().create 함수에 전달하여 제출된 데이터를 MongoDB로 전송하는 프로세스가 시작됩니다.

@crud.route('/add', methods=['GET', 'POST'])
def add():
    if request.method == 'POST':
        data = request.form.to_dict(flat=True)

        book = get_model().create(data)

        return redirect(url_for('.view', id=book['id']))

    return render_template("form.html", action="Add", book={})

bookshelf/model_mongodb.py 파일에는 MongoDB에 저장된 데이터에 대해 CRUD 기능을 수행하는 코드가 포함되어 있습니다. 예를 들어 get_model().create 문은 bookshelf/model_mongodb.py에서 create 함수를 호출하여 사용자 제출 데이터를 create 함수에 보냅니다. 다음은 사용자 제출 데이터를 MongoDB에 저장하는 작업을 실제로 수행하는 create 함수입니다.

def create(data):
    new_id = mongo.db.books.insert(data)
    return read(new_id)

사용자가 도서를 수정하면 update 함수가 대신 사용됩니다.

def update(data, id):
    mongo.db.books.update({'_id': _id(id)}, data)
    return read(id)

create 함수와 update 함수는 모두 read를 사용합니다. 이는 사용자가 단일 도서를 볼 때도 사용됩니다.

def read(id):
    result = mongo.db.books.find_one(_id(id))
    return from_mongo(result)

from_mongo 도우미 함수는 MongoDB 문서의 _id를 애플리케이션에서 사용할 수 있는 ID로 변환하는 데 사용됩니다.

def from_mongo(data):
    """
    Translates the MongoDB dictionary format into the format that's expected
    by the application.
    """
    if not data:
        return None

    data['id'] = str(data['_id'])
    return data

사용자가 도서를 추가한 후에 도서 링크를 클릭하면 /books 페이지로 이동하여 현재 MongoDB에 저장된 모든 도서를 나열합니다. model_mongodb.list 함수는 MongoDB에서 검색한 데이터를 사용하여 도서를 모두 나열하는 작업을 수행합니다.

def list(limit=10, cursor=None):
    cursor = int(cursor) if cursor else 0

    results = mongo.db.books.find(skip=cursor, limit=10).sort('title')
    books = builtin_list(map(from_mongo, results))

    next_page = cursor + limit if len(books) == limit else None
    return (books, next_page)

이 코드는 mongo.db.books.find를 사용하여 MongoDB를 쿼리하고 book 컬렉션에 있는 문서를 모두 가져와서 title 순으로 반환합니다. 코드는 한 번에 한 페이지씩 결과를 가져오고 사용자가 결과의 다음 페이지를 로드할 수 있도록 커서를 반환합니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...