logo
Django

Django Middleware 완벽 가이드: 작동 방식, 예제, 활용 사례를 중심으로

2024.11.30개발팀장ㅣDerek

 

 

Django는 유연하고 확장성이 뛰어난 웹 프레임워크로 잘 알려져 있습니다. 그중에서도 Middleware는 Django의 요청(Request)과 응답(Response) 과정에서 중요한 중간 역할을 합니다. 오늘은 Django Middleware가 어떻게 작동하는지, 사용자 정의 Middleware를 어떻게 작성하는지, 그리고 활용 사례를 중심으로 깊이 있는 내용을 다뤄보겠습니다. Middleware 개발 시 고려해야 할 점도 함께 확인해볼게요! 😊

 

 


 

 

Middleware란 무엇인가요? 🛠️

 

Django에서 Middleware는 클라이언트의 요청(Request)과 서버의 응답(Response) 사이를 중계하며, 데이터를 처리하거나 변환할 수 있는 중간 계층입니다. 쉽게 말하면, 클라이언트와 서버 사이에서 특정 작업을 자동으로 처리해주는 필터 같은 역할을 합니다.

 

 

Middleware의 주요 역할 🔍

 

  1. 보안 및 인증: 요청을 받아 인증 정보 또는 권한 검사를 수행합니다.
  2. 로깅 및 모니터링: 요청 또는 응답 데이터를 기록하여 분석에 활용합니다.
  3. 데이터 가공: 요청 데이터를 변환하거나 응답에 추가적인 처리 작업을 수행합니다.

 

Middleware는 Django 프로젝트의 settings.py 파일에서 순서대로 실행되며, 실행 순서는 시스템 전체에 큰 영향을 미칩니다.

 

 


 

 

Django Middleware 작동 방식 🔄

 

Middleware는 Django의 요청/응답 라이프사이클에 깊이 관여합니다. 다음은 Middleware의 주요 흐름입니다:

 

  1. 클라이언트가 서버로 요청(Request)을 보냄.
  2. Middleware가 요청 데이터를 가공하거나 변환.
  3. 뷰(View) 함수가 요청을 처리하고 응답(Response)을 생성.
  4. Middleware가 응답 데이터를 다시 가공하거나 수정.
  5. 클라이언트에게 최종 응답이 전달됨.

 

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 예제: 간단한 Logger Middleware 📋

 

이제 실제로 Middleware를 작성해볼까요? 아래는 요청 URL과 요청 처리 시간을 로깅(Log)하는 사용자 정의 Middleware입니다.

 

 

1️⃣ 사용자 정의 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)을 처리하는 메인 메서드입니다.

 

2️⃣ settings.py에 Middleware 등록

 

작성한 Middleware를 사용하려면 Django 설정 파일에 등록해야 합니다. 아래와 같이 추가하면 됩니다:

 

MIDDLEWARE = [
    # 기존 Middleware
    'myproject.middleware.LoggerMiddleware',  # 새로 추가
]

 

 

이제 모든 요청에 대해 URL과 처리 시간이 로그로 출력됩니다.

 

 


 

 

Middleware 활용 사례 💡

 

Middleware는 다양한 방식으로 활용될 수 있습니다. 대표적인 활용 사례를 몇 가지 소개할게요!

 

 

1. 사용자 인증 및 권한 관리

 

사용자가 로그인하지 않았다면 로그인 페이지로 리다이렉트하는 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)

 

 

2. 응답 시간 로깅

 

요청에 대한 응답 시간을 로깅 하여 성능 모니터링에 활용할 수 있습니다.

 

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

 

 

3. 요청 데이터 필터링

 

클라이언트가 보낸 요청 데이터를 표준화하거나, 필요 없는 데이터를 필터링하는 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 개발 시 고려할 점 📝

 

Middleware는 Django 프로젝트의 전반적인 흐름에 큰 영향을 미칩니다. 개발 시 다음 사항을 유의하세요!

 

  1. 성능 최적화 🚀

    • Middleware는 모든 요청/응답에 실행되므로 성능이 중요한 요소입니다.
    • 불필요한 연산이나 무거운 작업은 피하세요.

     

  2. 테스트와 디버깅 🔧

    • 예상치 못한 오류를 방지하기 위해 단위 테스트를 작성하세요.
    • 로깅을 적극 활용하여 Middleware의 작동 상태를 확인하세요.

     

  3. 순서 확인 🔀

     

    • Middleware의 실행 순서는 요청과 응답의 처리 결과에 영향을 미칩니다.
    • 순서를 명확히 정의하고 의존성을 관리하세요.

 

  1. 비동기 요청 처리

     

    • Django 3.1 이상에서는 비동기 Middleware를 지원하므로, 비동기 작업이 필요하다면 이를 활용하세요.

 

 


 

 

끝으로 ✨

 

Django의 Middleware는 요청과 응답의 흐름을 제어하고, 프로젝트의 다양한 요구사항을 해결할 수 있는 강력한 도구입니다. 이번 글에서는 Middleware의 작동 원리, 구현 방법, 그리고 활용 사례를 살펴봤습니다.

 

 

실제로 프로젝트에서 Middleware를 설계할 때는 보안, 성능, 데이터 처리 등 다양한 요구를 고려해야 합니다!

 

 

 

추천컬럼

추천컬럼 이미지

상위1%의 결과물을 얻으려면 이런 관점으로 봐야합니다.

2024.09.20
추천컬럼 이미지

프로그램개발, 합리적인 가격을 위해 잊으면 안되는 MVP

2024.09.20

상담만 받아보셔도 좋습니다 긱다이브의 상담으로 업체 비교를 시작해보세요

CONTACT US