맞는데 왜 틀릴까..?

Django | DRF

[DRF] Project : WeaTo(1) - Custom User Model

안도일 2022. 8. 8. 22:13

Django는 기본적으로 django.contrib.auth.models에 포함된 User 모델을 제공한다. 내장으로 permission이나 authentication 등 다양한 기능을 제공해주는 훌륭한 모델이지만 이 User 모델은 아래와 같이 굳이 필요하지 않은 요소들을 가지고 있고, 추가로 원하는 필드를 제공하지 않는다는 단점이 있다.

  • username
  • password
  • email
  • first_name
  • last_name 

 

 

간단한 게시판이나 서비스를 구현하기에는 전혀 모자람 없는 필드지만 우리의 서비스에서 요구하는 필드는 좀 더 다양하게 구성되어있다. 

 

먼저 우리 서비스에서 필요한 유저 모델의 필드를 살펴보자

  • 아이디
  • 닉네임
  • 생성 날짜
  • 접근 권한
  • 코멘트 작성 여부

 

그렇다면 이러한 추가적인 필드가 필요할 때는 어떻게 해야 할까

그 방법에는 총 4가지 정도가 있지만 중요하다고 판단되는 3가지만 알아보자


1. One-To-One Model

1:1 Model은 기본 User 모델에 일대일로 연결되는 새로운 모델을 하나 만드는 방식이다. User 모델을 직접 건드리지 않으면서도 필드를 추가할 수 있는 방법 중 하나다. 즉 프로젝트 중간에 추가사항이 생겨도 바로 추가할 수 있다는 장점이 있다.

하지만 두 개의 모델을 연결하여 사용하는 것은 하나의 모델을 사용하는 것보다 느릴 수밖에 없고, 유저가 추가될 때 효율적이지 않다는 단점이 있다.

 

2. AbstractBaseUser

가장 정석적인 방법 중 하나인 AbstractBaseUser이다. 이는 User 모델을 추상화시킨 AbstractBaseUser 모델을 상속받아와 아예 새로운 유저 모델을 만드는 방식이다. 우리가 직접 많은 것을 일일이 구현해주어야 하기에 가장 자유도가 높지만 그만큼 난이도도 가장 높은 방식이다. 

유저 모델을 아예 새로 만드는 방식인 만큼 프로젝트 진행 중에는 쉽게 선택하기 어렵고, 프로젝트 시작 전에 충분한 고민 후에 채택할 만한 방식이며, 추가적으로 구현하거나 수정할 기능이 많을 때 선택하여야 한다.

 

3. AbstractUser

AbstractUserAbstractBaseUser 보다는 어느 정도 타협한 방식이다. AbstractBaseUser 보다는 많은 것을 이미 갖고 있는 AbstractUser를 상속받아 새로운 유저 모델을 만드는 방식으로, 사실상 기본 유저 모델을 그대로 가져와 필요한 내용만 수정하거나 추가할 수 있는 방식이다. 가장 많이 쓰이면서도 편리한 방법이다.

 

우리 서비스에는 추가적으로 구현하거나 수정할 기능이 많으므로 2번째 방법인 AbstractBaseUser를 상속받는 방법을 선택했다. 물론 3번째 방법으로도 충분히 구현 가능하나 기능을 직접 구현해 보자는 생각으로 2번째 방법을 선택했다.

 


먼저 BaseUserManager를 상속하는 CustomUserManager를 함께 정의하여 일반 유저 및 슈퍼유저의 생성 방식을 정의해줘야 한다.

users/models.py

위 클래스는 유저의 생성 방식을 정의해주는 클래스로 일반 유저 생성인 create_user와 관리자 기능을 가진 슈퍼 유저 생성인 create_superuser 두 가지가 있다.

 

  1. create_user 함수에서 email과 user_name이 유효하다면 pssword를 저장하고 유저 정보를 save 한다
  2. create_superuser 함수에서는 is_staff, is_superuser, is_active의 기본값을 모두 True로 변경한 후 create_user를 return 하여 관리자 권한을 가진 유저를 생성한다.

 


이제 유저의 생성 방식을 지정해 주었으니 custom user model을 만들어 보자

 

 PermissionsMixin 함께 상속하면 Django의 기본 그룹, 허가권 관리 등을 사용할 수 있으므로 AbstractBaseUser와 함께 상속받는 NewUser를 만든다.

 

users/models.py

  • email : 이메일 형식 필드, 글자 크기 최대 255 , unique = True를 사용하여 중복 금지
  • user_name : 문자열 형식 필드, 글자 크기 최대 100, unique = True
  • is_staff : 해당 유저가 관리자인지를 판별해주는 bool형식 필드, default = False
  • is_active : 해당 유저가 활동 가능한 상태인지 허가해주는 bool형식 필드, default = True
  • created_at : 해당 유저의 생성시간을 표시해주는 datetime 필드, default = timezone.now (현재 시각) 
  • create_comment : 해당 유저가 오늘 게시글을 작성했는지 여부를 판별해주는 bool형식 필드, default = False

 

 

settings.py 등록

생성한 유저 모델을 인증을 위한 유저 모델로 사용하기 위해서는 아래와 같이 settings.py에 등록해줘야 한다.

config/settings.py

 

 

참고