📌 Django 사용자 모델(AUTH_USER_MODEL) 설정 및 커스텀 모델 활용 심화 🔑
Django는 웹 애플리케이션에서 사용자 인증 및 권한 관리를 위한 강력한 시스템을 제공하며, 그 핵심에는 AUTH_USER_MODEL 설정과 사용자 모델이 있습니다. 이번 TIL에서는 AUTH_USER_MODEL 설정, 커스텀 사용자 모델의 필요성, 설계 시 고려사항, Django 관리자 페이지 커스터마이징, 그리고 관련 주의사항들을 자세히 살펴보겠습니다.
1. AUTH_USER_MODEL 설정: Django의 기본 사용자 모델 사용 이해 👤
- 글로벌 기본값: Django는 기본적으로
django.contrib.auth앱의User모델을 사용자 모델로 사용합니다. 이 설정은django.conf.global_settings.py에 정의되어 있으며, 프로젝트 설정(settings.py) 파일에AUTH_USER_MODEL이 명시되지 않으면 이 기본값이 적용됩니다. auth앱:auth앱은 사용자 인증, 권한, 그룹 관리 등 사용자 관련 핵심 기능을 제공하는 Django의 기본 앱입니다. 기본User모델은 기본적인 사용자 정보를 저장하고 관리하기에 충분한 기능을 제공합니다.- 기본 사용자 모델의 장점:
- 간편함: 별도 설정 없이 바로 사용자 인증 기능 사용 가능
- 표준화: Django 기본 인증 시스템과 완벽 통합
- 보안: Django 개발팀에서 보안 업데이트를 지속적으로 제공
2. AUTH_USER_MODEL 설정 변경: 커스텀 사용자 모델 활용 ⚙️
- 커스텀 모델 필요성: 기본
auth.User모델은 기본적인 사용자 정보만 저장 가능하므로, 추가 정보 저장 또는 특정 비즈니스 로직 구현 시 커스텀 모델이 필요합니다. settings.py설정 변경:
# myproject/settings.py
AUTH_USER_MODEL = 'accounts.User' # '앱이름.모델이름' 형식으로 설정
- 커스텀 사용자 모델 정의 (accounts 앱):
accounts/models.py파일에 정의합니다.AbstractUser또는AbstractBaseUser를 상속받아 필드 및 메서드를 추가합니다.
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True, verbose_name='이메일')
username = models.CharField(max_length=150, unique=True, verbose_name='사용자 이름')
first_name = models.CharField(max_length=30, blank=True, verbose_name='이름')
last_name = models.CharField(max_length=30, blank=True, verbose_name='성')
is_staff = models.BooleanField(default=False, verbose_name='스태프 권한')
is_active = models.BooleanField(default=True, verbose_name='활성 사용자')
date_joined = models.DateTimeField(default=timezone.now, verbose_name='가입일')
USERNAME_FIELD = 'email' # 이메일로 로그인
REQUIRED_FIELDS = ['username'] # 필수로 받고싶은 필드
def get_full_name(self):
return f"{self.last_name} {self.first_name}".strip()
def get_short_name(self):
return self.first_name
def __str__(self):
return self.email
- AbstractUser: 기본 사용자 모델 필드와 기능을 포함하며, 필드 추가/수정 가능. 일반적인 확장에 유용.
- AbstractBaseUser: 기본 모델 없이 완전히 새로운 모델 정의 시 사용. 세밀한 제어에 유용.
- 커스텀 사용자 모델의 장점:
- 확장성: 사용자 정보 필드 자유롭게 추가 가능 (프로필 이미지, 전화번호, 주소 등)
- 커스터마이징: 모델에 필요한 메서드 추가하여 비즈니스 로직 구현 가능
- 유연성: 다양한 인증 방식, 사용자 권한 유연하게 제어 가능
3. 커스텀 사용자 모델 설계 시 고려사항 🧐
- 필드 선택: 저장할 사용자 정보 및 각 필드의 데이터 유형, 제약 조건 신중히 결정 (최대 길이, 필수 여부 등)
- 관계 설정: 다른 모델과의 관계 고려 (사용자 프로필, 게시글 등),
ForeignKey,OneToOneField,ManyToManyField적절히 활용 - 성능: 사용자 수 증가를 고려하여 인덱스 활용, 데이터베이스 쿼리 최적화
- 마이그레이션: 모델 변경 시 마이그레이션 파일 생성 및 데이터베이스 반영 과정 이해
- 보안: 비밀번호 안전하게 저장, 민감 정보는 암호화. Django의
PasswordHasher활용 및 Salt 사용 권장
4. 커스텀 사용자 모델 사용 시 주의사항 ⚠️
- 프로젝트 초기 설정:
AUTH_USER_MODEL설정은 프로젝트 생성 초기 단계에서 결정하는 것이 좋음. 중간 변경 시 복잡도 증가 - 호환성: 커스텀 모델 사용 시 Django 기본 인증 시스템과 호환성 확인 필수
- 재사용성: 모델 모듈화, 확장 가능한 구조로 설계하여 여러 프로젝트에서 재사용 가능하도록 설계
5. Django 관리자 페이지 활용 및 커스터마이징 🌐
- 기본 관리자 페이지 제공: Django는
admin앱을 통해 관리자 페이지를 제공하며, 데이터베이스 데이터 CRUD(생성, 읽기, 업데이트, 삭제)를 지원합니다. - 사용자 관리: 관리자 페이지에서 사용자 목록 확인, 새로운 사용자 생성, 기존 사용자 정보 수정 가능
- 모델 관리:
admin.py에 모델 등록 시 관리자 페이지에서 해당 모델 데이터 관리 가능
# blog/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post) # Post 모델을 관리자 페이지에 등록
- 편리한 CRUD 인터페이스: 폼을 통해 데이터 입력 및 수정, 목록 형태로 데이터 확인 가능
- 개발 편의성: 모델 및 데이터 테스트, 디버깅에 매우 유용
admin.py추가 설정:admin.py에서 모델 관리 페이지를 커스터마이징 가능 (필드 순서, 목록 필터, 검색 기능 등)ModelAdmin클래스:ModelAdmin클래스 상속받아 관리자 페이지 동작 커스터마이징.list_display,list_filter,search_fields등 활용
# accounts/admin.py
from django.contrib import admin
from .models import User
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'phone_number', 'is_staff', 'is_active', 'gender')
list_filter = ('is_staff', 'is_active','gender')
search_fields = ('username', 'email', 'phone_number')
ordering = ('username',)
인라인 모델:StackedInline,TabularInline사용하여 관련 모델 한 페이지에서 관리 가능
6. 추가 정보 💡
get_user_model()함수: 현재 활성화된 사용자 모델 참조- 사용자 인증 헬퍼 함수:
authenticate(),login(),logout()활용 - 사용자 권한 관리:
django.contrib.auth.permissions모듈 활용 - 소셜 로그인:
django-allauth등 서드파티 라이브러리 활용
7. 마무리 및 참고자료 📚
AUTH_USER_MODEL설정은 사용자 모델 정의의 핵심이며, 커스텀 모델은 확장성, 유연성을 제공합니다.- Django 관리자 페이지는 데이터 관리의 강력한 도구이며, 커스터마이징을 통해 개발 생산성을 높일 수 있습니다.
'Python > Django' 카테고리의 다른 글
| Django RDBMS 코드예시 (0) | 2025.01.10 |
|---|---|
| 관계형 데이터베이스 보충 (3) | 2025.01.09 |
| Django 워크플로우 정리 (CRUD, 로그인 기능까지) (0) | 2025.01.08 |
| 다대다 관계 보충설명 (7) | 2025.01.08 |
| [TIL] ForeignKey 보충 (코드예시) (0) | 2025.01.08 |