Django는 두 종류의 파일을 구분합니다: 정적 파일(애플리케이션의 일부인 자산—CSS, JavaScript, 함께 출시하는 이미지)과 미디어 파일(런타임에 사용자가 업로드한 파일—프로필 사진, 문서). 그 출처와 수명주기가 근본적으로 다르기 때문에 다르게 처리됩니다.
정적 파일 — 애플리케이션의 자산
STATIC_URL =
STATICFILES_DIRS = [BASE_DIR / ]
STATIC_ROOT = BASE_DIR /
<!-- template에서 -->
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<img src="{% static 'images/logo.png' %}">
정적 파일은 코드베이스의 일부입니다—CSS, JS, 폰트, 디자인 이미지. 버전 관리되고, 모든 사용자에게 동일하며, 프로젝트의 정적 디렉터리에서 제공됩니다.
python manage.py collectstatic
# 모든 정적 파일(app과 STATICFILES_DIRS에서)을 STATIC_ROOT로 모아,
# production에서 웹 서버 / CDN이 효율적으로 제공할 수 있게 함
production에서 collectstatic은 모든 app의 정적 파일을 하나의 디렉터리(STATIC_ROOT)로 통합하여 웹 서버나 CDN이 제공하도록 합니다—Django는 production에서 직접 제공하지 않습니다.
# settings.py
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media" # 업로드된 파일이 저장되는 곳
# 업로드 가능한 파일을 가진 model
class Profile(models.Model):
avatar = models.ImageField(upload_to="avatars/") # MEDIA_ROOT/avatars/ 아래 저장
document = models.FileField(upload_to="docs/")
profile.avatar.url # 업로드된 파일에 접근하는 URL
미디어 파일은 FileField/ImageField를 통해 런타임에 사용자가 업로드합니다. 동적이고, 버전 관리되지 않으며, 사용자가 콘텐츠를 업로드함에 따라 시간이 지나며 늘어납니다.
정적 파일 미디어 파일
출처 코드의 일부 런타임에 사용자가 업로드
버전 관리 예(커밋됨) 아니오(사용자 생성, .gitignore)
수명주기 고정(코드와 함께 변경) 동적(지속적으로 증가)
예시 CSS, JS, 로고, 폰트 아바타, 업로드된 문서, 사진
설정 STATIC_URL/ROOT/DIRS MEDIA_URL/ROOT
production collectstatic + CDN/서버 디스크/클라우드(S3)에 저장, 신중히 제공
✓ 정적 → 웹 서버(nginx)나 CDN으로 제공(캐시됨, 빠름)
✓ 미디어 → 확장성/영속성을 위해 클라우드 스토리지(S3)에 저장; 다중 서버
설정에서는 로컬 디스크가 동작하지 않음(파일을 공유해야 함) → S3/객체 스토리지 사용
✓ 보안 → 업로드된 파일을 검증(타입, 크기); 사용자 업로드 제공에 주의
(사용자가 악의적 콘텐츠를 업로드할 수 있음)
정적-vs-미디어 구분을 이해하는 것은 Django 애플리케이션을 올바르게 구축하고 제대로 배포하는 데 모두 중요합니다. 두 파일 타입은 근본적으로 다른 출처, 수명주기, 처리 요구사항을 갖기 때문입니다. 정적 파일(애플리케이션 자체의 CSS, JavaScript, 이미지, 폰트)은 코드베이스의 일부이고, 버전 관리되며, 모두에게 동일합니다—{% static %}을 통해 참조되고 collectstatic으로 통합되어 웹 서버나 CDN이 production에서 제공합니다. 미디어 파일(FileField/ImageField를 통한 사용자 업로드)은 동적이고, 런타임에 생성된 사용자 생성 콘텐츠이며, 버전 관리되지 않고, 지속적으로 늘어납니다.
이들을 혼동하거나 설정(STATIC_* vs MEDIA_*)을 잘못 구성하는 것은 "내 CSS가 로드되지 않아"나 "업로드가 안 돼" 문제의 흔한 원인이며, 특히 Django가 정적 파일을 직접 제공하지 않는 production에서(collectstatic과 적절한 서버/CDN이 필요) 그렇습니다.
이 구분은 중요한 production 및 보안 함의도 있습니다: 다중 서버 배포의 미디어 파일은 로컬 디스크에 의존할 수 없고(S3 같은 공유 클라우드 스토리지를 사용해야 함), 사용자 업로드는 악의적 콘텐츠로 인한 보안 위험을 피하기 위해 검증(파일 타입, 크기)과 신중한 제공이 필요합니다.
두 타입을 구성하고 처리하는 방법, collectstatic의 역할, production 고려사항(정적은 CDN, 미디어는 클라우드 스토리지, 업로드 보안)을 아는 것은 실제 Django 애플리케이션을 올바르게 구축하고 배포하는 데 실용적이고 자주 필요한 지식이며—이 이해가 해결해 주는 흔한 걸림돌입니다.