이 튜토리얼에서는 Django에서 정적 파일이 무엇인지, 이를 효율적으로 관리하는 이점, 웹 애플리케이션에서의 목적에 대해 살펴보고, 다양한 방법과 도구를 사용하여 정적 파일을 관리하고 제공하는 방법을 설명하기 위한 데모 프로젝트를 설정해 볼 것입니다.
Django는 웹 개발자에게 빠르고 효율적으로 웹 애플리케이션을 만들 수 있는 강력한 도구 키트를 제공하는 고수준의 Python 웹 개발 프레임워크입니다.
다장고는 웹 애플리케이션을 빠르고 효율적으로 만들기에 좋다는 동시에, 개발하는 웹 애플리케이션의 모양새와 느낌을 신경쓰는 것도 매우 중요합니다. 이를 위해서는 애플리케이션의 모양새와 느낌을 제공하는 자산을 관리하는 방법을 배워야 합니다.
다장고에서의 정적 파일
다장고에서 정적 파일은 서버에서 어떤 처리도 하지 않고 바로 클라이언트에 제공되는 파일들입니다.
이들은 일반적으로 CSS, JavaScript 파일, 이미지, 아이콘, 폰트 등 웹 애플리케이션의 모양새와 느낌에 필수적인 자산들을 포함합니다.
다장고는 이러한 정적 파일을 효율적으로 관리하고 제공할 수 있는 메커니즘을 제공하여 원활한 사용자 경험을 보장합니다.
정적 파일을 효율적으로 관리하기
웹 애플리케이션의 사용자들이 좋은 사용자 경험을 할 수 있고 애플리케이션이 예상대로 작동하도록 하려면 정적 파일을 효율적으로 관리해야 합니다.
정적 파일을 적절하게 구성하고 캐싱하면 페이지 로드 시간이 빨라지고 반응성이 개선되어 전반적인 사용자 만족도를 높일 수 있습니다.
다장고는 정적 파일 처리를 도와주는 다양한 도구와 규칙을 제공합니다.
웹 애플리케이션에서 정적 파일의 목적
정적 파일은 매우 중요한데, 이는 웹 애플리케이션의 모양과 느낌을 결정하기 때문입니다. 애플리케이션 내의 구성 요소들이 어떻게 스타일링되고, 사용자 상호작용에 응답하는 방식, 그리고 결국 사용자가 특정 웹 애플리케이션을 방문할 때 보게 되는 것들을 정의합니다.
정적 파일을 효율적으로 제공할 때, 시각적으로 매력적이고 반응형인 사용자 인터페이스를 만들 수 있어, 애플리케이션이 더 매력적이고 사용자 친화적이 됩니다.
데모 프로젝트 설정
Django에서 정적 파일 관리의 개념을 설명하기 위해, 빈 바탕으로부터 데모 프로젝트를 설정해 보겠습니다.
이 프로젝트에서는 Django 프로젝트를 생성하고, 정적 파일 설정을 구성하며, 간단한 웹 애플리케이션에 정적 파일을 통합할 것입니다.
데모 프로젝트를 따라가면서 Django에서 정적 파일을 관리하는 실습 경험을 쌓고, 웹 개발에서 그 중요성을 이해하게 될 것입니다.
이 튜토리얼의 목적을 위해, 사용자가 프로젝트의 홈 페이지를 방문할 때, 사이트에 환영하는 스타일링된 제목을 보여주는 랜딩 페이지를 만들겠습니다. 또한 JavaScript를 사용하여 오늘의 날짜를 표시하고, 페이지를 완성하기 위해 이미지를 제공할 것입니다.
프로젝트를 위한 디렉토리 생성
다음 명령어를 사용하여 데모 프로젝트를 보관할 디렉토리를 생성하겠습니다:
mkdir sitepoint_django_static_tut
가상 환경 생성
새 프로젝트를 가상 환경 내에서 격리하는 것이 좋습니다. 이는 각 프로젝트가 자체 의존성을 가지며 전역 Python 설치에 영향을 주지 않음을 의미합니다.
우리는 virtualenv
패키지를 사용하여 이것을 만들 것입니다. 만약 이것이 당신의 개발 환경에 설치되어 있지 않다면, pip install virtualenv
를 사용하여 설치하고, 다음 명령어를 사용하여 가상 환경을 생성하세요:
virtualenv myenv
위의 명령어는 myenv
라는 이름의 가상 환경을 생성합니다. 가상 환경을 사용하려면 활성화해야 합니다:
Linux/macOS:
. myenv/bin/activate
Windows:
. myenv\Scripts\activate
의존성 설치
가상 환경이 활성화되면 이제 프로젝트의 의존성을 설치할 수 있습니다. 먼저 Django를 설치해 보겠습니다. 다른 의존성들은 그것들의 사용을 보여주는 섹션에 도달할 때 설치하겠습니다:
pip install Django
이것은 작성 시점에서 최신 안정적인 버전인 Django 5.0을 설치합니다.
Django 프로젝트 생성
Django 설치가 성공적으로 완료되면 Django 관리 명령어에 접근할 수 있습니다. 가상 환경에서 Django 프로젝트를 생성하기 위해 이들을 사용해 보겠습니다:
django-admin startproject sitepoint_django .
위의 명령어는 sitepoint_django
라는 이름의 Django 프로젝트를 생성하고, 마지막의 점은 현재 디렉토리에서 프로젝트를 생성하고자 한다는 것을 의미합니다.
데모 앱 생성
정적 파일 관리의 다양한 개념을 설명하기 위해 프로젝트에 적어도 하나의 Django 앱을 생성해야 합니다:
python manage.py startapp static_demo
이렇게 하면 프로젝트에 static_demo
라는 이름의 새 앱이 생성됩니다. 프로젝트가 이를 인식하려면 프로젝트의 settings.py
파일에서 설치된 앱 설정에 추가해야 합니다. sitepoint_django/settings.py
를 열고, INSTALLED_APPS
설정으로 이동하여 아래와 같이 목록 맨 아래에 static_demo.apps.StaticDemoConfig
를 추가하십시오.
# sitepoint_django/settings.py
INSTALLED_APPS = [
# 기타 앱들
'static_demo.apps.StaticDemoConfig',
]
홈 페이지 템플릿 생성
사용자가 사이트의 홈 페이지를 방문할 때 HTML을 렌더링할 것입니다. static_demo
앱에서 templates
디렉토리를 생성하고, 그 안에 다른 디렉토리를 만들고 이름을 static_demo
로 지정하십시오. 이 디렉토리 안에 index.html
이라는 이름의 템플릿을 생성하면 경로는 static_demo/templates/static_demo/index.html
가 됩니다.
index.html
에 다음 코드를 넣으십시오:
<!-- static_demo/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sitepoint Django Tutorial</title>
</head>
<body>
<h2>Hello there, welcome to our great site!</h2>
</body>
</html>
인덱스 뷰 생성
사용자가 앱의 홈 페이지를 방문할 때마다 템플릿이 표시되도록 home.html
템플릿을 렌더링할 뷰 함수를 생성해야 합니다. static_demo/views.py
파일을 열고 다음 코드를 입력하십시오:
# static_demo/views.py
from django.shortcuts import render
def index(request):
return render(request, "static_demo/home.html")
static_demo URL 파일 생성
우리는 static_demo
앱의 인덱스 보기가 사용자가 우리 사이트를 방문할 때마다 홈페이지를 렌더링하도록 하고 싶습니다. 따라서 홈페이지를 렌더링할 뷰 함수를 위한 URL 스키마를 만들어야 합니다. 이를 위해 static_demo
앱에 urls.py
파일을 생성하고, static_demo
앱의 URL 파일을 프로젝트의 URL 파일에 연결해야 합니다.
따라서 static_demo
앱에서 urls.py
라는 이름의 파일을 생성하고 다음 코드를 추가합니다:
# static_demo/urls.py
from django.urls import path
from .import views
app_name = 'static_demo'
urlpatterns = [
path('', views.index, name="index"),
]
위의 코드는 프로젝트의 인덱스 보기에 대한 URL을 생성합니다. 따라서 사용자가 http://oursite.com/
와 같은 주소를 방문하거나, 개발 중에 http://127.0.0.1:8000
을 방문하면 인덱스 보기가 해당 요청에 응답하게 됩니다.
이제 프로젝트의 URL 파일에 추가합니다. sitepoint_django/urls.py
파일을 열고 다음 코드를 추가합니다:
# sitepoint_django/urls.py
from django.contrib import admin
from django.urls import path, include # include에 대한 import 추가
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('static_demo.urls')), # 이 줄 추가
]
위의 코드는 기본 urls.py
파일에 몇 가지 변경을 가했습니다. include
함수에 대한 import를 추가하여 Django에게 static_demo.urls
를 포함한다는 것을 알려줍니다.
프로젝트 테스트
이 시점에서 프로젝트의 초기 구성이 완료되었습니다. 모든 것이 잘 연결되었는지 확인하기 위해 개발 서버를 실행해 보겠습니다.
다음 명령어로 프로젝트를 실행하세요:
python manage.py runserver
모든 설정이 올바르게 완료되었다면, http://127.0.0.1:8000
에 방문할 수 있어야 합니다. 사이트에 환영하는 언스타일드 텍스트를 볼 수 있을 것입니다.
개발 환경에서 정적 파일 제공
페이지에 스타일을 추가하고, 날짜를 위한 JavaScript와 이미지를 추가하려면 프로젝트를 변경해야 합니다. 이를 증분적으로 진행하면서 다양한 방식으로 정적 파일을 제공하는 방법을 살펴보겠습니다.
정적 파일 디렉토리 설정
Django는 모든 정적 자산이 앱 별로 관리되어야 한다고 권장합니다: 즉, 특정 앱에 필요한 모든 CSS, JS 및 이미지는 해당 앱의 범위 내에 위치해야 합니다. 따라서 static_demo
앱을 업데이트하고 static
이라는 디렉토리를 생성하고, 그 안에 static_demo
라는 또 다른 디렉토리를 생성합니다. 그런 다음 static_demo
디렉토리 안에 css
, js
, images
라는 세 개의 디렉토리를 더 생성합니다. 결국 아래와 같은 구조를 갖게 됩니다.
static_demo/
└── static/
└── static_demo/
├── css/
├── js/
└── images/
static
디렉토리 안에 static_demo
디렉토리를 생성하는 이유는 정적 자산에 네임스페이스를 지정하는 데 도움이 되기 때문입니다. 두 개 이상의 앱이 있고 두 앱 모두 styles.css
라는 CSS를 가지고 있다면, Django는 첫 번째 스타일시트만 작동하고 다른 스타일시트를 구분할 수 없습니다. 따라서 이러한 자산을 네임스페이스 지정하여 Django가 템플릿에서 어떤 자산 파일을 참조하는지 알 수 있도록 합니다.
정적 파일 생성
이 단계에서는 개발 환경에서 파일을 제공하는 방법을 보여주는 데 필요한 최소한의 정적 자산을 설정합니다.
다음 코드를 추가하여 js
디렉토리에 todays_date.js
라는 파일을 생성하십시오.
/* static_demo/js/todays_date.js */
let formattedDate = new Date().toLocaleDateString();
document.getElementById('todaysDate').innerText = `The date today is ${formattedDate}`;
위의 코드는 JavaScript에서 오늘 날짜를 가져와 문자열로 형식화한 다음 todaysDate
ID를 가진 div에 표시합니다.
다음 코드를 추가하여 css
디렉토리에 styles.css
라는 파일을 생성하십시오.
/* static_demo/css/styles.css */
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin: 0;
}
h2 {
font-size: 24px;
color: green;
}
위의 코드는 Flexbox 레이아웃을 사용하여 페이지의 모든 항목을 수평 및 수직으로 중앙에 배치합니다. 또한 H2 요소의 글꼴 크기를 24px로 설정하고 색상을 녹색으로 설정합니다.
이미지의 경우 원하는 모든 이미지를 사용할 수 있습니다. 이미지를 images
디렉토리에 복사하고 이름을 기억하십시오.
정적 파일 설정 구성
개발 환경에서 정적 파일을 제공하려면 Django settings.py
파일에서 다음 설정을 설정해야 합니다. sitepoint_django/settings.py
파일을 열고 다음 설정이 있는지 확인하십시오.
# sitepoint_django/settings.py`
DEBUG=True
개발 중에는 일반적으로 Django 프로젝트 설정에서 DEBUG
를 True
로 설정하는 것이 좋습니다. 이 설정은 자세한 오류 메시지와 스택 추적과 같은 다양한 디버깅 기능을 활성화하며, 개발 중 문제를 진단하고 해결하는 데 귀중한 도움을 줍니다.
또한, DEBUG
가 True
로 설정되면 django.contrib.staticfiles
앱이 각 앱의 static
디렉토리에서 자동으로 정적 파일을 제공합니다. 이 동작은 정적 파일을 제공하기 위한 수동 구성 없이 개발 프로세스를 단순화합니다.
INSTALLED_APPS
설정에서 django.contrib.staticfiles
가 포함되어 있는지 확인하세요. 그렇지 않은 경우 프로젝트에 있는 앱 위에 추가하십시오. 예를 들어, 이 프로젝트에서는 다음과 같이 static_demo
앱 문자열 위에 추가하십시오:
# sitepoint_django/settings.py`
INSTALLED_APPS = [
'django.contrib.staticfiles',
'static_demo.apps.StaticDemoConfig',
]
Django에서 제공하는 django.contrib.staticfiles
앱은 개발 중에 정적 파일을 제공하는 데 필수적입니다. 기본적으로 각 앱 내에서 정적 파일 디렉토리를 찾기 위해 프로젝트의 앱을 순회합니다. 하지만 특정 앱과 연결되지 않은 추가 정적 자산이 있는 경우, settings.py
파일에서 STATICFILES_DIRS
설정을 설정하여 django.contrib.staticfiles
에 액세스할 수 있도록 할 수 있습니다. 이 설정을 사용하면 정적 파일이 위치한 추가 디렉토리를 지정할 수 있습니다. 예를 들면 다음과 같습니다:
# sitepoint_django/settings.py`
STATICFILES_DIRS = [
"/dir/with/staticfiles/static",
"/someother/dir/static",
"/home/example.com/static",
]
다음으로, DEBUG
와 STATICFILES_DIRS
외에도 장고 프로젝트 설정 파일에 포함해야 하는 또 다른 중요한 설정은 STATIC_URL
입니다. 장고는 STATIC_URL
에 대한 기본값을 제공하지만, 이미 존재하지 않는 경우 settings.py
파일에서 명시적으로 정의할 수 있습니다.
STATIC_URL
설정은 정적 자산이 제공될 기본 URL을 지정합니다. 예를 들어, STATIC_URL = "static/"
설정은 정적 자산을 /static/
URL 경로에서 제공하도록 장고에 지시합니다. 이는 예를 들어 static_demo
앱에 위치한 스타일시트 파일이 http://127.0.0.1:8000/static/static_demo/css/styles.css
와 같은 URL에서 접근 가능하다는 것을 의미합니다.
템플릿 업데이트
설정을 제외하고, 템플릿에서 정적 파일을 사용하려면 다음 HTML로 업데이트해야 합니다:
<!-- static_demo/index.html -->
<!-- 정적 파일 처리 기능 추가 -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sitepoint Django Tutorial</title>
<!-- 아래에 css 링크 -->
<link rel="stylesheet" href="{% static 'static_demo/css/styles.css'%}">
</head>
<body>
<h2>Hello there, welcome to our great site</h2>
<p id="todaysDate"></p>
<!-- 아래에 이미지 링크 -->
<img src="{% static 'static_demo/images/flowerImage.png' %}" alt="Flower Image">
<!-- 아래에 js 링크 -->
<script src="{% static 'static_demo/js/todays_date.js' %}"></script>
</body>
</html>
이 템플릿 업데이트는 우리에게 새로운 태그인 {% load static %}
를 소개합니다. 이 태그는 장고 템플릿 엔진에 의해 제공되는 정적 파일 처리 기능을 로드합니다. 장고 템플릿 파일에 이 태그를 포함시킴으로써 정적 파일과 관련된 템플릿 태그 및 필터를 사용할 수 있습니다.
예를 들어, 이것을 템플릿에서 사용하면 HTML 요소에서 이미지, CSS 및 JS와 같은 정적 파일을 참조할 수 있습니다. 이것을 사용하면 Django가 참조하는 정적 자산에 대한 URL을 생성할 수 있습니다:
<link rel="stylesheet" href="{% static 'static_demo/css/styles.css'%}">
<img src="{% static 'static_demo/images/flowerImage.png' %}" alt="Flower Image">
<script src="{% static 'static_demo/js/todays_date.js' %}"></script>
해당 설정과 템플릿 업데이트가 준비되면 프로젝트를 실행하여 개발 중에 파일이 제공되는지 확인해야 합니다. 다음 명령을 사용하여 프로젝트를 실행하십시오:
python manage.py runserver
모든 것이 올바르게 설정되면 http://127.0.0.1:8000
에서 개발 서버를 실행해야 합니다. 해당 링크를 방문하면 아래와 유사한 페이지가 표시되어야 합니다.
유사한 이미지가 있으면 정적 파일이 올바르게 적용되었음을 나타냅니다.
Django 개발에서 DEBUG=True
가 프로젝트 설정에 있고 django.contrib.staticfiles
가 활성화되어 있으면 Django의 개발 서버(runserver
)가 정적 파일을 제공할 수 있다는 점에 유의하세요. 이 시나리오에서 정적 파일(예: CSS, JavaScript 또는 이미지)에 대한 변경 사항은 Django에 의해 자동으로 감지되고 적용됩니다. 이러한 매끄러운 프로세스는 개발을 훨씬 간소화하며, 수동으로 새로 고침하거나 서버를 다시 시작할 필요 없이 변경 사항의 효과를 즉시 볼 수 있습니다.
그러나 프로덕션 환경에서 정적 파일을 제공하는 경우 별도의 웹 서버나 CDN을 사용하는 것이 일반적입니다. 이 경우 정적 파일의 변경 사항은 Django에서 자동으로 감지되고 적용되지 않을 수 있으며, 사용자에게 업데이트된 파일이 제공되도록 하기 위해 수동 조치가 필요할 수 있습니다. 또한 다른 방법(예: django.views.static.serve()
뷰)을 사용하여 수동으로 정적 파일을 제공하려는 경우 자동 감지 및 변경 사항 적용이 이루어지지 않을 수 있으며 정적 파일 업데이트를 처리하기 위한 자체 메커니즘을 구현해야 할 수도 있습니다.
WhiteNoise를 사용하여 정적 파일 제공
개발 중에 django.contrib.staticfiles
는 변경 사항을 만들 때 원활한 업데이트를 보장하면서 정적 자산을 제공하는 과정을 간소화합니다.
그러나 프로덕션으로 전환할 때 DEBUG=True
와 같은 설정은 비활성화되어야 하며 정적 파일은 CDN 또는 다른 서버에서 제공될 수 있습니다. 이는 두 환경을 연결하는 솔루션이 필요함을 의미합니다. 개발 중에 파일을 원활하게 제공하면서 프로덕션 환경을 정확하게 반영합니다.
WhiteNoise 패키지를 소개합니다. Django와 원활하게 통합하도록 설계된 WhiteNoise는 개발 및 프로덕션 환경에서 정적 파일을 제공하기 위한 강력한 솔루션을 제공하며 배포 단계 전반에 걸쳐 일관성과 신뢰성을 보장하는 통합 접근 방식을 제공합니다. WhiteNoise를 살펴보겠습니다.
Django에서 WhiteNoise 설치 및 구성
WhiteNoise를 시작하는 것은 간단합니다.이 섹션에서는 설치 프로세스를 안내하고 Django 프로젝트 내에서 WhiteNoise를 구성하는 방법을 안내합니다.
우리는 WhiteNoise를 다음과 같이 설치합니다:
pip install whitenoise
성공적으로 설치한 후, sitepoint_django/settings.py
로 이동하여 맨 아래로 스크롤하여 STATIC_URL
설정을 찾습니다. 그 아래에 STATIC_ROOT
설정을 추가하세요:
# sitepoint_django/settings.py
STATIC_ROOT = BASEDIR / "staticfiles"
위의 설정은 Django에게 collectstatic
이 실행될 때 프로젝트 내의 모든 앱에서 정적 자산을 수집하여 staticfiles
라는 이름의 디렉토리에 저장하도록 지시합니다.
다음으로 할 일은 collectstatic
관리 명령을 실행하는 것입니다:
python manage.py collectstatic
WhiteNoise를 활성화하려면 MIDDLEWARE
설정 목록에 추가해야 합니다. settings.py
파일을 편집하고 Django SecurityMiddleware
다음에 다른 모든 미들웨어 이전에 WhiteNoise 미들웨어를 추가하세요:
# sitepoint_django/settings.py
MIDDLEWARE = [
# ...
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware",
# ...
]
개발 환경에서 WhiteNoise 사용하기
위의 단계만으로도 WhiteNoise는 프로덕션에서 정적 파일을 제공할 수 있습니다. 하지만 이 시점에서 프로젝트를 실행하면 Django 개발 서버가 자동으로 정적 파일 처리를 담당합니다. 개발과 프로덕션에서 비슷한 동작을 얻기 위해 개발 환경에서도 파일 제공을 사용하는 것이 좋습니다.
이를 수행하려면 Django의 정적 파일 처리를 비활성화하고 WhiteNoise가 설정 파일을 간단히 편집하여 INSTALLED_APPS
목록에 WhiteNoise를 추가하여 django.contrib.staticfiles
위에서 제어를 받도록 합니다:
# sitepoint_django/settings.py
INSTALLED_APPS = [
# ...
"whitenoise.runserver_nostatic",
"django.contrib.staticfiles",
# ...
]
또한 DEBUG
를 False
로 설정하여 비활성화해야 합니다:
# sitepoint_django/settings.py
DEBUG=False
이러한 단계들로 인해 WhiteNoise 패키지를 사용하여 정적 자산을 원활하게 제공할 수 있습니다.
WhiteNoise가 파일을 실제로 제공하고 있는지 확인하려면 INSTALLED_APPS
설정 목록에서 django.contrib.staticfiles
옵션을 제거하거나 주석 처리할 수 있습니다. 그러나 django.contrib.staticfiles
를 제거하면 collectstatic
명령과 같은 몇 가지 정적 파일 관리 명령이 사용불가능하게 되므로 주의해야 합니다. 이 명령은 앱의 정적 파일을 단일 디렉토리로 수집하고 통합하여 프로덕션 환경에서 효율적인 제공을 위해 필수적입니다.
고급 WhiteNoise 구성 옵션
위의 단계는 대부분의 경우에 충분하지만, WhiteNoise는 구성을 위한 몇 가지 추가 옵션을 제공합니다. 예를 들어, 프로젝트에 압축 및 캐싱 지원을 추가할 수 있습니다. 이를 활성화하려면 sitepoint_django/settings.py
파일을 열고 다음 설정을 추가하십시오:
# sitepoint_django/settings.py
STORAGES = {
# ...
"staticfiles": {
"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
},
}
위의 설정은 WhiteNoise가 정적 파일을 압축하고 고유한 이름으로 해시하여 안전하게 캐시되도록 보장합니다.
공유 호스팅 환경에서 WhiteNoise 사용
공유 호스팅은 여러 웹사이트가 단일 물리적 서버에 호스팅되는 웹 호스팅 서비스의 한 유형입니다. 이 설정에서 디스크 공간, 대역폭, 처리 능력과 같은 리소스는 여러 사용자 간에 공유되어 작은 에서 중간 크기의 웹사이트를 호스팅하기에 저렴한 옵션입니다.
공유 호스팅 환경은 일반적으로 호스팅 제공업체에 의해 관리되며, 서버 유지 보수, 보안 및 기술 지원을 처리하여 웹사이트 소유자가 서버 관리 작업에 대해 걱정하지 않고 웹사이트 구축 및 관리에 집중할 수 있도록 합니다.
공유 호스팅에서 정적 파일 관리의 과제
공유 호스팅은 많은 웹사이트에 대한 저렴하고 편리한 호스팅 솔루션을 제공하지만, VPS나 데디케이티드 서버와 같은 다른 유형의 호스팅과 비교할 때 제한이 있습니다. 이러한 제한에는 다음이 포함됩니다.
-
서버 구성과 설정에 대한 제한으로 인해 서버 소프트웨어를 맞춤화하거나 추가 도구를 설치하는 능력이 제한됩니다.
-
디스크 공간과 같은 자원 제약 조건도 역할을 하며, 방문자에게 이러한 파일을 제공하는 데 사용할 수 있는 대역폭의 양에 제한이 있을 수 있습니다.
-
공유 호스팅에서 성능은 또 다른 과제일 수 있으며, 다른 사용자와 자원을 공유하면 특히 높은 트래픽이나 자원 사용 시기에 정적 파일의 로드 시간이 느려질 수 있습니다.
WhiteNoise를 사용하도록 구성
WhiteNoise는 Django와 원활하게 통합되는 Python 패키지로, 공유 호스팅 환경에서 정적 파일을 제공하기 위한 이상적인 선택입니다. Apache
나 Nginx
와 같은 다른 소프트웨어 설치와 달리, 특정 호스팅 환경에서 허용되지 않을 수 있지만, WhiteNoise는 다른 프로젝트 패키지와 함께 쉽게 설치할 수 있습니다.
Django 설정을 통해 WhiteNoise를 사용하도록 구성하면 추가 서버 소프트웨어 없이 Django 애플리케이션에서 직접 정적 파일을 효율적으로 제공할 수 있습니다. 이를 통해 설정 과정이 단순화되고 다양한 호스팅 서비스 제공업체와의 호환성이 보장됩니다.
대부분의 공유 호스팅 제공업체는 서버 구성 및 파일 업로드를 수행할 수 있는 cPanel을 제공합니다. 따라서 파일을 업로드한 후 프로젝트의 settings.py
파일에 다음과 같은 변경 사항을 적용할 수 있습니다:
# sitepoint_django/settings.py
STATIC_URL='static/'
# cpanel 사용자명을 자신의 것으로 변경하세요
# https://example.com과 같은 메인 도메인에서 작업 중이라면 public_html을 사용하세요
STATIC_ROOT='/home/username/public_html/static'
# 또는
# https://subdomain.example.com과 같은 서브 도메인에서 작업 중이라면 폴더 이름을 사용하세요
STATIC_ROOT='/home/username/subdomain.mydomain.com/static'
이러한 설정이 완료되면 collectstatic
명령을 실행하여 정적 파일을 위에서 언급한 STATIC_ROOT
디렉토리 중 하나에 수집해야 합니다. 이는 도메인에 따라 달라집니다.
AWS S3에서 정적 파일 제공
Amazon Simple Storage Service (S3)는 Amazon Web Services (AWS)에서 제공하는 확장 가능한 객체 스토리지 서비스입니다. 이 서비스를 통해 버킷이라고 하는 스토리지 공간을 생성하여 문서, 이미지, 동영상 등 다양한 유형의 데이터를 저장할 수 있으며, 이 튜토리얼에서는 정적 파일에 중점을 두고 있습니다.
AWS는 여러 서비스, 포함하여 Amazon S3에 대한 무료 티어를 제공합니다. 무료 티어를 통해 사용자는 특정 기간 또는 특정 사용량 한도까지 AWS 서비스를 무료로 시작할 수 있습니다. 시작하려면 S3 무료 티어에 가입하십시오. 그러나 가입 절차를 완료하려면 결제 정보를 제공해야 합니다.
S3 버킷 생성
버킷을 생성하려면 S3 대시보드로 이동하여 버킷 만들기 버튼을 클릭하십시오.
버킷에 고유한 dns 규칙을 준수하는 이름을 지정하십시오. 옵션으로 사용자에게 더 가까운 지역을 선택할 수 있습니다.
버킷에 대한 ACL 사용.
버킷에 대한 공개 액세스를 활성화하려면 모든 공개 액세스 차단을 끄십시오.
성공적으로 생성되면 S3 페이지 메인에서 버킷을 볼 수 있어야 합니다.
IAM 액세스 활성화
버킷 생성 후 루트 사용자로 버킷을 사용할 수 있지만 AWS는 IAM(Identity Access Management) 사용자 그룹을 생성하고 특정 버킷에만 액세스 권한을 부여하는 것을 권장합니다.
IAM 그룹 생성
메인 IAM 페이지로 이동하여 사이드바에서 사용자 그룹을 선택한 다음 그룹 생성 버튼을 클릭하십시오. 그룹에 이름을 지정하십시오.
그런 다음 권한 정책 첨부에서 S3를 검색하고 AmazonS3FullAccess
를 할당한 다음 그룹 생성 버튼을 클릭하십시오.
IAM 사용자 생성
IAM 페이지에서 아직 떠나지 않았다면, 왼쪽 패널에서 사용자를 선택하고 사용자 생성 버튼을 클릭하세요.
IAM 사용자에게 이름을 지정하고 다음 버튼을 클릭하세요.
권한 설정 옵션 아래에서 사용자를 그룹에 추가를 선택한 채로, 사용자 그룹으로 이동하여 위에서 생성한 사용자 그룹을 선택한 후 다음 버튼을 클릭하세요.
검토 후 사용자 생성을 클릭하세요.
이제 사용자 이름을 클릭하여 사용자 세부 정보를 보세요. 보안 자격 증명 탭을 클릭한 다음 액세스 키 생성을 클릭하세요. 로컬 코드를 선택하고 다음 버튼을 클릭하세요.
그 후 액세스 키 생성 버튼을 클릭하세요. 키를 복사하여 .env
파일에 붙여넣을 수 있으며, 나중에 사용하기 위해 CSV 파일을 다운로드할 수도 있습니다.
Django를 AWS S3에 정적 파일 사용하도록 구성하기
S3 버킷을 생성한 후, 프로젝트를 S3에서 파일을 제공하도록 구성해야 합니다. 이전 섹션에서 정적 자산을 제공하기 위해 WhiteNoise를 구성했습니다. S3에서 자산을 제공할 수 있도록 WhiteNoise를 비활성화해야 합니다. 이를 위해 sitepoint_django/settings.py
파일로 이동하여 관련 코드 줄을 주석 처리하세요:
# sitepoint_django/settings.py
INSTALLED_APPS = [
# ...
# "whitenoise.runserver_nostatic",
# ...
]
MIDDLEWARE = [
# ...
# "whitenoise.middleware.WhiteNoiseMiddleware",
# ...
]
# STORAGES = {
# "staticfiles": {
# "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
# },
# }
위의 코드는 WhiteNoise를 위해 설정한 모든 설정을 주석 처리합니다.
패키지 설치
프로젝트가 S3와 함께 작동할 수 있도록 하려면 boto3와 django-storages라는 두 가지 패키지를 설치해야 합니다. boto3는 AWS 서비스와 상호 작용하기 위한 저수준 Python API를 제공하며, django-storages는 Amazon S3와 같은 클라우드 스토리지 제공업체와 통합하여 Django의 파일 스토리지 기능을 확장하므로써 Django 애플리케이션에서 정적 및 미디어 파일을 원활하게 관리하고 제공할 수 있게 해줍니다.
pip install boto3 django-storages
설정 구성
프로젝트가 S3에서 파일을 제공할 수 있도록 settings.py
파일을 다음과 같이 변경하고 업데이트해야 합니다.
# sitepoint_django/settings.py
import os # 우선 os 모듈에 대한 import를 추가합니다
# S3 스토리지 설정
STORAGES = {
'staticfiles': {
'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage',
'OPTIONS': {
'bucket_name': os.getenv('AWS_STORAGE_BUCKET_NAME'),
'location': 'static',
'querystring_auth': False,
},
}
}
위의 설정들은 프로젝트 내에서 사용되는 다양한 스토리지 백엔드를 정의하는 중앙 집중식 구성 컨테이너로서 기능하는 STORAGES
딕셔너리를 생성합니다.
이 설정은 Django 4.2 이상 버전에서만 사용 가능하다는 점에 유의해야 합니다. 이전 버전의 경우 문서를 참조하십시오.
위의 코드에서 우리는 정적 파일을 관리하기 위한 스토리지 구성을 식별하는 staticfiles
에 대한 설정을 가지고 있습니다.
STORAGES
설정 후 AWS 특정 설정을 설정 파일에 추가해야 합니다. 그러므로 STATIC_URL
설정이 있는 부분으로 스크롤하여 다음과 같은 변경을 수행하십시옘다:
# sitepoint_django/settings.py
USE_S3 = os.getenv('USE_S3')
if USE_S3:
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_S3_OBJECT_PARAMETERS = {
"CacheControl": "max-age=2592000",
}
else:
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
S3에 정적 파일 업로드
설정이 준비되면 다음 작업은 S3 버킷에 정적 파일을 업로드하는 것입니다. 이를 위해 collectstatic
을 실행합니다:
python manage.py collectstatic --no-input
이렇게 하면 프로젝트의 앱에서 모든 정적 파일을 수집하여 S3 버킷으로 이동하고, STORAGES
딕셔너리에 정의된 static
폴더에 넣게 됩니다. --no-input
플래그는 Django가 비대화 모드로 실행되도록 지시하여 사용자 입력에 대한 모든 프롬프트를 우회합니다.
사용할 때, Django는 사용자의 수동 개입 없이 자동으로 정적 파일 수집 과정을 진행합니다.
프로젝트 실행
모든 설정이 완료되면 프로젝트를 실행할 수 있습니다. 개발 환경에서 프로젝트를 실행하고 S3 버킷에서 파일을 제공해 보겠습니다:
python manage.py runserver
S3에서 파일을 제공하고 있는지 확인하려면 홈 페이지의 소스 코드를 볼 수 있습니다:
<link rel="stylesheet" href="https://sitepoint-django-static.s3.amazonaws.com/static/static_demo/css/styles.css">
<img src="https://sitepoint-django-static.s3.amazonaws.com/static/static_demo/images/flowerImage.png" alt="Flower Image">
<script src="https://sitepoint-django-static.s3.amazonaws.com/static/static_demo/js/todays_date.js"></script>
HTML 요소를 살펴보면 실제로 URL이 S3 버킷을 가리키는 것으로 나타납니다.
결론
요약하자면, Django에서 정적 파일을 관리하는 것은 프로젝트 요구 사항, 확장성 요구 사항 및 호스팅 환경 제약 조건을 평가하여 가장 적합한 방법을 선택하는 것입니다.
예를 들어, WhiteNoise 미들웨어는 리소스 제약 조건과 제한적인 서버 액세스로 인해 도전이 될 수 있는 공유 호스팅 환경에서 정적 파일 제공을 위한 효율적인 솔루션을 제공합니다.
Django 설정을 적절하게 구성하고 WhiteNoise와 같은 도구를 활용하여 개발자는 어떤 호스팅 환경에서든 안정적이고 최적화된 정적 파일 제공을 보장할 수 있습니다. 각 방법은 자체적인 장점과 고려 사항을 갖고 있으며, 프로젝트의 특정 요구 사항을 충족하고 매끄러운 사용자 경험을 제공하기 위해 신중한 평가가 필요합니다.
우리는 여러 중요한 포인트를 다루었습니다:
정적 파일 관리 방법 다양한 접근 방식에 대해 논의했습니다. 이 중에는 로컬에서 정적 파일을 제공하는 방법, Django의 내장 개발 서버를 사용하는 방법, Amazon S3과 같은 타사 스토리지 솔루션을 활용하는 방법, WhiteNoise와 같은 패키지를 사용하여 파일을 제공하는 방법 등이 있습니다. 각 방법은 확장성, 성능, 배포 용이성 등의 요소에 따라 자체적인 장점과 고려해야 할 사항이 있습니다.
일반적인 설정 및 명령어:
STATIC_ROOT
: 수집된 정적 파일이 저장될 디렉토리를 지정합니다.STATIC_URL
: 웹 서버를 통해 정적 파일에 접근하기 위한 기본 URL을 정의합니다.STATICFILES_DIRS
: 정적 자산을 포함하는 추가 디렉토리를 지정합니다.STATICFILES_STORAGE
: 정적 파일을 처리하는 스토리지 백엔드를 구성합니다.collectstatic
: 모든 앱 디렉토리에서 정적 자산을STATIC_ROOT
로 모읍니다.
추가 자료:
Source:
https://www.sitepoint.com/managing-static-files-in-django-a-comprehensive-guide/