인프런 커뮤니티 질문&답변

김영빈님의 프로필 이미지
김영빈

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

커스텀 유저 지정 및 회원가입 구현

User모델에 대하여 질문입니다.

작성

·

225

0

안녕하세요? 

현재 강의를 다시들으면서 헷갈리는 내용을 정리해 나가고 있습니다.

 

3분30~4분30초 즈음에 common.py에서 

AUTH_USER_MODEL = "accounts.User"로 바꿔주시면서,

원래 default값이 auth.user라고 해주시는데요

 

이 auth.user가

https://github.com/django/django/blob/6a80fd1465277d465c146cab57ffa41cbae1c5ce/django/contrib/auth/models.py#L402

있는 user클래스가 맞나요?

그래서 원래 장고내부적으로 설정을 하지 않으면 auth.user라는 user모델이 돌아가는 것이고(그래서 migration을 그냥 하면 auth.user로 만들어진 db가 생성되는 것이구요)

 

우리가 필요에 따라 커스터마이징한 User모델(accounts.user)을 만들어줄 경우 그 커스터마이징한 User모델이 장고프로젝트 내부에서 통용되는 Usermodel이라고 선언을 해주는 작업으로 이해해도 될까요?

+그러면 만약 get_user_model로 user모델을 가져올 경우, 들고와지는 user모델은 settings.AUTH_USER_MODEL에서 선언된 모델이 되는 것인가요?

 

늘 감사합니다!

 

 

 

 

답변 2

0

김영빈님의 프로필 이미지
김영빈
질문자

헉.. 늘 빠른 답변에 정말로정말로 감사드립니다. 실례지만 하나만 더 여쭙고 싶은데요ㅠㅠ

 

최근에 파이썬을 공부하면서 abc(abstract base class)라는 개념을 배웟습니다. 자료구조의 뼈대가 되는 iterable이나 collections같은 클래스를 관리하면서 오로지 자료구조간의 '위계'를 세우기 위하여 사용하는 추상적인 클래스라고 배웠는데요

 

user모델역시 models.Model > AbstractBaseUser > AbstractUser > User라는식으로 클래스들간의 위계가 세워지더군요.

여기서 abstact라는 부분이 파이썬의 abc, 그러니까 User모델들의 원형(?)이라는 느낌을 주기 위해서 사용하는 것 같은데 맞을까요?(혹은 파이썬이나 개발전체에서 통용되는 abstact의 개념을 그냥 django가 차용한 것일까요?)

또 AbstractBaseUser같은 경우는 password를 관리하던데, AbstractUser에 비해 관리되는 정보가 조금 더 중요해서 Base라는 개념으로 나누어서 관리하는 것일까요?(혹은 password의 암호화와 같은 복잡한 내부로직이 존재하기 때문에 따로 분리해서 다루는 걸까요?)

가끔식 abstact와 Base라는 단어가 장고에서 보이는 것 같은데, 단어들을 볼때마다 비슷한 뉘앙스로 받아들일 수 있다면 훨씬 학습하기가 쉬울 것 같아서 여쭤봅니다..

이런부분은 정말 찾아봐도 나오지가 않더라구요.. 어쩌면 정답이 없을 수도 있는 질문같은데, 강사님의 의견이 궁금합니다!

시간 내주셔서 정말 감사합니다!

 

이진석님의 프로필 이미지
이진석
지식공유자

파이썬의 abc(abstract class)는 부모 클래스의 미구현 추상메서드를 자식 클래스에서 반드시 구현하도록 **강제**하는 기능입니다. 핵심키워드가 **강제**인거죠. 강제할 목적이 없다면 abc없이 단순히 상속만 받으셔도 동작은 합니다.

장고 모델의 Meta.abstract = True 옵션은 위 abc와는 관련이 없구요.

Meta.abstract = True 옵션이 지정된 모델 클래스는 장고 마이그레이션 시에 데이터베이스 테이블을 생성하지 않는다는 선언입니다. 다른 모델 클래스의 부모 클래스로 사용될 클래스에서 주로 사용됩니다.

Abstract / Base 네이밍은 단순히 네이밍일 뿐이며, 이름만으로 어떤 특별한 동작을 하는 것은 아닙니다. 단독으로 사용되지 않고 부모 클래스로 사용된다는 의도를 모델 클래스 이름에 표현한 것입니다.

auth.User 는 다양한 계층으로 상속받아 User 모델을 만드는 데요. 계층 별로 User에 필요한 기능들을 쌓아가고 있습니다. 커스텀을 원하는 계층을 상속받아서 기능을 구현할 수 있도록 다양한 계층을 지원하는 것으로 보실 수 있습니다.

화이팅입니다. :-)

김영빈님의 프로필 이미지
김영빈
질문자

감사합니다~

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

설명하신 내용과 보여주신 User 모델의 코드가 맞습니다.

AUTH_USER_MODEL의 디폴트 값은 "auth.User" 입니다. 그러니 말씀하신 대로 AUTH_USER_MODEL 값을 변경하지 않으면 "auth.User" 설정을 통해, auth 앱의 User 모델을 프로젝트의 User 모델로서 활용하게 되는 것입니다.

https://github.com/django/django/blob/4.0.3/django/conf/global_settings.py#L515

get_user_model 코드를 보시면 settings.AUTH_USER_MODEL을 참조하고 있음을 확인하실 수 있습니다.

https://github.com/django/django/blob/4.0.3/django/contrib/auth/__init__.py#L170

그러니 장고 프로젝트에서는 활성화된 User 모델 클래스가 변경될 수 있기에

get_user_model() 을 통해 현 프로젝트의 User 모델 클래스를 참조하여야하며,

외래키로 지정 시에는 get_user_model()을 지정하시거나 settings.AUTH_USER_MODEL을 지정하시는 것이 맞는 방법입니다.

화이팅입니다. :-)

김영빈님의 프로필 이미지
김영빈

작성한 질문수

질문하기