※때에 따라서 해당 웹 페이지의 인터페이스 디자인이 조금씩 변하므로,
조회하시는 시간과 본 포스트 작성의 시간적 격차가 있는 경우
해당 설명과 상이한 부분이 있을 수 있습니다!
※ 참고자료 ※
PyMongo 4.8.0 Documentation Reference Link
https://pymongo.readthedocs.io/en/stable/index.html
반갑습니다!
저번 포스트에 MongoDB 구조에 대해서 조금 살펴봤었죠 ^^
NoSQL의 여러 유형들 중에서 Documents 형식에 해당하는 제품이 바로 MongoDB였습니다!
이번 포스트부터는 본격적으로 해당 데이터베이스에 접근해서 CRUD 하는 작업을 알아보겠습니다 ^.^!
저는 Flask를 이용하므로 Python에 해당하는 코드로 진행하겠습니다!
다른 언어에 대한 코드는 공식 문서 및 클러스터 생성시 안내해주니 참고 부탁드립니다~^^!
일단 본격적으로 포스팅에 들어가기에 앞서서..^^
제가 기존 가상환경을 Python 3.10 버전을 사용하고 있었더래서,
클러스터를 생성할 때 그나마 고를 수 있는 선택지가 pymongo == 3.6 or later였습니다
새로운 데이터베이스와의 만남으로 설렘을 가득 안고
pip install pymongo[srv]==3.6을 날렸으나 버전 문제가 발생을 하더군요 ^^;;
보시는 바와 같이 ERROR 메세지 중에서 "... dependency comflicts. ..."라는 무서운 메세지가 나타났었습니다
일단 email_validator 라이브러리를를 포기해야 하나 싶었는데
flask run을 통해서 플라스크 서버를 실행시키려니 여러 충돌 문제를 비롯한 버전 문제에 봉착했습니다.. ^^;
고통의 굴레에 빠졌다가 컴퓨터의 이야기를 경청하기로 했습니다
제가 AWS Lambda 때문에 파이썬 3.10 버전을 사용하는 중이었는데,
람다에서 23년 12월부터 파이썬 3.12 버전을 지원한다는 정보를
지금에서야 확인하고 일단 가상환경을 다시 만들었습니다
혹시나 버전 충돌 문제가 발생하는 분이 계시다면
웬만하면 마음 편하게 최신 버전으로 하시는 것을 추천드립니다 ^.^;;
※참고※
MongoDB Atlas에 연결하기 위한 내용들이 공식 Documents에 다양하게 명시되어 있는데요 ^^!
참고 삼으실 수 있도록 링크 첨부하겠습니다
https://www.mongodb.com/ko-kr/docs/languages/python/pymongo-driver/current/connect/
일단 준비 사항이 필요한데요
공식 홈페이지 접속부터 한 번 하고 천천히 진행해보겠습니다!
홈페이지에 접속하셔서 우측 상단의 Sign in을 눌러서 로그인해주세요 ^.^!
편의를 위해 공식 홈페이지 링크 첨부하겠습니다
①영문
MongoDB: The Developer Data Platform
Get your ideas to market faster with a developer data platform built on the leading modern database. MongoDB makes working with data easy.
www.mongodb.com
②국문
MongoDB: 개발자 데이터 플랫폼
업계 최고의 최신 데이터베이스를 토대로 구축된 개발자 데이터 플랫폼을 사용해 아이디어를 더욱 빠르게 실현하세요. 공통 쿼리 인터페이스와 개발자들이 원하는 데이터 모델을 사용하는 동
www.mongodb.com
콘솔 화면에 접속하셔서 좌측 메뉴들 중 SECURITY 부분에서
Database Access와 Network Access가 오늘 우리의 관심사가 되겠습니다 ^^
Database Access부터 들어가볼까요?
그럼 데이터베이스 유저 항목에 본인 한 명만 표시되어 있는 것을 보실 수 있습니다!
Role은 admin이고 All Resources로 설정 되어 있죠^^
필요한 준비물은 User Name과 Password인데요
회원 가입 과정에서 해당 정보를 잘 복사해서 관리하고 계시다면 전혀 문제될 부분이 없지만,
혹여나 패스워드를 분실한 경우에는 어찌할까요..^^?
또는 모종의 이유로 비밀번호가 노출되어 보안 관리에 문제가 생겼다면 어떻게 할까요?!
우측의 Actions 부분에서 EDIT을 클릭해주세요 ^^!
그럼 이렇게 해당 유저에 대한 정보를 수정할 수 있는 창이 나오는데요
제일 먼저 인증 방법(Authentication Method)을 선택할 수 있는 란이 있네요
그 밑에 보면 Password Authentication이라는 부분이 있는데
여기서 "Edit Password"를 눌러주세요 ^^!
그럼 하단에 Enter new password라는 입력 폼이 하나 더 생기고
그 밑에 Autogenerate Secure Password 버튼이 나오는데요!
여기서 원하시는 임의의 패스워드를 직접 입력하셔도 되고,
Autogenerate Secure Password를 클릭해서 임의의 랜덤한 문자열을 생성하셔도 됩니다^^
문자열을 보고 싶으시면 입력폼 우측의 SHOW를 누르시면 되구요!
비밀번호를 다 입력하시고 스크롤을 하단으로 내리시면 Role을 설정하실 수 있는 메뉴가 있는데요
저는 무료 사용자라서 추가로 설정할 수 있는 것들이 없습니다 ^.^;;
우측 하단의 Update User 버튼을 눌러서 설정을 마쳐주세요 ^^!
그리고 아까 Database Access 바로 밑에
Network Access 메뉴를 눌러주세요 ^^
이름 그대로 네트워크 접근에 대해서 설정할 수 있는데요
①IP Address 방식 ②Peering 방식 ③End-point 방식 세 가지를 지원합니다!
저는 간단하게 IP Address로 접근을 하겠는데요
상기 이미지를 보시는 바와 같이 해당 데이터베이스에 접근할 수 있는 IP를 지정할 수 있습니다
마치 AWS IAM 사용자 보안그룹 인바운드 규칙 설정 느낌이죠? ^^
기본적으로는 클러스터를 생성하실 당시의 현재 IP Address로 등록이 되어 있을겁니다!
추가로 등록하고 싶으시다면,
우측 상단의 "ADD IP ADDRESS"를 클릭해서 등록을 해주시면 됩니다 ^.^!!
저는 자택에서 접근할 때도 있고, 외부에서 접근할 때 있기 때문에
개발 편의상 임의로 모든 IP Address(0.0.0.0/0)를 추가로 설정했습니다^^
이제 Flask를 이용해서 코드로 시험을 해보겠습니다!
먼저 "pymongo"라는 라이브러리를 이용하는데요
pip install pymongo 명령어를 이용해서 설치해주시고,
위와 같이 import 해주시면 되겠습니다 ^^!
flask_restful을 이용해서 API 서버로 개발하는 중인데요 ^^
테스트를 위해서 임의로 리소스를 정의했습니다
주요 흐름은
①클라이언트 객체를 생성한다
client = pymongo.MongoClient(URI)
※저는 Config 파일에 변수로 저장해놓고 호출해서 파라미터로 넣어줬습니다^^
②데이터베이스 ~ 컬렉션 변수를 만든다
database = client["임의의 데이터베이스 이름"]
collection = database["임의의 컬렉션 이름"]
③컬렉션에 집어넣을 도큐먼트를 만든다
sample_documents = { "key" : "value" }
④함수 사용
collection.insert_one(방금 만든 도큐먼트)
⑤자원 해제
client.close()
와 같습니다 ^.^
여기서 중요한건 URI 가 되겠습니다!
URI는
"mongodb+srv://유저네임:비밀번호@클러스터이름.ls6keuz.mongodb.net/
?retryWrites=true&w=majority&appName=클러스터이름"
의 형식입니다
그래서 아까 유저 네임, 비밀번호를 살펴보았었습니다!
회원 가입 및 클러스터 생성 단계에서 안내해주는 정보들을 잘 관리하셨다면 위의 URI 주소도
잘 복사해두셨기 때문에 바로 사용 가능하셨을겁니다^.^!
참고로 insert_one()과 insert_many() 두 종류의 인풋 함수가 있는데
이번 포스트에서는 insert_one()만 사용했습니다!^^
API Request를 발생시켜서 해당 코드가 잘 반응하는지 한 번 POSTMAN으로 테스트를 해볼까요?
로컬 환경에서 테스트를 한 번 해봤는데요
별도의 Return 메세지를 구성하지 않았기 때문에 Response message가 null입니다만
오류 메세지가 발생하지 않았고, 또한 HTTP Status 코드를 보니 200이므로 정상 작동했음을 알 수 있겠습니다 ^.^!
진짜 데이터베이스에 잘 들어갔는지도 한 번 확인해보겠습니다!
데이터베이스 이름을 "project-server"로 했었고
컬렉션 이름을 "sessions"으로 했었습니다
해당 데이터베이스와 컬렉션이 없으면 자동으로 생성해서 도큐먼트를 인서트하고,
기존에 있으면 해당 경로에 도큐먼트를 인서트합니다 ^^
제가 테스트하면서 두 번 send 했기 때문에 도큐먼트가 두 개가 되어버렸는데
어쨌든 코드가 정상적으로 작동했음을 확인할 수 있겠습니다 ^.^!
별거 아닌 작은거라도 환경이 잘 구축되고 코드가 잘 구동하는 모습을 보면 늘 기쁩니다 ^^
이번 포스트는 마무리하고 다음 포스트로 찾아뵙겠습니다!
읽어주셔서 감사드리고,
드넓은 개발의 세계를 항해하시는 모든 분들 늘 건승하시고 행복하시기 바랍니다 ^.^!