반응형

Django 앱 구조와 URL·뷰·템플릿 완전 정복

“Django에서 프로젝트랑 앱은 도대체 뭐가 다르죠?”
처음 Django를 배우는 분들이 가장 많이 묻는 질문 중 하나예요.
사실 이 부분만 확실히 잡아도 개발이 훨씬 쉬워져요.

 

 

안녕하세요, 여러분!

오늘은 Django 웹 개발에서 가장 중요한 구조적인 개념들을 하나하나 짚어보는 시간을 가져보려고 해요.

특히 초보자 분들이 헷갈려하기 쉬운 "프로젝트 vs 앱", URL과 뷰 연결 방식, 템플릿 활용법, 정적 파일 처리 방법까지!

MVT 아키텍처의 흐름을 시각적으로, 예제를 통해 명확하게 설명드릴게요.

이 포스팅을 마치고 나면 여러분은 Django의 기본 골격을 스스로 이해하고 구성할 수 있을 거예요.

 

1. 프로젝트 vs 앱: Django의 구조 이해하기 🏗️

Django를 시작하면 가장 먼저 접하게 되는 용어가 바로 프로젝트(project)앱(app)이에요.

이 두 개념을 명확히 구분하는 것이 굉장히 중요해요.

왜냐하면 우리가 만드는 서비스가 커질수록 구조를 제대로 이해하지 않으면 코드가 뒤엉켜버리기 때문이죠.

📌 프로젝트(Project)란?

프로젝트는 Django에서 웹 애플리케이션 전체를 포함하는 최상위 공간이에요.

예를 들어, 여러분이 ‘블로그 사이트’를 만든다고 하면, 그 전체 웹사이트가 하나의 프로젝트가 되는 거예요.

settings.py, urls.py, wsgi.py, asgi.py 같은 핵심 설정 파일들이 이 프로젝트 안에 포함되어 있죠.

📦 앱(App)이란?

앱은 프로젝트 내부에 포함되어 하나의 독립적인 기능 단위를 담당하는 컴포넌트입니다.

예를 들어

게시판 기능은 하나의 앱으로, 사용자 인증 기능은 또 다른 앱으로 구성할 수 있어요.

이처럼 앱은 재사용성과 모듈화를 위해 만들어지는 거죠.

📁 기본 폴더 구조 예시

myproject/
├── manage.py
├── myproject/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py
└── blog/         ← 앱
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── views.py
    ├── urls.py
    └── templates/

✅ 비교 정리

구분 프로젝트(Project) 앱(App)
의미 전체 웹사이트의 틀 기능별 모듈
역할 설정 및 라우팅 총괄 뷰, 모델, 템플릿 포함
재사용성 낮음 높음

🎯 요약 포인트

  • 프로젝트는 설정의 중심, 앱은 기능의 중심!
  • 하나의 프로젝트에 여러 개의 앱을 넣는 구조가 Django의 핵심.

 

 

2. MVT 아키텍처 요청-응답 흐름 🔁

Django는 MVT 아키텍처라는 구조를 기반으로 동작합니다.

여기서 MVT는 Model - View - Template의 약자예요.

많은 사람들이 헷갈리는 부분이 바로 'View'인데요.

다른 프레임워크에서의 View와는 조금 다른 개념이랍니다.

🔄 MVT의 구성요소

  • Model
  • : 데이터베이스와 연동되는 계층으로, 데이터 구조와 저장 로직을 담당해요.
  • View
  • : URL 요청을 받아 처리하고, 어떤 데이터를 보여줄지 결정하는 비즈니스 로직 처리 담당이에요.
  • Template
  • : 사용자에게 보여지는 HTML 화면을 담당하는 프론트엔드 계층입니다.

📡 요청-응답 흐름

MVT 구조는 사용자의 요청이 서버에 도달했을 때 어떤 방식으로 응답이 이루어지는지를 순서대로 처리해요.

아래는 그 흐름을 간단히 도식화한 거예요.

1. 사용자가 웹 브라우저에서 특정 URL 요청
2. Django가 URLconf에서 해당 URL 패턴 탐색
3. 매칭되는 View 함수 호출
4. View 함수가 Model을 통해 데이터 처리
5. View가 Template에 데이터 전달
6. Template이 HTML 생성하여 사용자에게 응답 반환

🌐 예시 흐름: 블로그 글 목록 보기

사용자가 /posts/ 주소로 접속하면 Django는 urls.py에서 이 URL과 매칭되는 View 함수를 찾습니다.

그 View는 Post 모델에서 데이터를 조회하고, 이를 템플릿(post_list.html)에 전달하여 HTML 페이지를 렌더링한 후 응답으로 전송해요.

🔁 한 문장 요약

URL → View → Model → Template → 사용자 응답 이 흐름을 이해하는 것이 Django 개발의 핵심이에요!

 

 

3. URLconf와 View 함수 연결 방법 🔗

Django에서 사용자가 어떤 페이지를 요청하면,

그 요청은 URLconf(URL configuration)라는 설정 파일을 통해 해당 View 함수와 연결됩니다.

이 과정을 이해하면, 웹사이트의 구조를 자유자재로 설계할 수 있어요!

📁 urls.py의 역할

urls.py는 URL 패턴을 정의하는 파일이에요.

이 파일을 통해 "이 URL 요청이 들어오면, 어떤 View 함수로 전달할지"를 결정하죠.

마치 웹사이트의 길 안내를 해주는 네비게이션 같은 존재예요.

📨 View 함수는 무슨 역할을 하나요?

View 함수는 요청을 받아 필요한 데이터를 조회하거나 가공한 후, 적절한 응답(HTML, JSON 등)을 만들어 반환합니다.

비즈니스 로직의 중심이며, 종종 모델과 템플릿 사이의 가교 역할도 해요.

🔧 간단한 연결 예제

# app/views.py
from django.http import HttpResponse

def home(request):
    return HttpResponse("Hello, Django!")

# app/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]

위 코드에서 사용자가 / 경로로 접속하면 home 함수가 실행되고, 그 결과로 "Hello, Django!"가 출력되는 구조예요.

🔁 프로젝트 전역 URLconf 연동

앱 단위로 작성된 urls.py는 프로젝트의 메인 urls.py에서 include()를 통해 불러와야 작동합니다.

예를 들어:

# project/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app.urls')),  # 앱의 URLconf 포함
]

📚 URL, View 연결 요약

  • View는 함수를 통해 사용자 요청을 처리하고 응답을 만들어냅니다.
  • urls.py는 "이 요청은 이 View로!" 라는 연결고리 역할을 합니다.
  • 프로젝트와 앱의 urls.py를 함께 구성해야 Django가 전체 요청을 인식해요.

 

 

4. 템플릿 엔진 사용 방법과 정적 파일(Static files) 처리 개념 🧩

Django의 매력 중 하나는 강력한 템플릿 엔진과 정적 파일 시스템이에요.

이 두 가지를 잘 활용하면, 백엔드 개발자가 프론트엔드 영역까지 손쉽게 다룰 수 있어요.

HTML 코드에 Python 데이터도 넣을 수 있고, CSS, JS, 이미지도 깔끔하게 관리할 수 있죠.

🧠 템플릿 엔진이란?

Django의 템플릿 엔진은 HTML 문서 안에 Python 데이터와 로직을 삽입할 수 있도록 도와주는 도구입니다.

변수 출력, 조건문, 반복문 등을 통해 동적인 HTML 페이지를 생성할 수 있어요.

📝 템플릿 사용 예시

<h1>Hello, {{ username }}!</h1>
{% if is_admin %}
<p>관리자 권한이 있습니다.</p>
{% else %}
<p>일반 사용자입니다.</p>
{% endif %}

이처럼 {{ 변수 }}를 통해 데이터를 출력하고, {% if %} ... {% endif %} 문법으로 조건을 제어할 수 있어요.

📁 정적 파일 처리(Static files)

정적 파일(static files)은 HTML과 함께 로드되는 CSS, JS, 이미지 파일을 말해요.

Django는 이러한 파일들을 별도로 관리하기 위한 시스템을 제공해요.

📦 폴더 구조 예시

myproject/
├── static/
│   ├── css/
│   │   └── style.css
│   └── js/
│       └── script.js
├── templates/
│   └── index.html

🔗 템플릿에서 정적 파일 사용하기

{% load static %}

{% load static %}을 선언하고, {% static '경로' %}를 사용하면 정적 파일을 안전하게 불러올 수 있어요.

이렇게 하면 개발 환경과 운영 환경 모두에서 호환성이 좋아집니다.

🧷 정리 한 줄 요약

템플릿은 Django가 HTML에 데이터를 주입할 수 있게 해주는 똑똑한 도구이고, 정적 파일 처리는 스타일과 동작을 책임지는 프론트엔드 리소스를 관리하는 방법이에요!

 

 

5. 템플릿 상속 개념 소개 🧱

여러 페이지를 가진 웹사이트를 만들다 보면, 모든 페이지에 공통적으로 들어가는 부분이 있죠?

예를 들면, 상단 메뉴, 푸터, 로고 같은 것들요.

이런 부분을 매번 복사해서 붙여넣는 건 비효율적이고, 나중에 유지보수도 어렵습니다.

Django는 이런 문제를 템플릿 상속이라는 기능으로 아주 깔끔하게 해결해줘요.

🏛️ 베이스 템플릿이란?

base.html 또는 layout.html이라고 불리는 이 베이스 템플릿은 공통 레이아웃을 정의해두는 템플릿이에요.

각 개별 페이지는 이 템플릿을 {% extends %}로 확장하고, {% block %} 태그를 통해 특정 부분만 바꿔서 사용할 수 있어요.

📐 베이스 템플릿 예제


  {% block title %}My Site{% endblock %}
  

My Website Header
  
    {% block content %}{% endblock %}
  © 2025 MySite
  


위 템플릿은 타이틀과 본문 부분을 block으로 정의해뒀고, 다른 템플릿에서 이걸 상속받아 사용하게 돼요.

🔁 상속받는 하위 템플릿 예시 --------------------------------------------------------------------------


{% extends "base.html" %}

{% block title %}홈 페이지{% endblock %}

{% block content %}

<p data-ke-size="size16">환영합니다! 여기는 홈입니다.</p>

{% endblock %}

home.htmlbase.html을 확장하면서 제목과 콘텐츠 영역만 바꿔 끼워넣은 거예요.

이렇게 하면 전체 구조는 유지하면서 내용만 바꾸는 게 가능해요!

💡 템플릿 상속의 장점

  • 중복 코드 제거로 생산성 향상 💼
  • 레이아웃 일관성 유지로 유지보수 용이 🔧
  • 각 페이지 별 핵심 콘텐츠에만 집중할 수 있음 🎯

📌 요약 정리

템플릿 상속은 기본 골격은 하나로 통일하고, 내용만 바꾸는 웹 페이지 관리 방식이에요.

규모가 커질수록 이 방식의 장점은 더 강력해집니다!

 

 

6. 예제와 함께 전체 흐름 복습하기 📚

지금까지 배운 내용을 하나의 흐름으로 묶어서 복습해볼까요?

Django에서 하나의 웹 페이지가 동작하는 과정을 예제 기반으로 정리해보면, 머릿속이 훨씬 깔끔해질 거예요!

📝 목표: 사용자 이름을 입력받아 인사하는 페이지 만들기

이 예제에서는 사용자가 /hello/홍길동처럼 이름을 URL로 전달하면, 그 이름을 화면에 보여주는 간단한 인사 페이지를 만들어요.

① URLconf 설정

# app/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('hello//', views.hello_user, name='hello'),
]

② View 함수 작성

# app/views.py
from django.shortcuts import render

def hello_user(request, username):
    context = {'username': username}
    return render(request, 'hello.html', context)

③ 템플릿 작성 

{% extends "base.html" %}

{% block title %}인사하기{% endblock %}

{% block content %}

{{ username }}님, 반가워요! 👋

{% endblock %}

💡 전체 동작 흐름 요약

  1. 1. 사용자가 /hello/홍길동을 입력
  2. 2. urls.py에서 해당 URL을 찾아 hello_user 뷰로 연결
  3. 3. 뷰 함수에서 받은 이름을 템플릿에 전달
  4. 4. hello.htmlbase.html을 상속받아 출력
  5. 5. 사용자 화면에 환영 메시지 출력 완료!

🎯 마무리 요약

Django는 URL, View, Template의 구조를 이해하고 적절히 연결하는 것만으로도 강력한 웹 페이지를 쉽게 만들 수 있어요.

오늘 배운 흐름을 반복해 익혀두면 어떤 웹 페이지든 자신 있게 구현할 수 있답니다!

 

 

마무리 🏁

여기까지 따라오시느라 정말 고생 많으셨어요!

오늘은 Django의 웹 개발에서 가장 핵심이 되는 구조들, 즉 프로젝트와 앱의 개념, MVT 아키텍처 흐름, URL과 View 연결, 템플릿과 정적 파일 처리, 템플릿 상속까지 모두 다뤄봤습니다.

이 글에서 다룬 내용은 Django 개발의 기반이 되는 핵심이기 때문에 꼭 숙지하시는 걸 추천드려요.

처음엔 복잡해 보일 수 있지만, 한두 번 실습해보면 금방 손에 익는 구조랍니다.

 

앞으로 게시판, 블로그, 쇼핑몰, 포트폴리오 사이트 등을 만들 때도 오늘 배운 흐름을 그대로 적용할 수 있어요. 혹시 다음 단계로 어디서부터 손대야 할지 막막하신가요? 그렇다면 지금 만든 구조에 간단한 게시글 모델과 폼을 추가해보세요. 점점 더 강력한 기능을 얹어갈 수 있을 거예요.

 

다음 글에서는 Django 모델(Model)과 데이터베이스 ORM에 대해 다뤄볼 예정이니 기대해주세요!

“코드는 직접 짜보는 만큼 이해도는 깊어진다.”

반응형

+ Recent posts