Django는 유연하고 확장성이 뛰어난 웹 프레임워크로 잘 알려져 있습니다. 그중에서도 Middleware는 Django의 요청(Request)과 응답(Response) 과정에서 중요한 중간 역할을 합니다. 오늘은 Django Middleware가 어떻게 작동하는지, 사용자 정의 Middleware를 어떻게 작성하는지, 그리고 활용 사례를 중심으로 깊이 있는 내용을 다뤄보겠습니다. Middleware 개발 시 고려해야 할 점도 함께 확인해볼게요! 😊
Django에서 Middleware는 클라이언트의 요청(Request)과 서버의 응답(Response) 사이를 중계하며, 데이터를 처리하거나 변환할 수 있는 중간 계층입니다. 쉽게 말하면, 클라이언트와 서버 사이에서 특정 작업을 자동으로 처리해주는 필터 같은 역할을 합니다.
Middleware는 Django 프로젝트의 settings.py
파일에서 순서대로 실행되며, 실행 순서는 시스템 전체에 큰 영향을 미칩니다.
Middleware는 Django의 요청/응답 라이프사이클에 깊이 관여합니다. 다음은 Middleware의 주요 흐름입니다:
Django에서 Middleware는 다음과 같이 settings.py
파일에서 설정됩니다:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
이 설정에서 위에서 아래로 실행된다는 점을 기억하세요. 특정 Middleware의 순서가 잘못되면 예기치 않은 동작이 발생할 수 있습니다!
이제 실제로 Middleware를 작성해볼까요? 아래는 요청 URL과 요청 처리 시간을 로깅(Log)하는 사용자 정의 Middleware입니다.
import time
class LoggerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 요청 처리 전
start_time = time.time()
# 요청 처리
response = self.get_response(request)
# 응답 처리 후
duration = time.time() - start_time
print(f"요청 URL: {request.path}, 처리 시간: {duration:.2f}초")
return response
위 코드에서:
__init__
: Middleware가 초기화될 때 실행됩니다.__call__
: 요청(Request)과 응답(Response)을 처리하는 메인 메서드입니다.
settings.py
에 Middleware 등록
작성한 Middleware를 사용하려면 Django 설정 파일에 등록해야 합니다. 아래와 같이 추가하면 됩니다:
MIDDLEWARE = [
# 기존 Middleware
'myproject.middleware.LoggerMiddleware', # 새로 추가
]
이제 모든 요청에 대해 URL과 처리 시간이 로그로 출력됩니다.
Middleware는 다양한 방식으로 활용될 수 있습니다. 대표적인 활용 사례를 몇 가지 소개할게요!
사용자가 로그인하지 않았다면 로그인 페이지로 리다이렉트하는 Middleware를 작성할 수 있습니다.
from django.shortcuts import redirect
class AuthMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not request.user.is_authenticated:
return redirect('/login/') # 로그인 페이지로 이동
return self.get_response(request)
요청에 대한 응답 시간을 로깅 하여 성능 모니터링에 활용할 수 있습니다.
import logging
import time
logger = logging.getLogger(__name__)
class RequestLogMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start_time = time.time()
response = self.get_response(request)
duration = time.time() - start_time
logger.info(f"응답 상태 코드: {response.status_code}, 처리 시간: {duration:.2f}초")
return response
클라이언트가 보낸 요청 데이터를 표준화하거나, 필요 없는 데이터를 필터링하는 Middleware를 작성할 수 있습니다.
class CleanRequestMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 요청에서 특정 파라미터를 제거
request.GET = request.GET.copy()
request.GET.pop('remove_param', None)
return self.get_response(request)
Middleware는 Django 프로젝트의 전반적인 흐름에 큰 영향을 미칩니다. 개발 시 다음 사항을 유의하세요!
성능 최적화 🚀
테스트와 디버깅 🔧
순서 확인 🔀
비동기 요청 처리 ⚡
Django의 Middleware는 요청과 응답의 흐름을 제어하고, 프로젝트의 다양한 요구사항을 해결할 수 있는 강력한 도구입니다. 이번 글에서는 Middleware의 작동 원리, 구현 방법, 그리고 활용 사례를 살펴봤습니다.
실제로 프로젝트에서 Middleware를 설계할 때는 보안, 성능, 데이터 처리 등 다양한 요구를 고려해야 합니다!
상담만 받아보셔도 좋습니다 긱다이브의 상담으로 업체 비교를 시작해보세요