Django를 배우다보니 Django는 어떤 구조로 이루어져 있고 어떻게 동작하는지 궁금해졌다.
Django의 기본 구조는
MVT (Model-View-Template)패턴을 따르며, 주요 구성 요소는 다음과 같다
데이터 구조: 모델은 데이터베이스와의 상호작용을 담당하며, 데이터베이스의 테이블 구조를 정의
ORM (Object-Relational Mapping): Django는 ORM을 통해 Python 클래스를 데이터베이스 테이블에 매핑
이를 통해 SQL 쿼리를 직접 작성하지 않고도 데이터베이스 작업을 수행할 수 있다
비즈니스 로직: 뷰는 사용자의 요청을 처리하고 응답을 생성하는 로직을 포함
요청 처리: 클라이언트로부터의 요청을 받아 필요한 데이터를 모델에서 조회하고, 이를 템플릿에 전달하여 최종 HTML을 생성
UI 구성: 템플릿은 HTML 파일로, 뷰가 전달한 데이터를 표시하는 데 사용
템플릿은 Django 템플릿 언어를 사용하여 동적으로 콘텐츠를 생성할 수 있다
요청 라우팅: Django는 urls.py 파일을 통해 URL을 뷰에 매핑
사용자가 요청한 URL에 따라 적절한 뷰가 호출되도록 설정
관리 인터페이스: Django는 기본적으로 강력한 관리 인터페이스를 제공합니다. 이를 통해 데이터 모델을 쉽게 관리할 수 있다
설정: 모델을 어드민 패널에 등록하면, 생성, 수정, 삭제 작업을 웹 인터페이스를 통해 쉽게 수행할 수 있다
요청/응답 처리: 미들웨어는 요청과 응답 처리 과정에 개입하여 기능을 추가하는 구성 요소
예를 들어, 인증, 세션 관리, 로깅 등을 처리할 수 있다
설정: settings.py 파일의 MIDDLEWARE 리스트에 미들웨어 클래스를 추가하여 사용할 수 있다
환경 구성: settings.py 파일은 Django 애플리케이션의 설정을 포함
데이터베이스 연결, 정적 파일 경로, 미들웨어, 템플릿 설정 등을 정의
예를 들어 내가 웹 브라우저에서 특정 URL(예: 로그인)에 접근한다면 그 과정은 다음 구조를 거치게 된다
클라이언트 → 웹 서버 → 애플리케이션 서버 → Django의 urls.py → Django 뷰 → 템플릿 렌더링 → 최종 HTML 응답 → 웹 서버 → 클라이언트이 과정에서 일어나는 일을 정리하자면
클라이언트 요청:
사용자가 웹 브라우저에서 특정URL(예: http://example.com/login)에 접근
이 요청은HTTP 프로토콜을 사용하여 웹 서버로 전송웹 서버 (Nginx, Apache 등):
웹 서버는 클라이언트의 요청을 수신함
요청이정적 파일에 대한 것이라면, 웹 서버는 직접 해당 파일을 클라이언트에게 반환
요청이동적 콘텐츠에 대한 것이라면, 웹 서버는 이 요청을 애플리케이션 서버로 전달애플리케이션 서버 (Gunicorn, uWSGI 등):
웹 서버로부터 동적 요청을 받은 애플리케이션 서버는Django 애플리케이션을 실행
요청은 Django의WSGI(또는 ASGI) 인터페이스를 통해 Django로 전달Django의 URL Dispatcher:
Django 애플리케이션은 수신한 요청의 URL을 분석하여 어떤 뷰가 호출될지를 결정
이 과정에서 Django는urls.py파일을 참조하여 요청된 URL(예: /login/)에 맞는 뷰 함수를 찾음Django 뷰:
요청된 URL과 매핑된 뷰 함수가 호출되고, Django는 이 뷰에 요청 객체를 전달
뷰는 비즈니스 로직을 처리하고, 필요한 경우 템플릿을 렌더링하여 최종HTML 응답을 생성템플릿 렌더링 및 응답 반환:
뷰에서 생성된 응답은 애플리케이션 서버를 통해 웹 서버로 전달되고, 웹 서버는 이 응답을 클라이언트에게 다시 반환
주요 특징
백엔드 프레임워크: Django는 주로 서버 사이드에서 동작하는 백엔드 프레임워크
웹 애플리케이션의 데이터베이스 관리, 비즈니스 로직 처리, URL 라우팅, 보안 등을 담당MTV 패턴: Django는 Model-Template-View(MTV) 패턴을 따름
Model: 데이터베이스와 상호작용하는 부분
Template: 사용자에게 보여지는 HTML 파일과 같은 뷰 요소를 렌더링
View: 요청을 받아 모델에서 데이터를 가져오고, 이를 템플릿과 연결해 사용자에게 전달동작 방식:
사용자가 URL을 통해 요청을 보내면 urls.py에서 해당 URL과 일치하는 View를 찾아 처리
View는 필요한 데이터를 Model에서 가져와 처리하고, Template에서 데이터를 렌더링해 사용자에게 보낸다장고의 핵심:
장고는 서버 측에서 주로 작동하며, 클라이언트에게 완성된 HTML을 반환
백엔드 로직과 데이터 관리를 장고가 담당하며, 프론트엔드의 인터페이스도 일정 부분 관리할 수 있다
주요 특징
프론트엔드 라이브러리: React는 사용자 인터페이스(UI)를 구축하기 위한 프론트엔드 라이브러리
주로 브라우저에서 동작하며, HTML과 같은 UI 요소를 동적으로 관리컴포넌트 기반 아키텍처: React는 UI를 여러 개의 재사용 가능한 컴포넌트로 나누어 관리
각 컴포넌트는 독립적으로 동작하며 상태(state)를 관리
단일 페이지 애플리케이션(SPA): React는 주로 SPA 방식으로 웹 애플리케이션을 구현
페이지가 새로고침 없이 동적으로 업데이트되므로 빠른 사용자 경험을 제공Virtual DOM: React는 실제 DOM이 아닌 가상의 DOM(Virtual DOM)을 사용하여 성능을 최적화
상태가 변할 때마다 Virtual DOM이 업데이트되고, 실제 DOM과 비교하여 필요한 부분만 변경리액트의 동작 방식: 사용자의 상호작용에 따라 프론트엔드에서 즉각적으로 UI가 업데이트
서버에서 데이터를 요청하더라도 페이지 전체가 새로고침되지 않고, 필요한 부분만 변경

Django가 서버에서 렌더링 후 클라이언트로 전송을 하는 방법이라면 트래픽이 많아질수록 서버에 부하가 커질텐데 어떻게 관리를 할까라는 생각이 들었다. 개인적으로 아는 것은 리버스 프록시와 로드 밸런싱, 비동기기 있는데, 그것 말고도 다른 방법들을 찾아보았다
페이지 캐싱: Django에서 전체 페이지를 캐시하여 동일한 요청에 대해 서버가 매번 새로 렌더링하지 않고 캐시된 HTML을 바로 전송
Redis나Memcached와 같은 캐시 서버를 사용하여 효율적으로 처리할 수 있다템플릿 프래그먼트 캐싱: 페이지의 특정 부분(예: 헤더나 네비게이션 바 등)을 캐시하여 재사용
이렇게 하면 페이지 전체를 렌더링하는 대신 자주 변하지 않는 부분만 캐싱해 성능을 높일 수 있다
트래픽이 많은 시스템에서는 Django 같은 서버에서 HTML을 직접 렌더링하는 대신,
API 서버와프론트엔드 프레임워크(React, Vue 등)를 사용하는 경우가 많다
백엔드 서버는 데이터만 제공하고, 프론트엔드가 클라이언트 측에서 HTML을 렌더링하여 서버 부하를 줄인다
데이터베이스 조회나 외부 API 호출 등 시간이 오래 걸리는 작업을 Django 서버가 처리하지 않도록,
비동기 작업 큐 시스템(Celery)을 사용하여 백그라운드에서 작업을 처리
이는 서버 응답 속도를 높이고 부하를 줄이는 데 도움이 됨
여러 대의 서버로 트래픽을 분산시킬 수 있다
로드 밸런서(예: Nginx, AWS ELB)를 사용해 트래픽을 분산시키고, 서버에 따라스케일 아웃(서버 수를 늘림)하여 처리 능력을 높인다