노트

Django MVT 구조

Django MVT (Model-View-Template) Architecture

백엔드#django · 연결된 개념 7개

쉽게 말하면

Django MVT는 식당처럼 역할을 나눠 고치기 쉽게 한 구조예요. 주소(URL)에 따라 주문이 맞는 직원(뷰)에게 가고, 직원은 냉장고(모델)에서 재료를 꺼내 그릇(템플릿)에 담아 내죠.

비유가 깨지는 곳 이름이 헷갈리기 쉬워요. 다른 프레임워크의 컨트롤러가 장고의 뷰이고, 그쪽의 뷰가 장고의 템플릿이에요. 또 요청이 뷰에 닿기 전후로 미들웨어가 한 번씩 돌아요.

Django는 파이썬 웹 프레임워크로, 요청을 URLconf → 뷰 → (모델·템플릿) → 응답 순서로 처리한다. 역할을 Model(데이터), View(요청 처리 로직), Template(표현)으로 나눠 MVT(Model-View-Template)라 부른다. 다른 프레임워크의 컨트롤러가 장고의 뷰, 뷰가 장고의 템플릿에 해당한다.

프로젝트와 앱

django-admin startproject mysite
python manage.py startapp challenges
python manage.py runserver
  • 프로젝트: 전역 설정(settings.py), 최상위 URL(urls.py), 배포용 진입점(wsgi.py·asgi.py, WSGI(Web Server Gateway Interface)·ASGI(Asynchronous Server Gateway Interface))
  • 앱: 기능 단위 모듈. 한 프로젝트에 여러 앱이 있고, INSTALLED_APPS에 등록해야 모델·템플릿·마이그레이션이 인식된다
  • manage.py는 마이그레이션, 셸, 테스트 같은 관리 명령의 입구다
  • "배터리 포함(batteries included)": ORM, 관리자 화면, 인증, 폼, 세션이 기본으로 들어 있다

URLconf와 뷰

# challenges/urls.py
urlpatterns = [
    path("", views.index, name="index"),
    path("<int:month>", views.by_number),
    path("<str:month>", views.by_name, name="month-challenge"),
]
 
# challenges/views.py
def by_number(request, month):
    name = list(MONTHS)[month - 1]
    return HttpResponseRedirect(reverse("month-challenge", args=[name]))
 
def by_name(request, month):
    return render(request, "challenges/challenge.html", {"month": month, "text": MONTHS[month]})
  • <int:month> 같은 경로 변환기(path converter)로 URL 조각을 인자로 받는다
  • name을 붙이고 reverse()로 URL을 만들면, 경로 문자열이 바뀌어도 코드를 고칠 필요가 없다
  • 요청이 뷰에 닿기 전후로 미들웨어가 돈다(Django 미들웨어와 로그인 흐름)

템플릿과 정적 파일

  • 템플릿은 앱 안의 templates/<앱 이름>/ 아래에 둔다. 이름 충돌을 피하려고 앱 이름 폴더를 한 번 더 둔다
  • DTL(Django Template Language)의 {{ 변수 }}, {% 태그 %}, |필터로 동적 HTML을 만든다. 레이아웃은 extends·block으로 상속한다
  • 정적 파일은 django.contrib.staticfiles와 STATIC_URL로 서빙하고, 배포 때 collectstatic으로 모은다

데이터 쪽은 Django 모델 매니저와 QuerySet, JSON API는 DRF(DRF 뷰 계층)를 본다. 스프링 구조와 나란히 보면 스프링과 장고 비교, 패턴 일반은 MVC·MVP·MVVM가 도움이 된다.

출처: Django 튜토리얼 1부 · Django FAQ: MTV · URL dispatcher: Path converters

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Django의 CSRF 방어

    Django는 CsrfViewMiddleware로 CSRF(Cross-Site Request Forgery)를 막는다. 기본 아이디어는 Double Submit Cookie, 즉 쿠키에 든 CSRF 값과 요청에 함께 보낸 값을 비교하는 것이고, 여기에 토큰 마스킹(token masking)과 Origin·Referer 검사를 더한다.

  • DRF 파서·렌더러와 콘텐츠 협상

    DRF에서 파서(Parser)는 요청 본문을 파이썬 자료형으로 바꾸고, 렌더러(Renderer)는 응답 데이터를 클라이언트가 받을 형식으로 바꾼다. 어떤 렌더러를 쓸지는 요청의 Accept 헤더를 보고 고르는데, 이를 콘텐츠 협상(content negotiation)이라 한다.

  • DRF 필터·검색·정렬

    DRF의 목록 API는 쿼리 파라미터로 결과를 좁히는 세 가지 장치를 붙일 수 있다. 값이 정확히 맞는 것만 고르는 필터, 일부 문자열로 찾는 검색, 순서를 바꾸는 정렬이다. 모두 제네릭 뷰(GenericAPIView 계열)의 filter_backends로 적용된다.

  • Pages Router에서 App Router로

    App Router는 Next.js 13에서 도입된 app/ 디렉터리 기반 라우터로, 서버 컴포넌트·중첩 레이아웃(Nested Layouts)·스트리밍을 기본으로 한다. pages/ 기반의 Pages Router에서 옮길 때 바뀌는 생각을 정리한다.

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

보기 옵션