공지 사항역대 가장 빠른 MongoDB, MongoDB 8.0을 소개합니다! 더 보기 >
공지 사항Voyage AI가 MongoDB와 협력하여 Atlas에서 더욱 정확하고 신뢰할 수 있는 AI 애플리케이션을 지원합니다. 자세히 알아보기 >

PyMongo란 무엇인가요? Python 및 MongoDB 시작하기

Atlas를 지금 체험해 보세요

PyMongo는 동기식 Python 애플리케이션을 위한 공식 MongoDB 드라이버입니다. Python 애플리케이션에서 MongoDB를 연결하고 사용하는 방법을 배우고 싶다면 제대로 찾아오셨습니다. 해당 PyMongo 튜토리얼에서는 FastAPI와 MongoDB Atlas를 사용하여 간단한 CRUD(생성, 읽기, 업데이트, 삭제) 애플리케이션을 구축해 보겠습니다. 애플리케이션은 MongoDB 데이터베이스에서 문서를 생성, 읽기, 업데이트 및 삭제할 수 있으며, REST API를 통해 이 기능을 제공합니다. 완성된 애플리케이션은 Github에서 확인할 수 있습니다.

PyMongo란 무엇인가요? Python 및 MongoDB 시작하기

도서 관리 CRUD 애플리케이션

저는 새로운 기술을 배우는 가장 좋은 방법이 무언가를 만드는 것이라고 생각합니다. 그래서 가장 간단하지만 유용한 백엔드 애플리케이션인 도서 관리를 위한 CRUD 앱을 코딩해 보겠습니다. CRUD 작업은 REST API를 통해 제공됩니다. API에는 5개의 엔드포인트가 있습니다:

 

 

API를 빌드하기 위해 FastAPI 프레임워크를 사용합니다. API를 구축하기 위한 가볍고 현대적이며 사용하기 쉬운 프레임워크입니다. 이는 API 구축을 위한 가볍고 사용하기 쉬운 최신 프레임워크이며 애플리케이션 테스트에 사용할 Swagger API 문서도 생성합니다.

도서를 MongoDB Atlas 클러스터에 저장할 것입니다. MongoDB Atlas는 MongoDB의 데이터베이스 서비스형 플랫폼입니다. 클라우드 기반이라 무료 계정을 만들고 몇 분 만에 클러스터를 만들 수 있으며, 컴퓨터에 아무것도 설치하지 않아도 됩니다. PyMongo를 사용하여 클러스터에 연결하고 데이터를 쿼리합니다.

요구 사항:

완성된 프로젝트는 Github에서 확인할 수 있습니다. 단계별 지침에 따라 프로젝트를 처음부터 구축할 수도 있습니다. 이 작업을 위해서는 다음이 필요합니다.

프로젝트 설정 및 구성

시작하기 전에, 프로젝트를 전역적으로 설치된 다른 Python 패키지와 격리하기 위해 가상 Python 환경을 생성하겠습니다. Python 설치 시 함께 제공되는 venv 패키지를 사용하겠습니다. 터미널에서 다음 명령을 실행합니다.

 

 

참고: 일부 운영 체제에 Python 2와 3이 모두 설치되어 있기 때문에, 이 명령을 실행할 때 python3 실행 파일을 사용해야 할 수도 있습니다. 가상 환경에 로그인하면 python 실행 파일이 자동으로 버전 3을 사용합니다.

이제 가상 환경이 준비되었으므로 필요한 패키지를 설치할 수 있습니다. Python 설치에 포함된 Python 패키지 설치 프로그램인 pip을 사용하겠습니다.

 

 

프로젝트 디렉토리를 생성하고 해당 디렉토리로 이동한 후, 프로젝트에 필요한 파일을 스캐폴딩합니다.

 

 

참고: shell 명령어를 사용하여 파일과 디렉토리를 생성하고 탐색합니다. 원하는 경우 그래픽 파일 탐색기를 대신 사용할 수 있습니다.

환영 메시지를 반환하는 간단한 루트 / 엔드포인트를 구현하는 것부터 시작하겠습니다. 자주 사용하는 코드 편집기에서 main.py 파일을 열고 다음을 추가합니다.

pymongo-fastapi-crud/main.py

 

 

파일을 저장한 후 fastapi 패키지와 함께 설치된 uvicorn 패키지를 사용하여 애플리케이션을 실행합니다.

 

 

다음과 같은 응답이 표시되어야 합니다.

 

 

브라우저에서 http://127.0.0.1:8000을 엽니다. 환영 메시지가 표시되어야 합니다.

잘하셨습니다! 서버가 실행 중입니다. 다음 섹션에서는 MongoDB Atlas 클러스터에 연결하겠습니다.

MongoDB Atlas 클러스터에 연결

다음으로, 이전에 생성한 MongoDB Atlas cluster에 연결해야 합니다. 연결 문자열을 찾아 .env 파일에 추가합니다. 사용자 이름비밀번호를 내 자격 증명으로 바꿉니다.

pymongo-fastapi-crud/.env

 

python-dotenv 패키지를 사용하여 .env 파일에서 환경 변수 ATLAS_URI와 DB_NAME을 로드합니다. 그런 다음 애플리케이션이 시작될 때 pymongo 패키지를 사용하여 Atlas 클러스터에 연결합니다. 애플리케이션이 중지될 때 연결을 종료하기 위한 또 다른 이벤트 핸들러를 추가합니다. main.py 파일을 다시 열고 내용을 다음과 같이 교체하세요.

 

 

uvicorn 프로세스가 파일 변경을 감지하고 서버를 다시 시작합니다. MongoDB 데이터베이스에 연결되었습니다! 메시지가 터미널에 표시되어야 합니다.

API 요청 및 응답을 위한 모델 생성

MongoDB는 동일한 컬렉션 내에서 서로 다른 구조의 문서를 허용하는 유연한 스키마 모델을 제공합니다. 실제로는 컬렉션 내의 문서들이 보통 같은 구조를 공유합니다. 필요한 경우 컬렉션별로 유효성 검사 규칙을 시행할 수 있습니다. PyMongo 튜토리얼에서는 데이터베이스 유효성 검사를 다루지 않습니다. 대신 REST API를 통해 전달되는 데이터가 데이터베이스에 저장되기 전에 유효한지 확인합니다.

API 요청 및 응답을 위한 몇 가지 모델을 만들고 FastAPI가 대부분의 작업을 처리하도록 하겠습니다. 프레임워크는 유효성 검사, 올바른 데이터 유형으로의 변환뿐만 아니라 API 문서 생성까지 처리해 줍니다. models.py 파일을 열고 다음 내용을 추가합니다.

pymongo-fastapi-crud/models.py

 

pydantic 패키지의 BaseModel을 확장하여 모델에 필드를 추가합니다. Book 모델에는 id, title, author, synopsis라는 네 가지 필수 필드가 있습니다. id 필드는 UUID(범용 고유 식별자)로 자동 생성됩니다. 또한 API 문서에 표시될 Book 모델의 예시도 있습니다.

BookUpdate 모델의 필드는 선택 사항입니다. 이를 통해 부분 업데이트를 수행할 수 있게 됩니다. BookUpdate 모델에는 id 필드가 없습니다. 이는 사용자가 id를 업데이트하지 못하도록 하기 위함입니다.

이제 모델을 정의했으니 REST API 엔드포인트를 구현하고 모델을 사용하여 데이터의 유효성을 검사해 보겠습니다.

REST API 엔드포인트 구현

이제 재미있는 부분을 시작할 시간입니다! 도서에 필요한 REST API 엔드포인트를 구현해보겠습니다. routes.py 파일에 엔드포인트 구현을 추가하고, main.py 파일에 라우트를 로드합니다. 먼저 routes.py에서 APIRouter 객체를 초기화합니다.

pymongo-fastapi-crud/routes.py

 

 

보시는 것처럼, fastapi 패키지에서 APIRouter를 가져오고 있습니다. 이 객체를 사용하여 REST API의 엔드포인트를 정의하겠습니다. 앞서 정의한 Book 및 BookUpdate 모델도 가져오고 있습니다.

POST /book

첫 번째로 구현할 엔드포인트는 새 책을 생성하는 POST /books 엔드포인트입니다. router = APIRouter() 줄 다음에 다음을 추가합니다.

pymongo-fastapi-crud/routes.py

 

모든 도서 엔드포인트 앞에 /books를 붙이기 때문에 경로는 /입니다. response_description은 API 문서에 표시됩니다. status_code는 요청이 성공했을 때 반환되는 HTTP 상태 코드입니다. Book 모델을 사용하여 요청 본문에 전달된 데이터와 반환하는 응답의 유효성을 검사합니다. FastAPI가 유효성 검사를 처리합니다. 함수 본문에서 PyMongo의 insert_one() 메서드를 사용하여 새 도서를 `books` 컬렉션에 추가합니다. find_one() 메서드를 사용하여 새로 생성된 도서를 데이터베이스에서 조회합니다. PyMongo 문서의 컬렉션 수준 작업에 대한 도움말에서 insert_one() 및 find_one() 메서드에 대해 더 알아보실 수 있습니다.

마지막으로 생성된 책을 반환합니다.

GET /book

다음으로 books 컬렉션의 모든 문서를 목록으로 반환하는 `GET /book` 엔드포인트를 구현하겠습니다. routes.py 파일의 끝에 다음을 추가하세요.

pymongo-fastapi-crud/routes.py

 

 

응답 모델로 List[Book] 타입을 사용하고 있습니다. 이는 응답이 Book 객체의 목록이 될 것임을 의미합니다. 또한 find() 메서드를 사용하여 데이터베이스에서 최대 100권의 도서를 조회합니다. limit 및 find() 메서드의 다른 매개변수에 대해 자세히 알아보려면 PyMongo 문서 페이지를 확인하세요.

GET /book/{id}

id로 단일 책을 검색하기 위한 또 다른 GET 엔드포인트를 생성합니다. routes.py 파일 끝에 다음을 추가합니다:

pymongo-fastapi-crud/routes.py

 

여기서는 find_one() 메서드를 사용하여 데이터베이스에서 단일 도서를 조회합니다. 도서가 발견되면 반환합니다. 도서를 찾지 못하면 404 Not Found 상태 코드와 함께 적절한 메시지를 포함한 HTTPException을 반환합니다.

PUT /book/{id}

아마도 REST API에서 가장 중요한 엔드포인트는 `PUT /book/{id}` 엔드포인트일 것입니다. 이 엔드포인트는 단일 도서를 업데이트할 수 있게 해줍니다. routes.py 파일의 끝에 다음 구현을 추가합니다.

pymongo-fastapi-crud/routes.py

 

코드를 살펴보겠습니다. 먼저 도서를 업데이트하는 데 사용할 객체를 만듭니다. 그런 다음 book 객체에 필드가 있으면 update_one() 메서드를 사용하여 데이터베이스의 도서를 업데이트합니다. 여기서 중요한 점은 $set 업데이트 연산자를 사용하여 전체 문서를 다시 작성하는 대신 지정된 필드만 업데이트한다는 것입니다.

그런 다음 update_result의 modified_count 속성을 확인하여 도서가 업데이트되었는지 확인합니다. 해당 사항이 있는 경우, 업데이트된 책을 데이터베이스에서 조회하고 반환하기 위해 find_one() 메서드를 사용합니다.

book 객체에 필드가 없으면 기존 도서만 반환합니다. 그러나 도서를 찾지 못한 경우에는 404 Not Found 상태 코드와 함께 HTTPException을 반환합니다.

DELETE /book/{id}

마지막으로 구현할 엔드포인트는 ID로 단일 책을 삭제하는 DELETE /book/{id} 엔드포인트입니다. routes.py 파일의 끝에 다음 내용을 추가합니다.

pymongo-fastapi-crud/routes.py

 

여기서 주목할 점은 도서가 삭제된 경우 204 No Content 상태 코드를 반환한다는 것입니다. 이 상태 코드는 요청이 성공적으로 처리되었고 응답 페이로드 본문에 전송할 콘텐츠가 없음을 나타냅니다.

등록하기

마지막으로 /book 엔드포인트를 등록해야 합니다. main.py 파일을 열고 routes 모듈을 가져온 다음 book 라우터를 등록합니다. main.py 파일의 최종 버전은 다음과 같아야 합니다.

pymongo-fastapi-crud/main.py

API 문서 페이지를 탐색하고 엔드포인트를 테스트하세요

계속하기 전에 uvicorn 프로세스가 여전히 실행 중인지 확인하세요. 그렇지 않은 경우 터미널에서 동일한 명령으로 시작할 수 있습니다.

 

 

브라우저에서 http://localhost:8000/docs URL로 이동합니다. FastAPI와 Swagger가 생성한 API 문서를 보고 계십니다.

생성한 모든 엔드포인트를 확인할 수 있으며 이 페이지에서 바로 요청을 보낼 수 있습니다. 게시 탭을 열고 직접 해보기 버튼을 클릭합니다. 예시 도서로 미리 채워진 요청 본문을 볼 수 있습니다. 실행을 클릭하여 요청을 전송하세요. 생성한 도서가 포함된 성공적인 응답이 표시되어야 합니다. 응답에서 도서의 id를 가져와 다른 엔드포인트인 GET /book/{id}, PUT /book/{id}, 또는 DELETE /book/{id}에서 사용할 수 있습니다.

하지만 동일한 도서를 두 번 생성하려고 하면 어떻게 될까요? 500 Internal Server Error 응답을 받게 됩니다. 서버 프로세스가 실행 중인 터미널을 확인하면 다음과 같은 오류 메시지가 표시되어야 합니다.

 

 

동일한 _id 필드를 가진 책을 두 번 삽입하려고 시도했기 때문에 DuplicateKeyError가 발생했습니다. _id 필드는 MongoDB가 모든 컬렉션에 대해 생성하는 고유 인덱스입니다. 동일한 _id를 가진 두 도서를 가질 수 없습니다. 여기서 실제 문제는 이 오류를 코드에서 처리하지 않고 있다는 것입니다. 오류가 '전파되어' 서버가 500 Internal Server Error로 응답합니다. 클라이언트에게 보낼 적절한 응답을 생각해보고 이 오류를 처리하는 방법을 연습해보세요.

또한 생성한 유효성 검사 규칙을 테스트할 수도 있습니다. 예를 들어, 요청 본문에서 필수 title 필드를 제거한 후 실행을 클릭해 보세요. title 필드가 필수임을 알리는 오류 메시지가 표시되어야 합니다.

생성된 API 문서 페이지는 다양한 시나리오를 시도하고 API가 어떻게 작동하는지 확인하는 데 매우 유용합니다. 직접 구축한 API로 맘껏 활용해 보세요!

결론

이 튜토리얼에서는 FastAPI와 PyMongo, 동기식 Python 애플리케이션용 공식 MongoDB 드라이버를 사용하여 간단한 CRUD 애플리케이션을 만드는 방법을 살펴보았습니다. 또한 무료 MongoDB Atlas 클러스터를 빠르게 설정하고 연결하는 방법도 알아보았습니다. MongoDB Atlas는 단순한 MongoDB 클라우드 데이터베이스 이상의 기능을 제공합니다. 예를 들어, Atlas Search를 통해 API를 확장하여 전체 텍스트 검색을 쉽게 제공할 수 있습니다. 이러한 모든 서비스는 MongoDB Atlas에서 사용할 수 있습니다. 무료 계정을 만들어서 이 서비스를 사용해 보세요.

자주 묻는 질문

지금 Atlas 시작하기

몇 초 만에 시작할 수 있습니다. 무료 클러스터에는 512MB의 스토리지가 포함되어 샘플 데이터를 자유롭게 테스트해 보고 플랫폼에 익숙해질 수 있습니다.
무료로 사용해 보기영업 팀에 문의하기
다음으로 시작해 보세요.
  • 전 세계 125개 이상의 지역
  • 샘플 데이터 세트
  • 상시 활성화된 인증
  • 종단 간 암호화
  • 명령줄 도구