brunch

매거진 백엔드

You can make anything
by writing

C.S.Lewis

by 내가 사는 세상 Nov 20. 2023

Django - static, media

 장고에서 정적 파일들은 따로 모아서 관리한다. 이는 2종류로 구분된다. 

개발자가 미리 준비해두는 static 파일과, 

고객이 제공하는 프로필사진과 같은 media 파일이 있는 것이다.




목차

1. STATIC 파일  #개발자가 저장한 정적자료

  1.1. STATICFILES_DIRS

  1.2. STATIC_URL

  1.3. STATIC_ROOT

2. MEDIA 파일  #고객이 저장한 정적자료

3. 배포할 때 #Docker




1. STATIC 파일


static과 관련해서 settings.py에 적어줄 것들이 있다. 다음 3가지가 대표적이다.

 STATICFILES_DIRS

 STATIC_URL

 STATIC_ROOT




1.1. STATICFILES_DIRS


django는 하나의 project, 여러개의 app의 구성을 가진다. 그래서 각각의 app에 필요한 static 파일은 /app/static/app의 경로에 담아둔다. 다음처럼 말이다.

 

project/

|-- config/

|    |-- settings.py

|    |-- urls.py

|

|-- app/

|    |-- static/

|    |   |-- app/

|    |        |-- css/

|    |             |-- style.css

|

|-- manage.py 


 이 외에도 Django에서 정적 파일을 찾을 수 있는 디렉토리의 목록을 추가할 때, STATICFILES_DIRS를 사용한다. 이를 활용하여 프로젝트 전반에 사용되는 static 파일들이 담겨있는 곳을 추가할 수 있다.


STATICFILES_DIRS = [

      os.path.join(BASE_DIR, 'static'),  # assets 디렉터리를 정적 파일 디렉터리로 추가 

]


그럼 다음과 같이 폴더 구조를 확장시키면서, 전역적으로 사용되는 static 파일들도 설정이 가능하다.

project/

|-- config/

|    |-- settings.py

|    |-- urls.py

|

|-- static/  # 새로운 정적 파일 디렉터리 추가

|    |-- shared/

|        |-- common.css

|

|-- app/

|    |-- static/

|    |   |-- app/

|    |        |-- css/

|    |             |-- style.css

|

|-- manage.py


즉, <link rel="stylesheet" href="{% static 'shared/common.css' %}"> 이렇게 적어도 장고는 새로 추가한 static 파일들을 처리할 수 있게되는 것이다.



1.2. STATIC_URL


STATIC_URL = '/staticfiles/' #정적 파일에 대한 기본 URL을 정의 


 {% static '경로' %}을 사용할 때 settings.py의 STATIC_URL에 적혀있는 경로를 사용한다.

그래서 /staticfiles/css/style.css 파일은 템플릿에서 다음과 같이 참조할 수 있다.

<link rel="stylesheet" href="{% static 'css/style.css' %}">




1.3. STATIC_ROOT #python manage.py collectstatic


STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')  # collectstatic 명령 수행시, 정적 파일들이 모여들 디렉토리 위치를 지정


 해당 명령은 배포할 때 필요하다. 장고에서 collectstatic 명령으로 흩어져있는 정적(static) 파일들을 한곳에 모은다. settings에 지정한 경로에 파일들이 모인다. settings에 다음과 같이 설정해두고, python manage.py collectstatic 명령을 실행시키면 루트 디렉토리에 staticfiles라고 폴더가 생기고, 그 속에 개발자가 지정한 정적 파일들이 담긴다.





2. MEDIA 파일


media는 고객이 제공해주는 정적파일들이다. 고객이 서비스를 이용하면서 프로필 사진과 같은 자료를 등록할 때 해당 정적 파일들을 모아주는 폴더가 생긴다. settings에서의 설정 코드가 아래와 같다면


MEDIA_URL = '/mediafiles/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')


고객이 자료를 제공할 때 루트 위치에 mediafiles라는 폴더가 생긴다. 그리고 그 속에 고객이 제공한 자료들이 담긴다.




3. 배포할 때(named volume)


 nginx 웹서버를 이용해 정적(static) 파일들을 고객에게 전달한다고 해보자. drf에서 사용할 땐, 위의 과정이 이루어지지 않으면 admin페이지 같은 곳에서 디자인이 적용되지 않고 깨져보이는 현상을 마주하게 된다. 이는 구체적으로 배포과정에선 장고 컨테이너에서 collectstatic 명령을 수행한뒤, 생겨난 staticfiles 폴더를 nignx 컨테이너와 동기화하는 과정이다.


 우선 static파일들을 만들기 위해, 장고 컨테이너 안에서 collectstatic을 진행한다. 그러면 해당 도커 이미지로 만들어진 장고 컨테이너 안의 staticfiles라는 폴더에 정적 파일들이 생겨나게 된다. 



그리고 이를 nginx에 volume으로 동기화시켜주면 된다. mediafiles는 고객이 자료를 제공할 때 생겨나므로 volume 설정만 해주면된다.



nginx 컨테이너에서 staticfiles를 동기화시키는 과정이다. 핵심 코드는 다음과 같다.


services:

   nginx_proxy:

       volumes:

          - static-volume:/app/staticfiles

          - media-volume:/app/mediafiles


volumes:

  static-volume:

  media-volume:


실제 코드를 보면 다음과 같다.



매거진의 이전글 Django - 기본설정
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari