프로젝트/장고 웹페이지 구축

[Django] Django에 MySQL DB 연결 - MacOS

eunjuu 2023. 8. 23. 14:53
728x90

🤜🏻 Mac(맥)에서 Django(장고) 개발환경 구축하기

기본적으로 장고는 SQLite3 데이터베이스를 사용하여 개발 서버를 실행하고 초기 프로젝트 설정을 제공한다. 하지만 실제 프로덕션 환경에서는 대부분 MySQL과 같이 더 강력하고 확장 가능한 데이터베이스 시스템을 사용하는 것을 권장한다. 나는 현재 동아리 팀원들과 웹페이지를 구축하는 프로젝트를 진행하고 있고, 팀장으로부터 DB 연결을 요청받아 한 번 해보려고 한다! 


1. MySQL 설치

✅ Homebrew 설치되어 있는지 확인
* Homebrew : macOS 용 패키지 관리자 설치


나는 미리 설치해서 version 확인만 간단히!

$ brew -v

✅ MySQL 설치

$ brew install mysql

✅ MySQL 버전 확인

$ mysql -V

* -v 소문자하면 안 됨...

✅ MySQL 시작

$ mysql.server start

*중단은 mysql.server stop

 

2. MySQL 설정

✅ MySQL 기본 설정
→ MySQL 초기 보안 설정 구성 (이때 root 사용자의 비밀번호 설정, 이 비밀번호는 root 사용자로 DB 로그인할 때 필요한 비밀번호)

$ mysql_secure_installation

 
1) 비밀번호 복잡도 설정 → 나는 간단하게 설정할 것이므로 n 선택
2) 비밀번호 설정 + 확인(Re-enter) → 완료
3) 익명 사용자 삭제 → y, 접속하는 경우 'mysql -u root'처럼 u 옵션 필요
4) 원격에서 root로 로그인하는 것을 막을 것인가 → 대부분 다 y 하던데... 나는 혹시 몰라서 n 했다.
* 검색을 좀 해보니 이 옵션은 로컬에서 DB를 올려두고 프로젝트를 개발하는 대부분의 사람들에게는 크게 의미가 없는 부분이라고 한다.
5) test DB 삭제 여부 → 별로 필요 없을 것 같아서 y
6) previlege 테이블을 다시 로드할 것인지 → y, 무조건 yes 하라는 글을 봤다

 

All done!

 

3. MySQL 접속 후 확인

파이썬에서는 mysqlclient라는 라이브러리를 통해 MySQL과 DB를 연동할 수 있다. 가상환경에 mysqlclient를 설치하면 좋다고 해서(지피티가 그랬음..ㅎㅎ) 파이참을 통해서 진행했다. 사실 아직 완벽하게 이해를 못했음 .. 🙈 그냥 일단 하라는 대로 ...
 
✅ 프로젝트 가상환경에서 mysqlclient 설치

$ pip install mysqlclient

 

* (venv_isly) : 내 가상 환경 이름

 

error : subprocess-exited-with-error
오류 발생..... 😭
 
✅ 맥 OS에서 pip install mysqlclient 설치 오류시 해결하는 방법

$ brew install mysql pkg-config
$ pip install mysqlclient

 

오예!
 
✅ DB 접속하기

$ mysql -u root -p

mysql -u root -p 명령을 사용하면 MySQL 클라이언트가 시작되고, 'root' 사용자로 데이터베이스 서버에 접속할 수 있는 환경을 제공한다. 

 

* 비밀번호는 아까 mysql_secure_installation에서 설정한 비밀번호 입력
* mysql 나가려면 exit
 
✅ 새로운 DB 생성 후 유저 생성 및 권한 부여

> CREATE DATABASE your_local_db_name;
> CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_db_password';
> GRANT ALL PRIVILEGES ON your_local_db_name.* TO 'your_db_user'@'localhost';
> FLUSH PRIVILEGES;

 

일단 이름을 'basic_assignments'라고 지었다. 

 

4. 보안 설정 파일 분리

🔐 my_settings.py 파일 :

장고 프로젝트를 생성하면, 설정과 관련된 정보들은 일반적으로 'settings.py' 파일에 저장된다. 하지만 이 프로젝트의 소스 코드를 GitHub에 업로드할 때 주의해야 할 점이 있다. 'settings.py'에는 보안상 외부로 노출되면 안 되는 중요한 정보들이 포함될 수 있기 때문이다. 따라서 이러한 중요 정보를 노출시키지 않기 위해 새로운 파일을 만들어서 저장한 다음, '.gitignore' 파일을 사용하여 이 파일이 원격 저장소에 업로드되지 않도록 설정해야 한다. 보통 이를 위해 'my_settings.py'와 같은 파일을 생성하고 사용한다.

 

✅ my_settings.py 파일 생성

(좌) my_settings.py 파일 생성 (우) .gitignore

*팀장이 프로젝트 루트 디렉토리(settings.py가 있는 디렉토리)에 my_settings.py 파일을 생성해달라고 해서 똑같이 했는데 settings.py가 없는 곳에 만들면 오류가 생기는지 궁금,,,

 

my_settings.py 파일 설정 입력

→ DATABASES 설정을 자신의 로컬 데이터베이스에 맞게 변경

 

`DATABASES` 섹션에서 ENGINE, NAME, USER, PASSWORD 등의 정보를 설정해야 하는 이유는 Django 애플리케이션과 데이터베이스 간의 연결을 설정하기 위해서다.

1. ENGINE : 데이터베이스 백엔드를 지정. MySQL을 사용한다면 `'django.db.backends.mysql'`과 같이 설정.
2. NAME : 데이터베이스의 이름을 지정. 연결하려는 MySQL 데이터베이스의 이름을 설정.
3. USER : 데이터베이스에 연결할 때 사용할 사용자 이름을 지정. 해당 사용자가 데이터베이스에 접근 및 조작할 수 있는 권한이 필요.
4. PASSWORD : 데이터베이스 사용자의 비밀번호를 지정. 비밀번호는 보안을 위해 반드시 설정되어야 함.
5. HOST : 데이터베이스 서버의 호스트 이름을 지정. 로컬 데이터베이스인 경우 `'localhost'`를 사용 가능. 원격 데이터베이스인 경우 호스트 주소를 제공해야 함.
6. PORT : 데이터베이스 서버의 포트 번호를 지정. 일반적으로 MySQL의 기본 포트인 3306을 사용.

Django에서 이러한 설정을 제공하는 이유는 데이터베이스와의 연결 및 작업을 단순화하기 위함이다. `DATABASES` 설정을 통해 Django는 애플리케이션의 데이터베이스와의 연결을 자동으로 관리하며, 데이터베이스의 스키마 변화를 마이그레이션을 통해 추적할 수 있다. 이렇게 함으로써 데이터베이스 관련 작업이 훨씬 간편해지며, 데이터베이스 연동에 필요한 부분을 설정 파일에서 관리할 수 있다.

 

*저장(ctrl+S)로 마무리

*팀원마다 DB 설정이 다르면 push를 했을 때 충돌이 일어나지 않는가? → 괜찮! 팀장이 .gitignore에 my_settings.py 넣어놔서 원격 저장소에는 자동으로 올라가지 않는다. (즉, 충돌 ❎)

 

5. makemigrations와 migrate 수행

각 팀원은 로컬 개발 환경에서 모델 변경을 진행한 후, makemigrations 명령을 실행하여 마이그레이션 파일을 생성한다. 그리고 migrate 명령을 실행하여 변경 사항을 로컬 데이터베이스에 적용한다.

$ python manage.py makemigrations
$ python manage.py migrate

 

📁 makemigrations : models.py에서 적용한 변경사항이나 추가&삭제된 사항들을 감지하여 파일로 생성

📁 migrate : 적용되지 않은 migrations(설정값)들을 적용시키는 역할

→ 즉 makemigrations는 변경사항들을 감지하고 기록하는 역할을 하며, migrate은 그러한 기록된 파일들과 설정값들을 읽어서 그 변경사항을 db에 저장한다.

 

마무리

👩🏻‍💻 이러한 순서를 따르면 개발자 각각이 자신의 로컬 환경에서 데이터베이스 설정을 관리하고, 데이터베이스 스키마 변경과 마이그레이션을 독립적으로 처리할 수 있다. 이로써 효과적인 협업과 동시에 보안을 유지할 수 있다. 

 

728x90