본문 바로가기
Python/Django

Django AUTH USER 사용자 모델

by 좌우지간에 2025. 1. 8.

📌 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 관리자 페이지는 데이터 관리의 강력한 도구이며, 커스터마이징을 통해 개발 생산성을 높일 수 있습니다.