Django: 배포 구조

Ohback·2025년 4월 11일

이미지 출처: https://sj1226m.tistory.com/36

1. 배포 메모

  • 환경 분리: DEBUG=False, ALLOWED_HOSTS, SECRET_KEY를 환경변수로
  • 정적 파일 수집: python manage.py collectstatic
  • ASGI/WGSI: uvicorn/daphne(gunicorn+uvicorn worker), Nginx 리버스 프록시

1-1. WSGI vs ASGI

Django는 기본적으로 웹 서버와 Django 앱을 연결하는 ‘인터페이스’가 필요한데, 그 표준이 WSGI 또는 ASGI이다.

구분WSGI (Web Server Gateway Interface)ASGI (Asynchronous Server Gateway Interface)
지원 방식동기(Synchronous) 요청 처리비동기(Asynchronous) + 동기 모두 지원
특징전통적인 HTTP 요청-응답 처리에 적합WebSocket, HTTP/2, 실시간 처리 가능
Django 버전3.0 이전은 WSGI만 지원3.0 이후 ASGI 공식 지원
예시gunicorn + Djangouvicorn/daphne + Django
  • 동기 방식:

    • 요청한 작업이 순서대로 처리됨.
    • 앞의 작업이 끝나야 다음 작업이 시작됨.
    • 예) 음식점에서 음식을 주문하고, 그 자리에 서서 음식이 나올 때까지 기다린 뒤 다음 주문을 받는 경우.
  • 비동기 방식:

    • 요청한 작업이 끝날 때까지 기다리지 않고 다음 작업을 바로 실행함.
    • 나중에 작업이 끝나면 알림(콜백)을 받아 결과를 처리.
    • 예) 음식점에서 음식을 주문하고, 자리에 앉아 있다가 음식이 나오면 종업원이 가져다주는 경우.

1-2. uvicorn, gunicorn

  • uvicorn
    • ASGI 서버 실행기

    • Django(ASGI)나 FastAPI 같은 비동기 프레임워크에서 사용

    • 가볍고 빠름 (uvloop, httptools 기반)

      uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000
      
  • gunicorn
    • WSGI 서버 실행기

    • 주로 Flask/Django(WSGI 모드)에서 사용

    • 비동기 지원 불가 → 하지만 uvicorn 워커와 함께 쓰면 ASGI 앱도 실행 가능

      gunicorn myproject.asgi:application -k uvicorn.workers.UvicornWorker
      

1-3. Nginx 리버스 프록시

  • *리버스 프록시(Reverse Proxy)**란?
    • 사용자가 요청을 보내면 Nginx가 먼저 받고, 그 뒤에 있는 애플리케이션 서버(uvicorn, gunicorn)로 전달
    • 정적 파일 처리, 로드밸런싱, HTTPS 인증서 관리 가능

흐름 예시

사용자 브라우저 → Nginx → uvicorn/gunicorn → Django

1-4. Django 배포 구조 예시

[사용자 브라우저]
       ↓
    (HTTP/HTTPS)
       ↓
   [Nginx]  ← 정적 파일(css/js) 직접 처리
       ↓
   [gunicorn -k uvicorn.workers.UvicornWorker]
       ↓
   [Django ASGI/WSGI 앱]
       ↓
   [데이터베이스, 캐시 서버 등]

2. REST(Representational State Transfer) API

REST API = HTTP를 기반으로 한 서버-클라이언트 간의 데이터 통신 규칙으로 웹에서 자원을 정의하고, 그 자원에 대한 주소(URL)를 통해 상태를 주고받는 아키텍처 스타일이다.

2-1. 특징

1) 자원(Resource): URL로 자원을 식별

예) `/users` → 사용자 목록, `/users/1` → ID가 1인 사용자

2) 행위(Verb): HTTP 메서드로 동작 구분
- GET → 데이터 조회
- POST → 데이터 생성
- PUT/PATCH → 데이터 수정
- DELETE → 데이터 삭제

3) 표현(Representation): JSON, XML 등 데이터 형태로 응답

2-2. REST API 예시

요청

GET /users/1 HTTP/1.1
Host: example.com

응답 (JSON)

{
  "id": 1,
  "name": "500",
  "email": "500@example.com"
}

2-3. REST API 만들기

pip install djangorestframework
  • settings.py
INSTALLED_APPS += ['rest_framework']
  • 간단 뷰셋:
# blog/serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"
# blog/api.py
from rest_framework.viewsets import ModelViewSet
from .models import Post
from .serializers import PostSerializer

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
# config/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from blog.api import PostViewSet

router = DefaultRouter()
router.register("posts", PostViewSet)

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", include(router.urls)),
]
profile
기록은 기억을 지배한다.

0개의 댓글