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

[Django] Django의 model 클래스 & MySQL DB 이해하기

eunjuu 2023. 8. 27. 20:13
728x90

💬 개발 왕초보가 쓰는 정리글,,, (틀린 부분 있으면 알려주세요)

일단 나는 동아리 홈페이지를 만드는 프로젝트에서 기초 스터디 부원과 심화 스터디 부원 각각이 업로드할 과제 업로드 페이지를 만드는 업무를 맡았다.

 

🪧 링크/assignments/basic : 기초 부원 과제 업로드 페이지

🪧 링크/assignments/advanced : 심화 부원 과제 업로드 페이지

 

대충 이런 느낌으로. . .

여기서 게시물 두 개는 내가 게시판 리스트를 조금 더 수월하게 만들기 위해 superuser를 생성한 후 admin 페이지에서 임의로 만든 게시물이다. 기초 과제 제출 페이지에만 게시물 두 개를 생성했다(진짜 맨 처음에). 그러다 얼마 전에 팀장으로부터 DB를 처음부터 다시 설정하겠다는 연락을 받았다(MySQL 사용하기 위해! 전에는 SQLite3 이용). 그래서 다시 맨처음으로 돌아와(DB를 reset), 현재 MySQL과 Django 연동까지는 완료한 상태다. 

📎 https://eunjuicyyyyyy.tistory.com/19

 

이렇게 DB를 완성하고 admin 페이지에 접속했다. 

(좌) 그냥 admin 페이지 접속한 화면 (우) Basic assignments 클릭해서 안에 게시물 있는지 확인 (당연히 없음)
서버 접속하면 게시물 없어진 거 확인 가능

당연히 전에 Basic Assignements에 추가해둔 게시물 두 개([1주차] 과제 제출, [2주차] 과제 제출)는 없어졌다. 그런데 여기서 의문점, 'Advanced assignments', 'Basic assignments'는 왜 있는거지? 어디서 온 친구지. . . 

 

1) MySQL DB
2) assignment 폴더 안 models.py

 

1) MySQL로 생성한 DB는 'basic_assignment' 하나

2) Django의 models.py에는 내가 각각 'BasicAssignment', 'AdvancedAssignment' 이렇게 클래스 생성

 

🤷🏻‍♀️ 띄어쓰기와 대소문자 표기가 다 다른데, 대체 /admin 페이지의 Assignment 안에 'Advanced assignments', 'Basic assignments'는 어디서 온 친구들일까? 대체 MySQL은 어떤식으로 연결되는 것일까?

 

데이터베이스가 어떻게 굴러가고 있는지 이해를 하나도 못 하고 이것저것 만져본 거라 정리가 좀 필요하다. 그래서 지피티한테 계속 물어보며 공부를 좀 해봤다. 혹시 틀린 부분이 있다면 언제든 알려주시면 감사하겠습니다. 🙇🏻‍♀️


👩🏻‍💻 : 나 
💻 : 챗 지피티

 

🤜🏻  /admin 페이지의 데이터베이스 관련 정보

👩🏻‍💻 : admin 페이지에서 보여주는 데이터베이스들은 Django 어느 파일에 저장되어 있는 거야?

💻 : 장고 어드민 페이지에서 보이는 데이터베이스 관련 정보는 장고 프로젝트의 모델(Model) 클래스를 기반으로 동적으로 생성됩니다. 이러한 모델 클래스들은 일반적으로 장고 프로젝트의 애플리케이션 내에서 정의되며, 이러한 정의는 해당 애플리케이션 내의`models.py` 파일에 저장됩니다. 각 애플리케이션 내에서 `models.py` 파일에 정의한 모델 클래스는 데이터베이스의 테이블과 매핑되며, 이 모델 클래스의 속성과 메서드는 해당 테이블의 열(Column)과 데이터 조작을 정의합니다. 이렇게 정의된 모델 클래스는 마이그레이션(migration)을 통해 데이터베이스 테이블로 생성되고 관리됩니다.

 

요약하면, admin 페이지에서 보이는 데이터베이스 정보는 장고 프로젝트의 애플리케이션 내에서 `models.py` 파일에 정의된 모델 클래스를 기반으로 동적으로 생성되며, 이를 통해 데이터베이스 테이블과 상호작용할 수 있는 사용자 인터페이스가 제공된다.

→ ㅇㅋ... 근데 models.py에 내가 정의한 클래스랑 admin 페이지에서 보여주는 모델 클래스 이름이 좀 다른데?

 

models.py /admin 페이지
BasicAssignment Basic assignments
AdvancedAssignment Advanced assignments

 

이렇게 띄어쓰기랑 대소문자가 다르잖아! (심지어 models.py는 단수형인데, /admin 페이지는 's'붙임)

(/*`д´)/

 

🤜🏻  /admin 페이지의 신기한 기능

👩🏻‍💻 : models.py랑 admin 페이지의 클래스 이름이 다른데?

💻 : 어드민 페이지에서 모델의 표시 이름은 기본적으로 모델 클래스 이름을 사용하되, 단어의 각 부분을 분리하여 사람이 읽기 쉽도록 조합됩니다. 이때 각 단어는 첫 글자가 대문자인 경우에만 분리되며, 그렇지 않은 경우에는 하나의 단어로 간주됩니다.

따라서 'BasicAssignment'라는 모델 클래스의 경우, 어드민 페이지에서는 'Basic assignments'로 표시됩니다. 이러한 표시 이름은 어드민 페이지에서 해당 모델을 나타내는 데 사용됩니다.

만약 어드민 페이지에서 다른 표시 이름을 사용하고 싶다면, 모델 클래스에 `Meta` 클래스를 사용하여 `verbose_name`과 `verbose_name_plural` 속성을 설정할 수 있습니다. 예를 들어:

from django.db import models

class BasicAssignment(models.Model):
    # 필드 정의
    ...

    class Meta:
        verbose_name = 'Basic Assignment'
        verbose_name_plural = 'Basic Assignments'

 

→ ... admin 페이지가 자기 맘대로 이름을 바꾼다고? 우와. verbose name을 설정하면 내가 원하는 이름으로 변경할 수 있다고 하니 직접 해봤다.

 

1) class Meta 추가

 

2) 서버 실행 후 admin 페이지 접속

진짜다. . . .

원래 Basic assignments였는데 a가 대문자 'A'가 되었다. (о゚д゚о) 

 

🤜🏻  Django와 MySQL 연동, 그리고 그 후. . . 

👩🏻‍💻 : 내가 현재 Django에 MySQL 연동을 했어. 그럼 이제 admin 페이지에 데이터를 추가하면 MySQL에 데이터가 쌓이는 거야?

💻 : 네, 맞습니다. 장고의 어드민 페이지에서 데이터를 추가하면, 해당 데이터는 MySQL 데이터베이스에 저장됩니다. 어드민 페이지는 장고 애플리케이션의 모델을 통해 데이터베이스와 상호작용하며, 새로운 데이터를 추가하거나 기존 데이터를 수정, 삭제하는 등의 작업을 수행할 수 있습니다.


어드민 페이지를 사용하여 데이터를 추가하거나 관리하는 경우, 데이터는 장고 모델과 그에 맞는 데이터베이스 테이블 간에 자동으로 동기화됩니다. 데이터를 추가하거나 수정하면 장고는 이러한 변경 사항을 마이그레이션을 통해 데이터베이스에 적용하고 저장합니다. 따라서 어드민 페이지를 통해 추가한 데이터는 MySQL 데이터베이스에 정확하게 저장되며, 이를 통해 웹 애플리케이션의 데이터를 관리하고 유지할 수 있습니다.

 

→ admin 페이지에 데이터를 추가하고 MySQL에 접속해 확인해봤다.

 

1) admin 페이지에서 하나 추가

 

2) mysql -u root -p 이용해서 MySQL 접속

SHOW DATABASES;

내가 만든 basic_assignments가 있다. (내가 저번에 만든 DB... 근데 이름을 잘못 지은 것 같다. 그냥 assignments_schema 이런식으로 적어야 했던 것 같은데 내가 이해를 제대로 못하고 음,, 기초 과제 제출부터 만들어야 하나?하고 basic_assignmnents라고 지음)

 

USE basic_assignments;
SHOW TABLES;

 

SELECT * FROM assignments_basicassignments;

오 뭔가 반영이 된 것 같다. . . 

 

중간 점검,,
1. 일단 내가 저번에 CREATE한 DB는 로컬 DB다. (basic_assignment)
2. 내 컴퓨터에서 독립적으로 작동하기 때문에, 내가 git에 push를 해도 다른 팀원은 나의 '[1주차] 과제 제출'를 못 봄
3. 나는 저번에 장고의 설정 파일인 my_settings.py에 내 로컬 DB에 맞게 데이터베이스 설정을 완료함 (참고 링크)
4. 그래서 MySQL과 admin 페이지가 연동되는 듯?? (admin 페이지에 적은 글이 내 MySQL에 등록된다는 뜻)
→ 확신이 안 가서 지피티한테 물어봤다.

 

👩🏻‍💻 : 그럼 로컬 데이터베이스를 설정하면 나의 admin 페이지와 연동되는거지?

💻 : 네, 맞습니다. 로컬 데이터베이스를 설정하면 Django admin 페이지와 연동할 수 있습니다. Django의 admin 페이지는 데이터베이스에 저장된 데이터를 관리하고 조작하는 데 사용되는 강력한 도구입니다. 설정한 데이터베이스와 관련된 모델을 admin 페이지에서 등록하면, 해당 모델의 데이터를 관리할 수 있습니다.

로컬 데이터베이스를 설정하고 Django admin 페이지와 연동하는 과정은 다음과 같습니다:

(하나씩 확인해봤다)

1. 데이터베이스 설정 : `settings.py` 파일에서 `DATABASES` 섹션을 수정하여 로컬 데이터베이스에 대한 정보를 설정합니다. ENGINE, NAME, USER, PASSWORD 등을 설정합니다.

설정 완료(당연히 안에 내용은 바꿈,,,)

 

2. 모델 정의 : `models.py` 파일에서 모델 클래스를 정의합니다. 각 클래스는 데이터베이스의 테이블과 매핑됩니다. 이 모델 클래스는 Django의 `models.Model` 클래스를 상속받아 정의하며, 필드와 메서드를 추가할 수 있습니다.

BasicAssignment와 AdvancedAssignment 클래스 설정 완료

 

3. Admin 페이지에 모델 등록 : `admin.py` 파일에서 정의한 모델 클래스를 `admin.site.register()` 함수를 사용하여 등록합니다. 이렇게 하면 해당 모델을 Django admin 페이지에서 관리할 수 있습니다.

등록 완료


4. 마이그레이션 및 데이터베이스 업데이트 : 모델을 정의하고 등록한 후, 마이그레이션을 생성하여 데이터베이스 스키마를 업데이트합니다. 터미널에서 `python manage.py makemigrations` 및 `python manage.py migrate` 명령을 실행합니다.

출처,, 지난 포스팅


5. Admin 페이지 접근 : 로컬 개발 서버를 실행한 후, 브라우저에서 `http://127.0.0.1:8000/admin/` 또는 설정한 포트로 접속하여 Django admin 페이지에 접근합니다.

6. 모델 데이터 관리 : admin 페이지에서 등록한 모델을 선택하여 데이터를 추가, 수정, 삭제할 수 있습니다. 이를 통해 데이터베이스의 내용을 직접 조작할 수 있습니다.

확인 완료

 

이렇게 로컬 데이터베이스와 Django admin 페이지의 연동을 통해 개발자는 개발 중인 애플리케이션의 데이터를 효율적으로 관리하고, 데이터베이스의 상태를 확인할 수 있다.

 

728x90