Django Middleware? 처음엔 뭔가 복잡한 마법처럼 느껴졌는데, 막상 써보니 생각보다 괜찮더라고요. 이 글에서는 제가 Django Middleware를 사용하면서 느낀 점과, 초보자분들도 쉽게 이해할 수 있도록 풀어서 설명해 드릴게요. (물론, 제가 다 아는 건 아니지만요 😉)
Django Middleware는, 웹 페이지 요청이 들어와서 응답으로 돌아가는 과정에 끼어들어서 여러 가지 일을 처리해주는 녀석이라고 생각하면 돼요. 로그인 확인 같은 보안 작업이나, 어떤 페이지가 얼마나 많이 접속되는지 기록하는 로깅 작업, 그리고 웹 페이지 속도를 높이는 최적화 작업까지… 정말 다양한 일을 할 수 있죠. 마치 영화 촬영장의 조감독처럼, 메인 배우(뷰 함수)가 연기하기 전후로 여러 가지 준비를 척척 해내는 거죠.
핵심은 다섯 가지 메서드에 있다고 보면 돼요. 각 메서드는 요청-응답 과정의 특정 시점에서 실행되는데, 마치 릴레이 경주처럼 순서대로 작동합니다.
process_request(request): 이건 릴레이 선수가 바톤을 받기 전, 준비 자세를 취하는 단계와 같아요. 요청이 뷰(실제 웹 페이지를 보여주는 함수)에 도착하기 전에 실행돼서, 요청을 검사하거나 필요한 정보를 추가할 수 있죠. 만약 이 단계에서HttpResponse라는 녀석을 반환하면, 다음 단계는 건너뛰고 바로 응답을 보내버려요. (경주 중간에 포기하는 거죠!)process_view(request, view_func, view_args, view_kwargs): 뷰 함수가 실행되기 직전에 실행되는 단계입니다. 뷰 함수가 실행될지 말지를 결정하거나, 뷰 함수에 추가적인 정보를 전달할 수 있어요. 마치 배우에게 대본을 건네주는 조감독과 같다고 할까요?process_exception(request, exception): 뷰 함수에서 에러가 발생했을 때 실행되는데, 에러 메시지를 기록하거나 사용자에게 에러 페이지를 보여주는 등의 작업을 해요. 마치 사고가 났을 때 응급처치를 하는 구급대원과 같네요.process_template_response(request, response): 템플릿(웹 페이지의 뼈대)을 이용해서 응답을 만들어낸 후에 실행되는 단계입니다. 응답에 추가 정보를 넣거나 수정할 수 있어요. 마지막으로 배우의 의상을 살짝 손보는 분장사와 같은 역할이죠.process_response(request, response): 응답이 클라이언트(사용자의 브라우저)로 보내지기 직전에 실행되는 마지막 단계입니다. 응답 헤더를 수정하거나 응답 내용을 바꿀 수 있어요. 마치 영화가 상영되기 직전에 최종 검토를 하는 감독과 같습니다.
자, 그럼 실제 코드를 한번 볼까요? 가장 간단한 예시로, 모든 요청에 대한 정보를 로그 파일에 기록하는 Middleware를 만들어 볼게요. 이게 제가 처음 Middleware를 만들었을 때 했던 작업인데, 생각보다 간단하더라고요.
import logging
logger = logging.getLogger(__name__)
class LoggingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
logger.info(f"Request received: {request.method} {request.path}")
response = self.get_response(request)
logger.info(f"Response sent: {response.status_code}")
return response
이 코드를 settings.py 파일의 MIDDLEWARE 목록에 추가하면 됩니다. (자신의 앱 위치를 제대로 설정하는 것 잊지 마세요! 저는 이 부분에서 한참 헤맸거든요 😅)
로그 설정은 logging.conf 또는 settings.py에서 따로 해줘야 하는데, 이 부분은 설명이 좀 길어질 것 같으니, 구글링으로 찾아보시는 걸 추천드려요. (참고로, 저는 처음에 로그가 안 찍혀서 엄청 고생했답니다… 설정 파일을 잘 확인하세요!)
몇 가지 주의할 점이 있어요. Middleware는 순서대로 실행되니, 순서를 잘못 설정하면 의도치 않은 결과가 나올 수 있어요. 그리고 process_request에서 HttpResponse를 반환하면, 다음 Middleware는 실행되지 않으니, 꼭 기억해두세요! 또, Middleware를 너무 많이 사용하면 웹 사이트 속도가 느려질 수 있으니, 꼭 필요한 기능만 추가하는 게 중요해요. 마지막으로, try...except 블록을 사용해서 에러를 잘 처리해주는 것도 잊지 마세요. 저는 이 부분을 소홀히 했다가 낭패를 본 경험이 있답니다.
결론적으로, Django Middleware는 웹 애플리케이션을 더욱 강력하고 유연하게 만들어주는 아주 유용한 도구입니다. 하지만, 무턱대고 많이 사용하기보다는, 정말 필요한 기능에만 사용하고, 각 메서드의 역할을 잘 이해하는 것이 중요해요. 이 글이 여러분의 Django 개발에 조금이나마 도움이 되었으면 좋겠네요! 궁금한 점이 있으면 언제든지 질문해주세요! 😊
댓글
댓글 쓰기