[drf] python에서의 경로 설정 (os.path VS Path)

최동혁·2023년 5월 12일
2

DRF

목록 보기
14/19

django의 BASE 경로

settings.py

os.path 모듈

  • 장고에서 기본적으로 세팅되어 있는 BASE_DIR
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  • os.path 모듈을 사용하여 __file__ 변수의 절대 경로를 가져온 다음, dirname() 함수를 두 번 호출하여 해당 경로의 부모 디렉토리를 가져온다.
    • 여기서 __file__ 현재 파일의 상대 경로이다.
    • abspath는 절대 경로로 변환해주는 메소드이다.
    • os.path.abspath(__file__)은 현재 코드를 실행하는 파일의 절대경로를 반환해준다.
  • 이렇게 함으로써 현재 파일의 부모 디렉토리의 부모 디렉토리를 BASE_DIR 변수에 할당한다.
    • os.path.dirname은 현재 파일의 부모 디렉토리의 절대 경로를 말해준다.
  • 이 방법은 os.path 모듈의 함수를 사용하여 경로를 조작하는 전통적인 방법이다.
  • 즉, BASE_DIR는 현재 장고 프로젝트가 위치하고 있는 절대 경로를 반환 받은 객체이다.

Path 객체

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
  • __file__은 현재 파일의 상대 경로를 나타내며, Path(__file__)은 해당 경로를 Path 객체로 변환한다. resolve() 메서드는 실제 파일 시스템에서의 절대 경로를 반환하고, parent 메서드는 부모 디렉토리를 반환한다. 이 코드는 현재 파일의 부모 디렉토리의 부모 디렉토리를 BASE_DIR 변수에 할당한다. 이렇게 함으로써 Django 프로젝트의 루트 디렉토리를 참조할 수 있다.

둘의 장단점

os.path 모듈 사용 시의 특징

장점:
  • 표준 라이브러리인 os.path는 파이썬의 일부로 제공되기 때문에 추가 설치가 필요하지 않다.
  • 기존 파이썬 코드에서 많이 사용되고 익숙한 방식이다.
단점:
  • 함수 기반의 인터페이스를 제공하므로 경로 조작을 위해 여러 함수를 조합해야 한다.
  • 경로 조작의 결과물은 문자열 형식으로 반환된다.
    일부 기능은 다른 플랫폼에서 이식성에 제약을 가질 수 있다.

Path 객체 사용 시의 특징

장점:
  • pathlib 모듈의 Path 클래스는 객체 지향적인 인터페이스를 제공하므로 경로 조작을 메서드 호출로 직관적이고 간결하게 수행할 수 있다.
  • 경로 조작 메서드들은 체인으로 연결하여 읽기 쉽고 유지보수가 용이한 코드를 작성할 수 있다.
  • 경로 조작 결과물은 Path 객체로 반환되므로 경로에 대한 다양한 작업을 쉽게 수행할 수 있다.
단점:
  • pathlib 모듈은 Python 3.4 이상에서 사용할 수 있으므로, 이전 버전의 Python을 사용하는 경우에는 추가 설치가 필요하다.
  • 기존 코드에 비해 상대적으로 새로운 방식이므로 익숙하지 않을 수 있습니다.

결론

  • 공식 문서를 읽으면서 깨닫게 된것은, os.path 모듈을 사용하는 것은 함수 인터페이스 관련이기 때문에 가독성이 떨어진다.

  • os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

  • 직관적이지 않고, 영어 해석하듯이 뒤에서부터 해석해야 한다.

  • 순서대로 해석하면, 부모 디렉토리(부모 디렉토리(현재 파일의 절대 경로))

  • 하지만 Path 객체를 사용했을시 객체 지향 인터페이스를 제공하므로, 가독성이 매우 뛰어나다.

  • Path(__file__).resolve().parent.parent

  • 순서대로 해석하면, 현재 파일의 절대 경로의 부모 디렉토리의 부모 디렉토리

즉, 파이썬 3.4 버전 이상을 쓰는 사용자라면 Path 객체를 사용해서 경로를 조작해주는 것이 코드 가독성이나 유지보수 그리고 경로에 대한 다양한 작업을 쉽게 수행할 수 있다!

profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글