🌈 프로그래밍/Django

djongo를 설치하는 과정에서 발견한 오류들

반응형

Django 프로젝트에서 MongoDB를 사용하기 위해 `djongo` 를 설치하려고 했을 때 발생한 문제와 그 해결방법에 대해 알아보자.

프로젝트의 초기 toml 파일은 다음과 같았다.

[tool.poetry.dependencies]
python = "^3.10"
djangorestframework-simplejwt = "^5.2.2"
mysqlclient = "<2.2.*"
drf-yasg = "^1.21.5"
django = "<4.2.*"
djangorestframework = "<3.14.*"
gunicorn = "^20.1.0"
boto3 = "^1.26.129"
django-cors-headers = "^3.14.0"
drf-user-activity-tracker = "^1.0.1"
drf-api-logger = "^1.1.12"
pytz = "^2023.3"
pillow = "^9.5.0"
django-filter = "^23.2"
coreapi = "^2.3.3"
factory-boy = "^3.3.0"
cryptography = "^41.0.3"

이 상태에서 djongo 설치를 시도했다.

❯ poetry add djongo       
Using version ^1.3.6 for djongo

Updating dependencies
Resolving dependencies... (2.4s)

Writing lock file

Package operations: 4 installs, 1 update, 0 removals

  • Updating sqlparse (0.4.4 -> 0.2.4)
  • Installing dnspython (2.4.2)
  • Installing dataclasses (0.6)
  • Installing pymongo (4.5.0)
  • Installing djongo (1.3.6)

설치를 완료하고 연결을 위해 로컬 mongodb를 생성하고, 생성된 정보를 나의 development.py의 데이터베이스 설정과 연결해주었다.

# 개발 환경에서의 데이터베이스 설정
if "test" not in sys.argv:
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.mysql",
            "NAME": secrets["LOCAL_MYSQL_NAME"],
            "USER": secrets["LOCAL_MYSQL_USER"],
            "PASSWORD": secrets["LOCAL_MYSQL_PASSWORD"],
            "HOST": secrets["LOCAL_MYSQL_HOST"],
            "PORT": secrets["LOCAL_MYSQL_PORT"],
        },
        "mongodb": {
            "ENGINE": "djongo",
            "NAME": secrets["LOCAL_MONGODB_NAME"],
            "CLIENT": {
                "host": "localhost",
                "port": 27017,
                "username": secrets["LOCAL_MONGODB_USER"],
                "password": secrets["LOCAL_MONGODB_PASSWORD"],
                "authSource": "admin",
                "authMechanism": "SCRAM-SHA-256",
            },
        },
    }

그리고 나서 Django 서버를 재실행 해보았더니 다음과 같은 에러를 마주했다.

 version_info, _mysql.version_info, _mysql.__file__
NameError: name '_mysql' is not defined

_mysql 모듈이 정의되지 않았다는 오류가 발생했는데..
찾아보니 mysqlclient의 버전 또는 호환성 문제로 보였다.

현재 나의 프로젝트에서는 다음과 같은 mysqlclient 버전을 사용하고 있었다.

mysqlclient = "<2.2.*"

해당 라이브러리에 버전이 낮아서 발생하는 것 같아서 다음과 같은 명령어로 mysqlclient 최신 버전으로의 업데이트를 시도했다.

❯ poetry add mysqlclient@latest

Using version ^2.2.0 for mysqlclient

Updating dependencies
Resolving dependencies... (0.5s)

Writing lock file

Package operations: 0 installs, 1 update, 0 removals

  • Updating mysqlclient (2.1.1 -> 2.2.0): Failed

  ChefBuildError

하지만 mysqlclient 또한 업데이트에 실패했다.

해당 업데이트에 필요한 라이브러리와 헤더 파일이 없었기 때문이었다.

다음과 같은 명령어로 필요 라이브러리와 헤더 파일을 설치해주었다.

❯ brew install mysql

이후 mysqlclient 업데이트를 재시도하니 성공했다!

❯ poetry add mysqlclient@latest

Using version ^2.2.0 for mysqlclient

Updating dependencies
Resolving dependencies... (0.2s)

Package operations: 0 installs, 1 update, 0 removals

  • Updating mysqlclient (2.1.1 -> 2.2.0)

그리고 나서 나의 최종 pyproject.toml 파일은 다음과 같이 변경되었다.

[tool.poetry.dependencies]
python = "^3.10"
djangorestframework-simplejwt = "^5.2.2"
mysqlclient = "^2.2.0"
drf-yasg = "^1.21.5"
django = "<4.2.*"
djangorestframework = "<3.14.*"
gunicorn = "^20.1.0"
boto3 = "^1.26.129"
django-cors-headers = "^3.14.0"
drf-user-activity-tracker = "^1.0.1"
drf-api-logger = "^1.1.12"
pytz = "^2023.3"
pillow = "^9.5.0"
django-filter = "^23.2"
coreapi = "^2.3.3"
factory-boy = "^3.3.0"
cryptography = "^41.0.3"
djongo = "^1.3.6"

만약 프로젝트에서 MongoDB만 사용한다면 겪지 않을 문제이지만, 이미 MySQL을 프로젝트에서 연결해서 사용중이고 DB를 추가하기 위해서 djongo 설치 한다고 했을 때 그 과정에서 발생할 수 있는 문제점에 대해서 알아보았다.

반응형