728x90
SMALL
- 오늘은 Django를 배우며 익혔던 핵심 개념들과 실습 과정을 하나하나 정리해보는 시간을 가지게 되었습니다.
💭 Django는 어떤 프레임워크일까?
- Django는 복잡한 웹 개발 문제를 해결하기 위해 등장한 프레임워크입니다. 특징은 간단해요. 각 기능이 느슨하게 결합되어 있고, 독립적으로 관리할 수 있다는 것.
- 예를 들어, 데이터베이스 계층, 화면(View) 계층, 비즈니스 로직 계층이 서로 철저히 분리되어 있어, 유지보수와 확장이 정말 편합니다.
🔹 Django는 "DRY(Don’t Repeat Yourself)" 원칙을 지켜요. 즉, 똑같은 코드를 반복하지 않고 재사용성을 극대화한다는 거죠.
- 개발자 생산성을 높이는 기능도 강력합니다. introspection(인트로스펙션) 기능을 통해 데이터베이스를 분석해주고, 자동화된 코드 생성도 도와줍니다.
✨ MTV 패턴
- Django는 흔히 알려진 MVC(Model-View-Controller) 패턴과 비슷하지만, 약간 다르게 표현해서 MTV(Model-Template-View) 패턴이라고 부릅니다.
- 모델(Model): 데이터베이스 구조와 데이터를 다루는 부분입니다.
- 템플릿(Template): 사용자에게 보여질 HTML 등을 담당합니다.
- 뷰(View): 모델에서 가져온 데이터를 템플릿으로 전달하는 역할을 합니다.
✨ Django에서는 프레임워크 자체가 컨트롤러 역할을 대신해줘요. 그래서 개발자는 모델, 뷰, 템플릿에만 집중하면 됩니다.
✨ Django 아키텍처 한눈에 보기
- 그럼 Django가 실제로 어떻게 요청과 응답을 처리하는지 살펴볼게요. 전체 플로우는 다음과 같습니다.
- 조금 더 자세히 순서를 풀어보면,
- 웹 브라우저가 서버에 URL 요청을 보냅니다.
- Django는 설정된 URL 패턴 목록을 살펴보고, 가장 먼저 매칭되는 패턴을 찾습니다.
- 매칭된 패턴에 연결된 뷰(View)를 실행합니다.
- 필요한 경우, 뷰는 모델(Model)을 통해 데이터베이스에서 정보를 조회합니다.
- 모델은 데이터베이스 질의(Query)를 처리하고 결과를 반환합니다.
- 뷰는 받은 데이터를 템플릿에 넘겨 HTML 형태로 렌더링합니다.
- 완성된 HTML 응답이 브라우저로 전송됩니다.
🔹 이렇게 구조화된 덕분에, Django는 단순한 웹사이트부터 복잡한 서비스까지 확장성 있게 만들 수 있어요.
🫢 생성된 Django 프로젝트 구조 살펴보기
- startproject로 Django 프로젝트를 생성하면 다음과 같은 구조가 만들어집니다.
project/
manage.py
config/
__init__.py
asgi.py
settings.py
urls.py
wsgi.py
- 간단하게 각각의 파일과 폴더가 어떤 역할을 하는지 정리하면,
- 외부 project 디렉터리: 전체 프로젝트를 감싸는 컨테이너입니다.
- manage.py: 프로젝트와 상호작용하는 커맨드라인 도구입니다. 서버 실행이나 마이그레이션 작업에 주로 사용합니다.
- 내부 config 디렉터리: 실제 장고 프로젝트 설정 파일들이 담겨 있는 폴더입니다.
- __init__.py: 이 폴더를 파이썬 패키지로 인식시키기 위한 파일입니다.
- asgi.py: 비동기 서버를 위한 설정 파일입니다. ASGI 서버에서 장고 앱을 실행할 때 사용됩니다.
- settings.py: 프로젝트의 모든 설정을 담고 있는 파일입니다.
- urls.py: URL 패턴을 관리하는 곳입니다.
- wsgi.py: WSGI 서버를 통해 장고 앱을 실행할 때 사용됩니다.
✨ 데이터베이스 초기화하기
- Django 프로젝트를 만들었으면, 이제 데이터베이스를 준비할 차례입니다.
- 장고는 기본적으로 SQLite3 데이터베이스를 사용합니다.
- 간편하게 로컬 개발용으로 사용할 수 있지만, 추후 프로덕션 환경에서는 PostgreSQL이나 MySQL 같은 데이터베이스를 써야 합니다.
- 데이터베이스 관련 설정은 모두 settings.py 파일의 DATABASES 항목에 정의되어 있습니다.
cd config
python manage.py migrate
- 이 명령어는 장고의 기본 앱들(admin, auth 등)과 관련된 데이터베이스 테이블을 자동으로 생성해줍니다.
✨ 개발 서버 실행하기
- 데이터베이스 준비가 끝났다면, 이제 웹 서버를 띄워볼 수 있어요!
python manage.py runserver 127.0.0.1:8001 --settings=config.settings
🔹 서로 다른 환경(개발/운영 등)을 관리하려면, 환경마다 별도의 settings 파일을 만드는 것도 좋은 방법입니다.
- 이 서버는 개발 전용입니다. 프로덕션 환경에서는 반드시 Apache, Gunicorn, uWSGI 같은 서버를 별도로 구성해야 해요.
- 비동기 서버를 쓰고 싶다면 Daphne나 Uvicorn 같은 서버를 사용하는 것도 방법입니다.
✨ 프로젝트 설정 파일 알아보기
- 장고 프로젝트 설정 파일인 settings.py에는 여러 가지 중요한 항목들이 미리 정의되어 있습니다. 이 파일을 수정하면 프로젝트의 기본 동작을 커스터마이징할 수 있어요.
- DEBUG: 디버그 모드 여부를 설정합니다. 개발 중에는 True, 운영 서버에서는 반드시 False로 설정해야 합니다.
- ALLOWED_HOSTS: 어떤 호스트/도메인에서 이 서버에 접속할 수 있는지를 지정합니다.
- INSTALLED_APPS: 프로젝트에 포함된 장고 앱 목록입니다. 기본 앱들(admin, auth 등)도 여기에 포함되어 있어요.
- 또한 다음 설정들도 함께 포함되어 있습니다.
- django.contrib.admin: 관리자 사이트
- django.contrib.auth: 인증 프레임워크
- django.contrib.contenttypes: 콘텐츠 타입 프레임워크
- django.contrib.sessions: 세션 프레임워크
- django.contrib.messages: 메시지 프레임워크
- django.contrib.staticfiles: 정적 파일(이미지, CSS, JS) 관리 프레임워크
- 이 외에도,
- MIDDLEWARE: 장고 미들웨어 구성 목록
- ROOT_URLCONF: 프로젝트의 최상위 URL 설정
- DATABASES: 사용할 데이터베이스 설정
- LANGUAGE_CODE: 기본 언어 설정
- USE_TZ: 타임존 활성화 여부 설정까지 함께 정의되어 있습니다.
💡 프로젝트와 애플리케이션의 관계
- 장고에서는 프로젝트와 애플리케이션을 구분해서 관리합니다.
- 프로젝트: 여러 개의 애플리케이션을 담고 있는 큰 틀을 뜻하고, (블로그, 포럼, 쇼핑몰)
- 애플리케이션(App): 특정 기능 단위를 담당하는 모듈을 의미합니다. (블로그 글 작성 기능, 댓글 기능)
🔹 애플리케이션은 재사용 가능한 단위로 설계되기 때문에, 하나의 앱을 여러 프로젝트에서 재활용할 수도 있어요!
⚒️ 블로그 게시물 모델 만들기
- 이제 블로그에 글을 작성할 수 있도록, Post 모델을 만들어 볼 차례입니다.
- 장고의 모델은 데이터베이스 테이블과 직접 연결되기 때문에, 모델을 정의하면 그에 맞는 테이블이 자동으로 만들어집니다.
- 먼저 blog 애플리케이션 안의 models.py 파일을 열고, 다음 코드를 추가합니다.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250)
body = models.TextField()
def __str__(self):
return self.title
💡 모델 필드 설명
- title: 게시물의 제목을 저장하는 필드입니다. SQL에서는 VARCHAR 타입으로 변환됩니다.
- slug: 검색 친화적인 URL을 만들기 위한 필드입니다. 짧고 간결한 문자열(영문, 숫자, 하이픈 포함)을 저장합니다.
- body: 게시물의 본문을 저장하는 필드입니다. SQL에서는 TEXT 타입으로 저장됩니다.
- 또한, __str__() 메서드를 추가해서, 관리 페이지나 쉘에서 객체 이름이 title로 보이도록 설정했습니다.
🔹 Tip: 장고 2 이상에서는 __unicode__() 대신 __str__() 메서드를 사용합니다!
✨ datetime 필드 추가하기
- 블로그 글에는 작성 날짜나 수정 날짜를 기록하는 것도 중요합니다.
- 그래서 Post 모델에 날짜 관련 필드를 추가해볼게요.
- models.py 파일을 아래와 같이 수정합니다.
from django.db import models
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250)
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
💡 추가된 필드 설명
- publish: 글이 게시된 날짜와 시간을 저장합니다. 기본값은 현재 시간(timezone.now)입니다.
- created: 객체가 처음 생성될 때 날짜를 자동으로 저장합니다.
- updated: 객체가 저장될 때마다 마지막 수정 날짜를 자동으로 업데이트합니다.
🔹 auto_now_add=True는 "객체 생성 시" 한번만 저장,
🔹 auto_now=True는 "객체 저장할 때마다" 계속 갱신된다는 점을 기억해두세요!
✨ 기본 정렬 순서 정의하기
- 블로그 글은 일반적으로 최신 글이 가장 위에 표시되죠. 이를 위해 Post 모델에 기본 정렬 순서를 추가할 수 있습니다.
- models.py 파일 안에 Meta 클래스를 추가합니다.
class Meta:
ordering = ['-publish']
- ordering 옵션은 모델 인스턴스를 조회할 때 기본 정렬 기준을 설정하는 기능입니다.
- -publish는 게시일(publish) 기준 내림차순을 의미합니다. (- 부호는 역순!)
✨ 이 설정 덕분에, 앞으로 별도로 정렬 코드를 작성하지 않아도 최신 글이 먼저 표시돼요.
💡 작성자(author) 필드 추가하기
- 게시글에는 작성자가 필요합니다. 누가 어떤 글을 썼는지 기록해야 하니까요.
- 장고는 인증 시스템(django.contrib.auth)을 기본으로 제공하며, User 모델을 사용할 수 있습니다.
- Post 모델에 작성자(author)를 연결해봅시다.
from django.contrib.auth.models import User
class Post(models.Model):
...
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='blog_posts'
)
...
- ForeignKey를 사용하면 다대일 관계를 쉽게 만들 수 있습니다.
🔹 on_delete=models.CASCADE는 작성자가 삭제되면 그가 작성한 모든 글도 같이 삭제되게 설정하는 옵션입니다.
🔹 related_name='blog_posts'로 설정해두면, user.blog_posts로 작성한 글 목록에 접근할 수 있어요.
💡 게시글 상태(status) 관리하기
- 블로그 글을 바로 공개하지 않고 초안 상태로 둘 수도 있죠. 이것을 위해 TextChoices를 활용해 게시글 상태를 관리합니다.
class Status(models.TextChoices):
DRAFT = 'DF', 'Draft'
PUBLISHED = 'PB', 'Published'
status = models.CharField(
max_length=2,
choices=Status.choices,
default=Status.DRAFT
)
- status 필드는 DRAFT 또는 PUBLISHED 중 하나의 값을 가지게 됩니다.
🔹 기본값은 초안(DRAFT)이며, 이후 게시 시점에 발행(PUBLISHED) 상태로 변경할 수 있어요.
✨ 관리자 페이지 커스터마이징하기
- Post 모델을 관리자 페이지에서 관리하려면, admin.py 파일을 설정해줘야 합니다.
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'slug', 'author', 'publish', 'status']
list_filter = ['status', 'created', 'publish', 'author']
search_fields = ['title', 'body']
prepopulated_fields = {'slug': ('title',)}
raw_id_fields = ['author']
date_hierarchy = 'publish'
ordering = ['status', 'publish']
- admin.ModelAdmin 클래스를 상속받아 Post 모델을 커스터마이징했습니다.
- list_display, list_filter, search_fields 같은 속성을 설정해 관리 페이지 사용성을 높였습니다.
✨ 특히, prepopulated_fields 설정으로 글 제목을 입력하면 자동으로 slug가 생성됩니다!
🛠️ 목록(View)과 상세(View) 페이지 만들기
- 이제 실제로 사용자가 볼 수 있는 게시글 리스트 페이지와 상세 페이지를 만들어볼게요.
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.published.all()
return render(request, 'blog/post/list.html', {'posts': posts})
def post_detail(request, id):
post = get_object_or_404(Post, id=id, status=Post.Status.PUBLISHED)
return render(request, 'blog/post/detail.html', {'post': post})
- list 뷰는 발행된 모든 게시글을 가져오고,
- detail 뷰는 특정 id를 가진 게시글을 찾되, 없으면 404 에러를 반환합니다. (get_object_or_404 사용)
✨ URL 매핑하기
- 뷰를 만들었으면, 이제 URL 패턴을 등록해 사용자가 접근할 수 있게 해야 합니다.
- blog/urls.py를 만들어 다음과 같이 작성합니다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
path('<int:id>/', views.post_detail, name='post_detail'),
]
- 그리고 프로젝트 urls.py에 include를 추가합니다.
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls', namespace='blog')),
]
- namespace='blog'를 설정해두면 URL Reverse 시 충돌을 방지할 수 있어요.
📄 뷰에 맞는 템플릿 만들기
- 마지막으로, 실제 사용자에게 보여질 화면인 HTML 템플릿을 생성합니다.
- 템플릿 디렉터리 구조는 이렇게 구성합니다.
- list.html: 게시글 목록을 보여줄 템플릿
- detail.html: 개별 게시글 상세 정보를 보여줄 템플릿
💡 Django 템플릿 언어를 사용하면 동적으로 데이터를 표시할 수 있어, 아주 효율적인 개발이 가능합니다.
🤔 63일차 회고
- 오늘은 Django를 단순히 사용하는 데 그치지 않고, 그 안에 담긴 설계 철학과 흐름을 이해하려고 노력했던 하루였습니다.
- 특히 MTV 패턴과 요청-응답 사이클을 처음부터 다시 정리하면서, Django가 왜 생산성 높은 웹 프레임워크로 평가받는지를 체감할 수 있었습니다.
- 아직 부족한 부분도 많지만, 이번 정리를 통해 "내가 만들고 싶은 웹서비스를 Django 위에서 어떻게 구조화하고 관리할 수 있을까?"를 조금 더 구체적으로 상상할 수 있게 된 것 같습니다.
- 처음에는 모델, 뷰, 템플릿, URL, 관리자 설정 등 할 일이 많아 보였지만, 하나하나 연결해보니 모든 구조가 서로 맞물려 돌아간다는 걸 알게 되었고, '왜 이렇게 설계했을까?'를 고민하는 과정이 무척 흥미로웠던 것 같아요.
- 또한 단순히 코드를 작성하는 것만으로 끝나는 게 아니라, 데이터베이스 구조를 설계하고, 관리자 화면을 다듬고, URL과 템플릿을 연결하는 전체적인 흐름을 직접 손으로 만들어보면서 스스로 많은 걸 체득할 수 있었습니다.
728x90
LIST
'부트캠프 > LG U+' 카테고리의 다른 글
🤔 이러닝 하나 만들고 싶어서 Django로 정리함 (0) | 2025.05.02 |
---|---|
🤔 해도 해도 끝이 없는 AWS (0) | 2025.04.18 |
🤔 Flask를 어떻게 배포할까? (0) | 2025.04.07 |
🤔 Flask에 스타일 입혀주기 (1) | 2025.04.01 |
🤔 이게 Flask였던가... (0) | 2025.03.31 |