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
주의사항
- 직접 수정 금지: 이 테이블들은 Django가 관리하므로 직접 수정하지 않는 것이 좋다
- 마이그레이션 순서: auth와 contenttypes는 다른 앱보다 먼저 마이그레이션되어야 한다
- 백업 중요성: django_migrations 테이블이 손상되면 마이그레이션 추적이 어려워진다
Django의 기본 테이블들은 프레임워크의 핵심 기능들을 지원하는 중요한 역할을 한다. 이 테이블들의 구조와 역할을 이해하면:
- 권한 시스템을 더 효과적으로 활용할 수 있다
- 문제 발생 시 디버깅이 쉬워진다
- Django의 내부 동작을 더 깊이 이해할 수 있다
특히 인증 시스템과 관련된 테이블들은 거의 모든 Django 프로젝트에서 활용되므로, 구조를 잘 이해하고 있으면 개발에 큰 도움이 된다.
'Backend study > Django' 카테고리의 다른 글
Django 언어 설정과 국제화(i18n) - LANGUAGE_CODE (3) | 2025.07.11 |
---|---|
APIView와 ViewSet (0) | 2025.07.02 |
Django에서 시간대(Timezone) 다루기 - django.utils.timezone (0) | 2025.06.30 |
Django 프로젝트 구조와 명령어 완벽 가이드 (0) | 2025.06.27 |
Django란? (0) | 2025.06.27 |