project/guava

로컬환경의 django + AWS RDS(mariadb) 연결

카늬 2025. 10. 1. 11:35

팀프로젝트를 진행하게 되면서 다른 팀원들과 db를 공유해놓은 상태로 개발을 진행해야 할 것 같아. 다음과 같이 세팅을 진행하였습니다.

 

 

RDS 생성

사용할 db와 db명, 사용자 명, 암호를 적어줍니다.

 

 

ec2연결을 하지 않을 것 이므로 해당사항을 선택한 후 "데이터베이스 생성"해 줍니다.

 

저의 경우 데이터베이스가 생성되는데 5분정도 소요되므로 천천히 기다려 줍니다. 

 


외부에서 연결

데이터베이스 생성이 완료되었으므로 로컬(DBeaver)에 연결을 해 줄 것입니다.

사용 데이터베이스로 변경 후 노란색부분 접근을 허용할 ip주소를 지정하는 곳으로 고정ip주소나 0.0.0.0/0으로 저장해줍니다.

모르겠으면 그냥 0.0.0.0/0으로 사용하시면 됩니다.

생성한 RDS 데이터베이스의 엔드포인트를 확인한 후

Server Host = RDS 엔드포인트

Username = RDS생성시 사용하였던 사용자 이름

Password = RDS생성시 사용하였던 비밀번호

로 적어주신 후 연결해주시면 됩니다.


Django와의 연결

정상적으로 내 pc와의 연결이 되는걸 확인한 후 작업하는 내용입니다.

 

#터미널
pip install django-environ mysqlclient

먼저 miriadb를 사용하는데 필요한 라이브러리를 설치해줍니다.

#.env

DB_NAME=[생성한 스키마 명]
DB_USER=[사용자 명]
DB_PASSWORD=[비밀번호]
DB_HOST=[RDS 엔드포인트]
DB_PORT=[포트번호]

팀프로젝트로 git에 업로드를 하게 될텐데 혹시나 하는 유출에 대비하여 환경변수를 사용해 줍니다.

manage.py 와 동일한 폴더에 위치해 주시면 됩니다. gitignore에 .env를 추가하여 commit되지 않도록 해주세요

 

#settings.py

import environ, os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env()
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))  # 로컬/컨테이너에서 주입

DEBUG = env.bool('DJANGO_DEBUG', default=False)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # MariaDB는 mysql 백엔드 사용
        'NAME': env('DB_NAME'),
        'USER': env('DB_USER'),
        'PASSWORD': env('DB_PASSWORD'),  # 깃에 올리지 않음
        'HOST': env('DB_HOST'),
        'PORT': env('DB_PORT', default='3306'),
    }
}

위 내용을 settings.py에 추가 및 변경해 줍니다.

 

DB테이블을 생성해주시는 분이 따로 계셔서 django 에서는 테이블 생성, 변경없이 단순히 조회를 우선으로 해야했기 때문에 models.py 의 db_column과 Mata.db_table을 모두 테이블에 맞추었습니다

#models.py 예시
class Service(models.Model):
    id = models.BigAutoField(db_column="service_id", help_text="Service ID", primary_key=True)
    name = models.CharField(db_column="name", max_length=120)
    category = models.CharField(db_column="category", max_length=40, null=True)
    description = models.TextField(db_column="description", null=True)
    official_link = models.CharField(db_column="official_link", max_length=255, null=True, blank=True)
    created_at = models.DateTimeField(db_column="created_at", auto_now_add=True)
    updated_at = models.DateTimeField(db_column="updated_at", auto_now=True)
    
    class Meta:
        db_table = 'service'   # 실제 테이블명 그대로
        managed = False         # Django가 테이블을 만들거나 변경하지 않음

 


에러상황

#error
django.db.utils.OperationalError: (1050, "Table 'user' already exists")

기존에 sqlite에서 작업해던 내용과 충돌이 있어 다음과 같은 에러가 발생하였는데 이미 user를  초기 마이그래이션을 하였던 기록이 남아있어 문제가 발생한 것으로 파악됩니다.

 

#터미널
python manage.py migrate --fake-initial

 

python manage.py migrate --fake-initial

--fake-initial은 초기 마이그레이션의 CreateModel 대상 테이블이 이미 있으면 적용된 것으로 표시합니다.

이 경우 모델/마이그레이션을 기존 스키마에 맞게 수정하거나, DB를 먼저 맞추어야 합니다.