본문 바로가기

Backend study/Django

Django란?

Django란?

Django(장고)는 파이썬으로 작성된 고수준 웹 프레임워크다. 2005년 미국 캔자스의 Lawrence Journal-World 신문사에서 웹 개발을 하던 Adrian Holovaty와 Simon Willison이 만들었다. 신문사의 빠른 개발 요구사항을 충족시키기 위해 탄생한 Django는 "완벽주의자들을 위한 웹 프레임워크"라는 슬로건을 가지고 있다.

 

Django의 핵심 철학

1. DRY (Don't Repeat Yourself)

코드의 중복을 최소화하라. Django는 재사용 가능한 앱과 컴포넌트를 통해 이를 실현한다.

2. 빠른 개발

프로토타입에서 프로덕션까지 빠르게 개발할 수 있도록 설계되었다. 기본적으로 필요한 기능들이 대부분 내장되어 있다.

3. 명시적인 것이 암시적인 것보다 낫다

파이썬의 철학을 그대로 따른다. 마법같은 동작보다는 명확하고 이해하기 쉬운 코드를 지향한다.

 

MVT 아키텍처

Django는 MVT(Model-View-Template) 패턴을 사용한다. 이는 MVC 패턴의 변형으로 볼 수 있다.

# Model - 데이터 구조 정의
class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

# View - 비즈니스 로직 처리
def article_list(request):
    articles = Article.objects.all()
    return render(request, 'articles/list.html', {'articles': articles})

# Template - 표현 계층
# articles/list.html
{% for article in articles %}
    <h2>{{ article.title }}</h2>
    <p>{{ article.content }}</p>
{% endfor %}

 

Django의 주요 구성 요소

1. ORM (Object-Relational Mapping)

SQL을 직접 작성하지 않고도 데이터베이스를 다룰 수 있다. 데이터베이스 독립적이어서 SQLite, PostgreSQL, MySQL, Oracle 등을 쉽게 전환할 수 있다.

# SQL 대신 파이썬 코드로 쿼리
articles = Article.objects.filter(
    created_at__gte=datetime.now() - timedelta(days=7)
).order_by('-created_at')

2. URL 라우팅

깔끔하고 우아한 URL 설계를 지원한다.

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),
    path('articles/<int:pk>/', views.article_detail, name='article_detail'),
    path('api/v1/', include('api.urls')),
]

3. 미들웨어

요청과 응답 처리 과정에 개입할 수 있는 훅을 제공한다. 인증, 세션, CSRF 보호 등이 미들웨어로 구현되어 있다.

4. Forms

HTML 폼을 파이썬 클래스로 정의하고 유효성 검사를 자동화한다.

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content']
        
    def clean_title(self):
        title = self.cleaned_data.get('title')
        if len(title) < 5:
            raise forms.ValidationError('제목은 5자 이상이어야 합니다.')
        return title

5. Admin 인터페이스

모델을 등록하면 자동으로 관리자 페이지가 생성된다. CRUD 작업을 위한 별도 개발이 필요없다.

from django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'created_at']
    search_fields = ['title', 'content']

 

Django의 앱 구조

Django는 프로젝트를 여러 개의 앱으로 나누어 관리한다. 각 앱은 특정 기능을 담당하는 독립적인 모듈이다.

myproject/
├── manage.py
├── myproject/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── blog/
│   ├── migrations/
│   ├── __init__.py
│   ├── models.py
│   ├── views.py
│   ├── urls.py
│   └── admin.py
└── users/
    ├── migrations/
    ├── __init__.py
    ├── models.py
    ├── views.py
    └── admin.py

 

Django의 강력한 기능들

1. 마이그레이션

모델 변경사항을 데이터베이스에 자동으로 반영한다.

python manage.py makemigrations
python manage.py migrate

2. 캐싱

다양한 캐싱 백엔드를 지원한다. Memcached, Redis, 데이터베이스 캐싱 등을 쉽게 적용할 수 있다.

3. 국제화(i18n)와 지역화(l10n)

다국어 지원이 내장되어 있어 글로벌 서비스 개발이 용이하다.

4. 보안

  • CSRF 토큰 자동 생성
  • SQL 인젝션 방지
  • XSS 공격 방지
  • 클릭재킹 방지
  • HTTPS 리다이렉션

5. 테스팅

강력한 테스트 프레임워크가 내장되어 있다.

from django.test import TestCase
from .models import Article

class ArticleTestCase(TestCase):
    def test_article_creation(self):
        article = Article.objects.create(
            title="Test Article",
            content="Test Content"
        )
        self.assertEqual(article.title, "Test Article")

 

Django의 장단점

장점

  • 빠른 개발 속도
  • 풍부한 기능 내장
  • 강력한 보안 기능
  • 확장성과 재사용성

단점

  • 학습 곡선이 가파름
  • 작은 프로젝트에는 과할 수 있음
  • 모놀리식 구조

 

Django는 "배터리 포함" 철학으로 웹 개발에 필요한 거의 모든 기능을 제공하는 풀스택 프레임워크다. 빠른 개발과 안정성, 보안을 중시하는 프로젝트라면 Django는 여전히 최고의 선택지 중 하나다.

728x90