본문 바로가기

Backend study/Django

Django 프로젝트에서 자동 생성되는 데이터베이스 테이블

Django 프로젝트를 시작하고 첫 마이그레이션을 실행하면, 우리가 만들지 않은 테이블들이 자동으로 생성되는 것을 볼 수 있다. 이 테이블들은 Django의 핵심 기능들을 지원하는 중요한 역할을 한다. 이번 포스트에서는 이러한 기본 테이블들의 역할과 구조를 자세히 알아보자.

 

첫 마이그레이션 후 생성되는 테이블들

python manage.py migrate

위 명령어를 실행하면 다음과 같은 테이블들이 자동으로 생성된다:

auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_migrations
django_session

 

1. auth_로 시작하는 테이블 (Django 인증 시스템)

Django의 기본 인증 시스템인 django.contrib.auth 앱이 자동으로 생성하는 테이블들이다.

auth_user

Django의 기본 User 모델을 저장하는 핵심 테이블이다.

# 테이블 구조 (주요 컬럼)
- id: 기본키
- username: 사용자명 (unique)
- password: 해시된 비밀번호
- email: 이메일 주소
- first_name: 이름
- last_name: 성
- is_staff: 관리자 페이지 접근 권한
- is_active: 계정 활성화 여부
- is_superuser: 슈퍼유저 여부
- date_joined: 가입일
- last_login: 마지막 로그인 시간

활용 예시:

from django.contrib.auth.models import User

# 새 유저 생성
user = User.objects.create_user(
    username='testuser',
    email='test@example.com',
    password='testpass123'
)

# 슈퍼유저 생성
superuser = User.objects.create_superuser(
    username='admin',
    email='admin@example.com',
    password='adminpass123'
)

auth_group

사용자 그룹을 관리하는 테이블이다. 여러 권한을 묶어서 그룹으로 관리할 때 사용한다.

# 테이블 구조
- id: 기본키
- name: 그룹명 (unique)

# 활용 예시
from django.contrib.auth.models import Group

# 그룹 생성
editors_group = Group.objects.create(name='Editors')
moderators_group = Group.objects.create(name='Moderators')

# 사용자를 그룹에 추가
user.groups.add(editors_group)

auth_permission

Django의 모든 권한 정보를 저장하는 테이블이다. 각 모델에 대해 기본적으로 add, change, delete, view 권한이 자동 생성된다.

# 테이블 구조
- id: 기본키
- name: 권한 이름 (예: "Can add article")
- content_type_id: django_content_type 테이블 참조
- codename: 권한 코드명 (예: "add_article")

# 권한 확인 예시
if user.has_perm('blog.add_article'):
    # 글 작성 권한이 있는 경우
    pass

auth_user_groups

사용자와 그룹의 다대다(ManyToMany) 관계를 저장하는 중간 테이블이다.

# 테이블 구조
- id: 기본키
- user_id: auth_user 테이블 참조
- group_id: auth_group 테이블 참조

# Django ORM이 자동으로 처리
user.groups.add(group)  # 이 명령이 auth_user_groups에 레코드 추가

auth_user_user_permissions

사용자에게 직접 부여된 권한을 저장하는 중간 테이블이다.

# 테이블 구조
- id: 기본키
- user_id: auth_user 테이블 참조
- permission_id: auth_permission 테이블 참조

# 사용자에게 특정 권한 부여
from django.contrib.auth.models import Permission
permission = Permission.objects.get(codename='add_article')
user.user_permissions.add(permission)

auth_group_permissions

그룹에 할당된 권한을 저장하는 중간 테이블이다.

# 테이블 구조
- id: 기본키
- group_id: auth_group 테이블 참조
- permission_id: auth_permission 테이블 참조

# 그룹에 권한 부여
group.permissions.add(permission)

 

2. django_로 시작하는 테이블 (Django 내부 관리용)

Django 프레임워크의 관리 시스템이 작동하기 위한 필수 테이블들이다.

django_admin_log

관리자(admin) 페이지에서 발생한 모든 변경 사항을 기록하는 로그 테이블이다.

# 테이블 구조
- id: 기본키
- action_time: 작업 시간
- user_id: 작업을 수행한 사용자
- content_type_id: 변경된 모델 타입
- object_id: 변경된 객체의 ID
- object_repr: 객체의 문자열 표현
- action_flag: 작업 유형 (1=추가, 2=수정, 3=삭제)
- change_message: 변경 사항 상세 내용

# 활용: Admin에서 누가 언제 무엇을 변경했는지 추적 가능
from django.contrib.admin.models import LogEntry

# 최근 10개의 admin 로그 조회
recent_logs = LogEntry.objects.all()[:10]
for log in recent_logs:
    print(f"{log.user} - {log.action_time} - {log.change_message}")

django_content_type

프로젝트의 모든 모델 정보를 저장하는 메타 테이블이다. GenericForeignKey나 권한 시스템에서 사용된다.

# 테이블 구조
- id: 기본키
- app_label: 앱 이름 (예: "blog")
- model: 모델 이름 (예: "article")

# 활용 예시
from django.contrib.contenttypes.models import ContentType

# 특정 모델의 ContentType 가져오기
from blog.models import Article
article_ct = ContentType.objects.get_for_model(Article)

# GenericForeignKey 사용 예
class Comment(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    text = models.TextField()

django_migrations

어떤 마이그레이션이 적용되었는지 추적하는 테이블이다.

# 테이블 구조
- id: 기본키
- app: 앱 이름
- name: 마이그레이션 파일명
- applied: 적용 시간

# 이 테이블 덕분에 Django는:
# 1. 어떤 마이그레이션이 이미 적용됐는지 알 수 있음
# 2. 새로운 마이그레이션만 선택적으로 실행할 수 있음
# 3. migrate --fake 같은 기능이 가능함

django_session

데이터베이스 기반 세션 저장소를 사용할 때 세션 데이터를 저장하는 테이블이다.

# 테이블 구조
- session_key: 세션 키 (기본키)
- session_data: 인코딩된 세션 데이터
- expire_date: 만료 시간

# settings.py 설정
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 기본값

# 세션 데이터 예시
request.session['user_id'] = 123
request.session['cart'] = ['item1', 'item2']

 

기본 테이블 커스터마이징

1. 커스텀 User 모델 사용

# models.py
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=20, blank=True)
    birth_date = models.DateField(null=True, blank=True)

# settings.py
AUTH_USER_MODEL = 'myapp.CustomUser'

2. 세션 저장소 변경

# settings.py
# 캐시 기반 세션
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# 파일 기반 세션
SESSION_ENGINE = 'django.contrib.sessions.backends.file'

3. 권한 시스템 확장

# 커스텀 권한 추가
class Article(models.Model):
    title = models.CharField(max_length=200)
    
    class Meta:
        permissions = [
            ("can_publish", "Can publish articles"),
            ("can_feature", "Can feature articles"),
        ]

 

기본 테이블 관련 유용한 명령어

# 현재 적용된 마이그레이션 확인
python manage.py showmigrations

# 특정 앱의 마이그레이션 상태 확인
python manage.py showmigrations auth

# 마이그레이션 초기화 (주의: 데이터 손실)
python manage.py migrate auth zero

# 가짜 마이그레이션 (이미 존재하는 테이블에 대해)
python manage.py migrate --fake

# 세션 정리
python manage.py clearsessions

 

주의사항

  1. 직접 수정 금지: 이 테이블들은 Django가 관리하므로 직접 수정하지 않는 것이 좋다
  2. 마이그레이션 순서: auth와 contenttypes는 다른 앱보다 먼저 마이그레이션되어야 한다
  3. 백업 중요성: django_migrations 테이블이 손상되면 마이그레이션 추적이 어려워진다

 

 

Django의 기본 테이블들은 프레임워크의 핵심 기능들을 지원하는 중요한 역할을 한다. 이 테이블들의 구조와 역할을 이해하면:

  • 권한 시스템을 더 효과적으로 활용할 수 있다
  • 문제 발생 시 디버깅이 쉬워진다
  • Django의 내부 동작을 더 깊이 이해할 수 있다

특히 인증 시스템과 관련된 테이블들은 거의 모든 Django 프로젝트에서 활용되므로, 구조를 잘 이해하고 있으면 개발에 큰 도움이 된다.

728x90