import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
__file__
변수의 절대 경로를 가져온 다음, dirname() 함수를 두 번 호출하여 해당 경로의 부모 디렉토리를 가져온다. __file__
현재 파일의 상대 경로이다.os.path.abspath(__file__)
은 현재 코드를 실행하는 파일의 절대경로를 반환해준다.from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
__file__
은 현재 파일의 상대 경로를 나타내며, Path(__file__)
은 해당 경로를 Path 객체로 변환한다. resolve() 메서드는 실제 파일 시스템에서의 절대 경로를 반환하고, parent 메서드는 부모 디렉토리를 반환한다. 이 코드는 현재 파일의 부모 디렉토리의 부모 디렉토리를 BASE_DIR 변수에 할당한다. 이렇게 함으로써 Django 프로젝트의 루트 디렉토리를 참조할 수 있다.공식 문서를 읽으면서 깨닫게 된것은, os.path 모듈을 사용하는 것은 함수 인터페이스 관련이기 때문에 가독성이 떨어진다.
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
직관적이지 않고, 영어 해석하듯이 뒤에서부터 해석해야 한다.
순서대로 해석하면, 부모 디렉토리(부모 디렉토리(현재 파일의 절대 경로))
하지만 Path 객체를 사용했을시 객체 지향 인터페이스를 제공하므로, 가독성이 매우 뛰어나다.
Path(__file__).resolve().parent.parent
순서대로 해석하면, 현재 파일의 절대 경로의 부모 디렉토리의 부모 디렉토리
즉, 파이썬 3.4 버전 이상을 쓰는 사용자라면 Path 객체를 사용해서 경로를 조작해주는 것이 코드 가독성이나 유지보수 그리고 경로에 대한 다양한 작업을 쉽게 수행할 수 있다!