1. 일반적인 앱등록에서 생길 수 있는 의문점 : 과연 앱이름. apps. 앱이름 Config의 형식으로 등록하는 것이 맞는지 앱이름만으로 등록하는 게 맞는지에 대한 의문
INSTALLED\_APPS = \[
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'erp.apps.ErpConfig',
'accounts.apps.AccountsConfig',
'mathfilters',
\]
Django 프로젝트를 만들게 되면 위와 같이 INSTALLED_APPS 에 새로 생성한 앱을 등록하고 사용하는 것을 접할 수 있습니다. 여기서 보통은 위의 이미지와 같이 erp.apps.ErpConfig, accounts.apps.AccountsConfig 와 같이 등록하지 않고 erp 또는 accounts와 같이 앱의 이름만 적어서 등록을 할 텐데 이는 앱이 만들어질 때 같이 만들어지는 부분 중에 app.py에 등록되어 있는 클래스에서 Configuration 관련된 함수에서 name 값을 그 앱의 이름으로 지정하고 있어서 앱이름만 작성하여도 위와 같은 내용과 같다는 것으로 작동하여서 문제가 없다는 것을 먼저 알아두면 되겠습니다.
해당 내용은 밑의 코드로 확인 가능합니다
class ErpConfig(AppConfig):
default\_auto\_field = 'django.db.models.BigAutoField'
name = 'erp'
의 내용은 erp 앱 하부의 app.py의 내용입니다.
2. Django project 생성시 INSTALLED_APPS 에 자동으로 등록된 패키지나 앱들도 pip install로 가져온 다른 패키지들처럼 외부적으로 사용할 수 있을 텐데 꼭 INSTALLED_APPS에 등록하고 사용해야 하는지에 대한 의문
두괄식으로 설명하자면 외부패키지를 사용하는 것과 같이 사용이 가능하지만 권장되지는 않고 이렇게 사용할려면 수많은 의존성 문제를 해결해야 할 것으로 생각됩니다. 또한 이런 INSTALLED_APPS에 등록하는 행위는 Django라는 framework에서 제공하는 여러 확장되는 기능을 사용할 수 있게 하는 것이라고 생각하면 되겠습니다.
개인적으로 비유를 해서 정의하자면 사람으로 치면 INSTALLED_APPS에 등록하는 내용은 사람을 구성하는 신체에 대해서 이야기 한다고 하면 외부 패키지는 삽이나 망치나 펜과 같은 도구라고 생각할 수 있겠습니다.
추가설명
INSTALLED_APPS에 등록되지 않은 앱의 모듈들을 직접 import하여 사용하는 것은 가능합니다. 하지만 이는 일반적으로 권장되지 않는 방법입니다.
INSTALLED_APPS에 등록되지 않은 앱의 모듈을 import하여import 하여 사용하는 경우, 해당 앱의 모든 의존성을 직접 해결해야 하기 때문입니다. 예를 들어, django.contrib.admin 앱을 INSTALLED_APPS에 등록하지 않고, django.contrib.admin 모듈을 import 하여 사용하는 경우, django.contrib.admin 앱의 의존성인 django.contrib.auth, django.contrib.contenttypes 등의 다른 앱과 모듈들의 의존성도 직접 해결해야 합니다. 이러한 작업은 복잡하고 오류 발생 가능성이 높습니다.
또한, INSTALLED_APPS에 등록되지 않은 앱의 모듈을 사용하는 것은 Django가 지원하는 방식이 아니기 때문에, Django의 업그레이드나 버전 변경 등에 취약해질 수 있습니다.
따라서, INSTALLED_APPS에 등록되어 있지 않은 앱의 모듈을 직접 import하여 사용하는 것은 권장되지 않습니다. 대신, 해당 앱을 INSTALLED_APPS에 등록하고, Django가 앱을 자동으로 로드하게 하여 앱의 모든 기능을 사용할 수 있도록 해야 합니다.
그리고 추가적으로 설명하자면 Django는 INSTALLED_APPS 리스트에 등록된 앱을 로드할 때, 해당 앱 내의 여러 모듈들을 한 번에 로드합니다. 이렇게 하면 앱의 모든 기능을 사용할 수 있게 됩니다. 반면에, INSTALLED_APPS에 등록되지 않은 앱의 모듈을 import 하여 사용하면, 해당 모듈만 로드되고, 앱 내의 다른 모듈들은 로드되지 않습니다.
중요 개념
예를 들어, django.contrib.admin 앱은 INSTALLED_APPS에 등록되어야 하며, 해당 앱의 기능을 사용하려면 INSTALLED_APPS에 등록되어 있어야 합니다. 이 앱에는 admin.py, models.py, views.py 등 여러 모듈이 포함되어 있습니다. INSTALLED_APPS에 등록되어 있지 않은 경우 django.contrib.admin 모듈만 로드되고, admin.py, models.py, views.py 등의 다른 모듈은 로드되지 않기 때문에 해당 앱의 모든 기능을 사용할 수 없습니다.
따라서, INSTALLED_APPS에 등록된 앱은 Django에 의해 자동으로 로드되고, 해당 앱의 모든 모듈이 로드되기 때문에, 앱의 모든 기능을 사용할 수 있게 됩니다. 여기서 로드된다는 의미를 잘생각해보아야겠습니다.
Django 서버가 실행되고 동적으로 쿼리에 접근하고 모델의 구조를 짜인 형태로 사용하는 등의 일련의 과정을 그리고 앱과 앱과의 관계등에 대해서 INSTALLED_APPS에 등록함으로써 내부적으로 해결을 해준다고 생각됩니다.
바로 위의 두 문단에 대한 설명은 밑에 링크한 공식문서의 내용에서 확인 가능합니다.
How Applications are loaded
동일한 내용으로 많은 자료를 찾아봐도 너무 당연하게 생각되는 개념이라서 그런지는 몰라도 같은 질문에 대한 답을 찾아보기는 어려웠습니다. 위 내용은 Django 공식문서와 다른 자료들에서 인사이트를 조금씩 얻어서 작성하였습니다.
잘못된 내용이 있다면 알려주시길 바랍니다.
'DevLog' 카테고리의 다른 글
[개발환경셋팅] 2. commit message template, pull request template 설정 (0) | 2023.05.08 |
---|---|
[개발환경셋팅] 1. Django 프로젝트 Boilerplate 만들기 (1) | 2023.05.08 |
[개념완성] get_object_or_404 (0) | 2023.04.21 |
[고찰] 'NamedTuple' 클래스의 해결되지 않은 속성 참조 'multi_hand_landmarks' (0) | 2023.03.06 |
[Tools] cv2.Canny() (0) | 2023.03.06 |