Python Django

Django는 파이썬으로 작성된 강력한 웹 프레임워크로, 빠르고 안전하며 확장 가능한 웹 애플리케이션을 개발할 수 있게 해준다. 2005년에 처음 출시된 이후 지속적으로 발전하며 오늘날 많은 대형 웹사이트의 백엔드로 사용되고 있다.

Django의 핵심 철학

Django는 “배터리 포함(Batteries Included)” 철학을 따른다. 이는 웹 개발에 필요한 대부분의 기능이 프레임워크에 이미 포함되어 있다는 의미이다. 또한 DRY(Don’t Repeat Yourself) 원칙을 중요시하며, 코드 재사용성을 높이고 반복을 줄이는 데 중점을 둔다.

장점

  1. 빠른 개발: 관리자 인터페이스와 ORM을 통해 빠른 개발이 가능하다.
  2. 보안: 다양한 보안 기능이 내장되어 있어 안전한 웹 애플리케이션 개발이 가능하다.
  3. 확장성: 다양한 서드파티 패키지를 통해 기능을 확장할 수 있다.
  4. 문서화: 풍부한 문서와 커뮤니티 지원을 받을 수 있다.

단점

  1. 모놀리식 구조: 작은 프로젝트에는 과도할 수 있다.
  2. 성능 이슈: ORM 사용 시 복잡한 쿼리에서 성능 문제가 발생할 수 있다.
  3. 학습 곡선: 초보자에게는 학습 곡선이 있을 수 있다.
  4. 실시간 처리: WebSocket 등의 실시간 기능은 추가 패키지 필요

Django의 아키텍처: MTV 패턴

Django는 MVC(Model-View-Controller) 패턴의 변형인 MTV(Model-Template-View) 패턴을 사용한다:

  1. 모델(Model): 데이터베이스 구조와 데이터 처리 로직을 정의한다.
  2. 템플릿(Template): 사용자에게 보여지는 UI 부분을 담당한다.
  3. 뷰(View): 모델과 템플릿 사이의 중개자 역할을 하며, 비즈니스 로직을 처리한다.

Django의 주요 기능

ORM(Object-Relational Mapping)

Django ORM은 데이터베이스 테이블을 파이썬 클래스로 추상화하여 SQL 쿼리 없이도 데이터베이스를 조작할 수 있게 해준다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# models.py 예시
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)  # 제목 필드
    content = models.TextField()              # 내용 필드
    created_at = models.DateTimeField(auto_now_add=True)  # 생성 날짜
    
    def __str__(self):
        return self.title  # 관리자 페이지에서 보여질 객체 이름

관리자 인터페이스(Admin Interface)

Django는 자동으로 생성되는 관리자 인터페이스를 제공하여 데이터베이스 내용을 쉽게 관리할 수 있게 한다.

1
2
3
4
5
# admin.py 예시
from django.contrib import admin
from .models import Article

admin.site.register(Article)  # Article 모델을 관리자 페이지에 등록

URL 라우팅

Django의 URL 라우팅 시스템은 URL 패턴을 뷰 함수와 연결한다.

1
2
3
4
5
6
7
8
# urls.py 예시
from django.urls import path
from . import views

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),  # /articles/ URL을 article_list 뷰와 연결
    path('articles/<int:id>/', views.article_detail, name='article_detail'),  # /articles/1/ 등의 URL 패턴 지원
]

템플릿 시스템

Django의 템플릿 시스템은 HTML에 파이썬 변수와 로직을 삽입할 수 있게 해준다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- template.html 예시 -->
<!DOCTYPE html>
<html>
<head>
    <title>{{ article.title }}</title>  <!-- 파이썬 변수 사용 -->
</head>
<body>
    <h1>{{ article.title }}</h1>
    
    <div>
        {{ article.content|linebreaks }}  <!-- 필터 사용 -->
    </div>
    
    <p>작성일: {{ article.created_at|date:"Y-m-d" }}</p>
    
    {% if user.is_authenticated %}  <!-- 조건문 사용 -->
        <a href="{% url 'article_edit' article.id %}">수정하기</a>
    {% endif %}
    
    <h2>댓글 목록</h2>
    {% for comment in article.comment_set.all %}  <!-- 반복문 사용 -->
        <p>{{ comment.content }}</p>
    {% empty %}
        <p>댓글이 없습니다.</p>
    {% endfor %}
</body>
</html>

폼 처리

Django는 폼 생성, 유효성 검사, 렌더링을 쉽게 할 수 있는 시스템을 제공한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# forms.py 예시
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content']  # 폼에 포함될 필드
        
    # 사용자 정의 유효성 검사
    def clean_title(self):
        title = self.cleaned_data['title']
        if len(title) < 5:
            raise forms.ValidationError("제목은 5글자 이상이어야 합니다.")
        return title

인증 시스템

Django는 사용자 등록, 로그인, 권한 관리 등의 기능을 제공한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# views.py 인증 예시
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect

@login_required  # 로그인한 사용자만 접근 가능
def create_article(request):
    if request.method == 'POST':
        # POST 요청 처리
        # ...
    else:
        # GET 요청 처리
        # ...

보안 기능

Django는 CSRF 보호, SQL 인젝션 방지, 클릭재킹 방지 등 다양한 보안 기능을 기본적으로 제공한다.

1
2
3
4
5
6
<!-- CSRF 토큰 예시 -->
<form method="post">
    {% csrf_token %}  <!-- CSRF 공격 방지 토큰 -->
    {{ form.as_p }}
    <button type="submit">저장</button>
</form>

Django 프로젝트 시작하기

Django 프로젝트를 시작하는 기본 단계:

Django 설치

1
pip install django

프로젝트 생성

1
django-admin startproject myproject

앱 생성

1
2
cd myproject
python manage.py startapp myapp

앱 등록

1
2
3
4
5
6
7
# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    # ...
    'myapp',  # 새로 생성한 앱 등록
]

모델 정의 및 마이그레이션

1
2
python manage.py makemigrations  # 모델 변경사항 감지
python manage.py migrate  # 데이터베이스에 변경사항 적용

개발 서버 실행

1
python manage.py runserver

Django REST Framework (DRF)

현대 웹 개발에서는 API 개발이 중요하다.
Django REST Framework는 Django를 기반으로 RESTful API를 쉽게 구축할 수 있게 해주는 강력한 도구이다.

1
2
3
4
5
6
7
8
# serializers.py 예시
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['id', 'title', 'content', 'created_at']
1
2
3
4
5
6
7
8
# views.py의 API 뷰 예시
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

Django의 비동기 지원

Django 3.0부터는 ASGI(Asynchronous Server Gateway Interface)를 지원하여 비동기 뷰를 작성할 수 있게 되었다.

1
2
3
4
5
# 비동기 뷰 예시
async def async_view(request):
    # 비동기 작업 수행
    await asyncio.sleep(1)
    return HttpResponse("비동기 뷰 응답")

Django 테스트

Django는 자동화된 테스트를 쉽게 작성할 수 있는 프레임워크를 제공한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# tests.py 예시
from django.test import TestCase
from .models import Article

class ArticleModelTest(TestCase):
    def setUp(self):
        # 테스트 데이터 설정
        Article.objects.create(title="테스트 제목", content="테스트 내용")
    
    def test_article_title(self):
        # 테스트 메서드
        article = Article.objects.get(id=1)
        self.assertEqual(article.title, "테스트 제목")

Django 배포

Django 애플리케이션을 프로덕션 환경에 배포하는 일반적인 방법은 다음과 같다:

  1. Gunicorn/uWSGI: WSGI 서버로 Django 애플리케이션 실행
  2. Nginx/Apache: 웹 서버로 정적 파일 제공 및 요청 프록시
  3. PostgreSQL/MySQL: 프로덕션 데이터베이스 사용
  4. Docker: 컨테이너화를 통한 일관된 환경 제공
  5. AWS/Heroku/DigitalOcean: 클라우드 플랫폼에 배포
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 프로덕션용 settings.py 설정 예시
DEBUG = False
ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']

# 정적 파일 설정
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

# 보안 설정
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

Django의 확장성

Django는 다양한 플러그인과 패키지를 통해 기능을 확장할 수 있다:

Django를 사용하는 유명 웹사이트

Django의 성능 최적화

Django 애플리케이션의 성능을 최적화하는 방법은 다음과 같다:

  1. 데이터베이스 최적화: 인덱싱, select_related/prefetch_related 사용
  2. 캐싱: 메모리 캐시, Redis 등을 활용한 캐싱
  3. 비동기 처리: 시간이 오래 걸리는 작업은 Celery 등을 통해 비동기로 처리
  4. 정적 파일 최적화: CDN 사용, 정적 파일 압축
  5. 프로파일링: Django Debug Toolbar를 활용한 성능 병목 지점 파악

참고 및 출처

The web framework for perfectionists with deadlines | Django