Django 프로젝트를 개발하다 보면, CSS, 이미지, JavaScript 같은 정적 파일들을 어떻게 처리할지 고민하게 됩니다.
특히 개발 환경에서는 잘 작동하지만, 배포하면 깨지는 경우가 많죠. 이 문제의 핵심은 Django가 웹 서버가 아니라는 점에서 출발합니다.
🧩 Django는 웹 서버가 아니다
- Django는 웹 프레임워크이지 웹 서버가 아닙니다.
- 웹 서버(Nginx, Apache 등)가 클라이언트의 요청을 받아 Django에게 전달합니다.
- 그러나 정적 파일 요청은 Django가 처리하지 않습니다.
⚠️ 정적 파일 요청은 기본적으로 실패한다
- 예: CSS, JS, 이미지 파일 요청
- 이 파일들은 Django가 자동으로 제공하지 않음
- 개발 환경에서는 runserver가 임시로 도와줌
- 하지만 운영 환경에서는 runserver 사용 X → 정적 파일 깨짐 현상 발생
🔧 개발 서버는 특별하다
- python manage.py runserver는 개발 편의상 정적 파일을 서빙함
- 이는 실제 운영 서버에서는 전혀 동작하지 않음
- 정적 파일 처리를 위한 별도 설정이 필요함
✅ 정적 파일 처리 방법 3가지
1️⃣ Django가 직접 정적 파일을 제공하게 설정
- urls.py에서 static() 설정 추가
- 예시:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
- 장점: 빠르게 구현 가능
- 단점: 성능이 낮고 운영 환경에 비효율적
2️⃣ 웹 서버(Nginx 등)를 통해 정적 파일 서빙
- Nginx에서 /static/ 경로로 요청이 오면, Django에 전달하지 않고 직접 정적 폴더에서 서빙
- Django는 오직 동적 요청만 처리
- 장점: 성능 향상, 리소스 분리 가능
- 단점: 웹 서버 설정 필요 (조금 복잡할 수 있음)
3️⃣ CDN 또는 별도 서버에서 정적 파일 서빙
- 정적 파일을 전용 서버나 CDN에 업로드
- 클라이언트는 CSS나 이미지 파일 요청 시, Django가 아닌 다른 주소로 요청
- 최고의 성능, 확장성 매우 우수
- ex) AWS S3 + CloudFront
💬 Django에서 왜 이렇게 따로 처리할까?
정적 파일은 빠르게, 효율적으로, 반복적으로 전송되어야 하기 때문입니다.
- Django는 템플릿 렌더링, DB 처리 등 무거운 작업 담당
- 정적 파일 요청까지 맡기면 오히려 비효율
- 그래서 웹 서버나 CDN이 이 역할을 대신하는 것이 이상적입니다
🧭 어떤 방식을 선택해야 할까?
상황 추천 방식
| 개발 중 | Django 직접 서빙 (runserver or static() 설정) |
| 소규모 배포 | 웹 서버에서 정적 파일 서빙 |
| 트래픽 많고 확장 필요한 서비스 | CDN 또는 전용 정적 파일 서버 사용 |
🚀 마무리: 성능은 정적 파일 처리 방식에 달렸다!
정적 파일은 단순하지만 웹사이트의 성능을 좌우합니다. Django는 정적 파일을 직접 처리하지 않기에, 웹 서버 설정 또는 외부 서비스와의 연동이 매우 중요합니다.
"모든 사람이 Facebook을 만드는 건 아니다. 하지만 좋은 성능은 모든 서비스가 필요로 한다."