Flask 1. Flask & MongoDB(feat. Atlas)

jiffydev·2020년 11월 24일
0

들어가기 전에..

필자는 플라스크를 처음 시작하면서 강제로 MongoDB를 써야 했다. 그런데 윈도우충인 필자는 여태까지 wsl로 MySQL을 수많은 에러와 함께 어떻게든 돌려온 전적이 있다. 그래서 이번에도 MongoDB를 wsl로 돌리려고 구글 검색을 해봤는데, 에러 관련 글만 수두룩하게 올라오는 것이었다.
그래도 성공했다는 글이 없지는 않아서 최대한 따라해 봤지만 약 3시간가량 에러와의 사투를 벌여야 했다. 그리고 결정타로 MongoDB에서 wsl을 지원하지 않는다는 말이 있어서 그냥 깔끔하게 포기하고 다른 방법을 찾았다. 그래서 나온 방법이 직접 MongoDB 실행 파일을 설치해서 쓰거나, 클라우드 방식의 데이터베이스를 사용하는 방법이 있었다. 설치하기가 귀찮아서 클라우드(Atlas)로 이용해봤는데, 생각보다 나쁘지 않아 글을 올리게 되었다.

1. Flask

우선은 플라스크와 MongoDB가 무엇인지 알아보고자 한다. 플라스크는 파이썬을 기반으로 한 웹 프레임워크 중 하나이다. 보통 장고와 플라스크 두 개가 가장 파이썬 기반 프레임워크 중에서는 가장 유명한 듯한데, 필자가 둘을 아주 짧게 경험하고 느낀 바로는 장고는 친절하게 하나하나 알려주는 선생님인 반면, 플라스크는 자유방임형 선생님이라고 할 수 있을 것 같다. 장고는 친절함이 지나쳐서 내가 컨트롤 할 수 있는 영역이 많지 않고, 플라스크는 지나치게 자유로워서 뭐부터 시작해야 할지 모르겠다는 점이 특징이다.
여튼, 플라스크는 '마이크로' 프레임워크이다. 플라스크 자체로는 최소한의 영역만 담당하고, 나머지는 개발자가 자신이 원하는 도구를 사용해서 개발을 진행할 수 있다. 그렇기에 내가 실력만 있다면 엄청나게 효율적으로 구현할 수 있다.

2. MongoDB


MySQL이 관계형 데이터베이스의 수장이라면 MongoDB는 비관계형 데이터베이스의 수장이라 할 수 있을 것이다. 실제로 DB-Engines Ranking에서도 MongoDB는 비관계형 데이터베이스 중 가장 높은 순위에 있다.

관계형 데이터베이스와 비교해서 가장 비교될 만한 점을 몇 가지 꼽아보면,
1. schema-less: 자료 간의 관계가 없어 수정과 삭제가 자유롭다.
2. JOIN이 없는 대신 연관된 자료들을 쿼리 한 번에 모아서 가져올 수 있다. 그래서 다른 테이블을 참조할 필요가 없으니 속도가 빠르고, 직관적이다.
3. 확장성이 뛰어나고 sharding(분할 저장) 클러스터 구축도 가능하다.

3. Atlas

MongoDB를 wsl에서 쓰려면 매우매우 어렵지만 Atlas로 쓰면 너무너무 쉽다.
홈페이지에서 회원가입한 후 시작하면 대시보드 같은 곳으로 가고, 거기서 새로운 프로젝트를 생성하면 된다. 프로젝트를 생성하면 클러스터를 만드는데, 이 때 지역을 free tier available로 하고 플랜을 선택할 때는 Sandbox로 선택해야 돈이 안나간다. 클러스터를 생성하고 안에 들어가서 collections를 선택하면 아무 것도 없을 것이다. collection은 관계형 데이터베이스에서 table과 같은 개념이다.


오른쪽 위에 보면 connect가 있는데 여기서 설정을 하고 uri를 사용해야 내 프로젝트와 데이터베이스가 연결이 된다.
들어가서 connect your application 을 선택하면 추가 설치 없이 uri를 주니 복사해서 사용하면 된다. 그리고 처음 설정이므로 관리자를 생성해야 하는데 이것도 하라는 대로 하면 큰 문제 없이 생성이 가능하다. uri에 mongodb+srv://<username>:<password>@cluster0.g3llr.mongodb.net/<dbname>?retryWrites=true&w=majority 처럼 유저id와 비밀번호를 넣어야 하니 잘 기억해두자.
다시 collections로 돌아가서 데이터베이스를 생성해 주고 uri의 dbname도 생성한 데이터베이스의 이름으로 바꾸어 준다.
이제 실제로 코드를 작성해서 데이터를 넣어주기만 하면 끝이다.

4. 연결

pip install pymongo dnspython으로 필요한 모듈을 설치하고, 가장 처음에 실행되는 app.py를 생성해 다음과 같이 설정해준다.

from flask import Flask
from flask_pymongo import PyMongo

def create_app():
    app=Flask(__name__)
    app.config['MONGO_URI']=<MONGO_URI>
    mongo=PyMongo()
    mongo.init_app(app)
    return app

설정 후 데이터베이스에 CRUD를 할 때는 다음과 같이 사용한다

from flask_pymongo import PyMongo
mongo=PyMongo()

@main.route('/')
def index():
    todos_collection=mongo.db.todos
    todos=todos_collection.find()
    return render_template('index.html', todos=todos)

todos_collection=mongo.db.todos이 데이터베이스에서 todos테이블을 찾아 할당하는 과정이다. 주의할 점은 이 할당을 route 밖에서 하면 db를 못찾으니 항상 함수 안에서 사용해야 한다는 점이다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글