Django Web Framework

1. Django 개요

1.1 Django의 개발 경위

  • 2003~2004년
    • 로렌스 저널-월드(Lawrence Journal-World) 신문사의 인턴 웹 프로그래머였던 에이드리안 홀로바티(Adrian Holovaty)와 사이먼 윌리슨(Simon Willison)이 파이썬을 이용해 애플리케이션을 만들기 시작하면서 처음 개발
  • 2003년 로렌스 신문사의 웹사이트는 PHP 기반으로 개발
    • 홀로바티와 윌리슨은 당시 PHP 버전은 객체지향을 지원하지 않아서 (PHP 4.3) 규모가 큰 웹사이트에 적합하지 않다고 생각
    • 평소에 관심을 가지고 있던 파이썬으로 웹 개발을 하기로 결심
    • 하지만 규모가 큰 웹 개발에 적합한 파이썬 도구가 없다는 것을 깨닫고 새롭게 장고를 개발하게 된 것
  • 사실 처음 장고를 개발할때엔 웹 프레임워크보다는 그냥 CMS를 개발하는 것이라고 생각했다고 함
    • 장고라는 이름은 홀로바티가 좋아하던 기타리스트 장고 라인하르트에서 따온 것
    • 또한 장고는 사실 오직 로렌스 웹사이트를 구동하기 위해 개발된 것
  • 홀로바티와 윌리슨이 로렌스의 오너 기업인 더 월드 컴퍼니(The World Company)를 설득하여 오픈 소스로 2005년 7월에 BSD 라이선스로 공개
    • 윌리슨은 더 월드 컴퍼니도 다른 오픈 소스 프로젝트를 많이 사용했기 때문에 쉽게 설득할 수 있었다고 얘기함

1.2 Django의 Release 정책

  • 장고 버전은 1.0 부터 A.B.C 정책을 사용하기 시작
  • 크게 기능 릴리즈, 패치 릴리즈, LTS 릴리즈로 구분
  • 여기서 1 버전과 2 버전 이후로 버전 정책이 서로 다르지만 현재 지원이 완전히 종료된 1[10] 버전은 생략하고, 2 버전부터 사용중인 정책 기준으로 설명

    • 기능 릴리즈
      • A.0 ~ A.1로 끝나는 버전
      • 이 버전들은 대략 8개월 단위로 출시되며, 약 1년 4개월간 지원됨
      • 기능 릴리즈에는 이전 버전에 없던 신규 기능, 기존 기능의 개선 사항 등이 포함됨
      • LTS 버전의 밑거름이 되는 버전
      • 이전 LTS에서 다음 LTS로 업그레이드를 준비한다면 기능 릴리즈 단위로 차근차근 업그레이드 및 테스트하는 것을 권장함
    • 패치 릴리즈
      • A.B.C 형식에서 C에 해당하는 버전
      • 보안 이슈나 데이터 유실 등의 크리티컬한 버그를 수정하는 패치 버전
      • 정말 업그레이드를 하기 어려운 사정이 있지 않은 이상, 기능 릴리즈와 100% 호환되므로 즉시 업데이트 하는 것이 좋음
    • LTS 릴리즈
      • A.2로 끝나는 버전
      • 장기 지원 릴리즈에 걸맞게 출시로부터 3년간 패치 릴리즈를 제공하는 것이 보장된 버전
      • 실 서비스에 사용할 목적이라면 LTS 버전을 기준으로 개발하고 운영하는 것을 추천
  • 2024년 7월 기준, 5.0.7 버전을 공식 사이트에서 다운로드 받을 수 있음

1.3 Django 기반 개발

  • Django는 Python 기반 웹 프레임워크 중에 가장 널리 사용됨
    • 일반적으로 파이썬을 웹 서비스에 쓴다고 하면 Django 또는 Flask
    • 둘의 차이는 풀 스택 프레임워크(Django)냐 아니냐 정도.
  • 특징: 강력한 풀스택 웹 프레임워크답게 기본적으로 제공하는 것들이 많음
    • ORM을 기본적으로 제공
    • 관리자 페이지를 기본적으로 제공
    • 자주 사용되는 로직들을 묶어서 기본적으로 제공
    • 만들어진 엔티티에 따라 권한 목록을 알아서 제공
  • 단점
    • 성능 이슈
      • 100% 쓰기 어려운 방대한 기능들을 제공: 소규모 프로젝트에서는 불필요한 기능들로 인한 성능 저하 발생 가능
      • ORM 특성상 쿼리 호출시 모델 클래스에 정의된 속성을 필드로 프로젝션: 불필요한 정보가 딸려들어와 이로 인한 성능 저하가 발생하기도 함
    • ORM 자유도
      • ORM 상에서 명시적으로 INNER / OUTER JOIN 연산을 정의할 수 없음
        • select_related나 prefetch_related를 사용하여 직/간접적인 JOIN을 강제할 수 있으나,
        • 이 또한 모델간 관계에 따라 사용이 제한되므로
        • 작성된 ORM 문장이 실제로 실행되는 방식을 이해하지 못한다면 n+1 문제로 인한 성능 저하 발생 가능
      • 그렇기에 SQL 성능이 중요한 비즈니스 로직에서는
        • ORM 호출문이 실행됨에 따라 쿼리가 어떻게 변환되어 호출되는지를 파악하기 위해
        • 프로파일링 패키지 (django-silk, Django Debug Toolbar) 등을 활용하여
        • 쿼리 분석 및 최적화가 필요함
    • ORM에서 지원하지 않는 기능을 활용한 쿼리를 사용하고자 한다면
      • 별도의 뷰 (View)를 구성하거나
      • extra 또는 Raw SQL을 이용하여 직접 쿼리문을 호출해야 함
      • 이마저도 각 레코드가 모델 인스턴스로 변환되기 때문에
      • 쿼리 결과를 모델 인스턴스로 변환하는 것이 어렵거나 성능 이슈가 우려되는 경우
        • 커서 컨텍스트 매니저를 이용하여 DB에서 직접 데이터를 인출하기도 함

2. Django 환경 설정

2.1 Django 개발 환경

  • Django를 로컬 컴퓨터에 설치하여 장고 어플리케이션을 개발, 실행, 테스트할 수 있는 환경
  • Django 자체가 제공하는 주요 툴
    • Django 프로젝트를 생성하고 작업하기 위한 파이썬 스크립트들
    • 심플한 개발용 웹 서버
      • 개발용 웹 서버로 우리는 로컬 컴퓨터에서 개발한 Django 어플리케이션을 같은 로컬 컴퓨터에서 테스트해 볼 수 있음
      • 예: 자신의 PC에서 개발한 Django 웹 어플리케이션을 크롬 브라우저와 같은 웹 브라우저 상에서 실행하고 테스트해볼 수 있음
  • Django 개발 환경에서 제공하는 다른 도구들
    • 코드 작성을 돕는 텍스트 에디터와 IDE
    • 소스코드의 버전을 안전하게 관리하기 위한 Git과 같은 소스 관리 도구 등

2.2 Django 설치 옵션

  • 여러 운영 체제(Windows, Mac OS X, Linux/Unit 등)에서 설치 가능
  • 소스에서, 파이썬 패키지 인덱스(PyPi)에서, 그리고 많은 경우 호스트 컴퓨터의 패키지 매니저 어플리케이션에서 설치 가능
  • 별도로 설치 및 구성되어있어야 하는 여러가지 데이터베이스 중 하나를 사용하도록 설정할 수 있음
  • 메인 시스템의 파이썬 환경 또는 별도의 파이썬 가상 환경에서 실행됨

2.3 Django 다운로드

  • Django를 다운로드하는 세 가지 방법
    • pip 도구를 이용한 PyPi(Python Package Repository)에서 설치
      • Django의 최신 버전을 받을 수 있는 최적의 방법
    • 본인 컴퓨터의 패키지 매니저에 있는 버전 사용
      • 운영체제와 함께 제공되는 Django는 친숙한 설치 방법을 제공함
      • 단 오래된 버전일 수 있음
    • 소스에서 설치하기
      • 소스에서 Django의 최신버전을 다운로드하여 설치할 수 있음
      • 초심자에게는 비추천
      • Django에게 기여할 수 있는 준비가 됐다면 필요함

2.4 Database 선택

  • 네 가지 메인 데이터베이스(PostgreSQL, MySQL, Oracle, SQLite) 지원
    • 그 외에 다른 인기있는 SQL과 NoSQL 데이터베이스들을 다양한 레벨로 지원하는 커뮤니티 라이브러리가 있음
    • 생산과 개발에 동일한 데이터베이스를 선택하는 것을 추천
  • ORM(Object-Relational Mapper)을 사용해 데이터베이스간의 차이 대부분을 추상화
    • 아직 피하는게 나은 잠재적 문제들이 있음
  • 많은 경우, 학습, 실습 시에는 데이터를 파일로 저장하는 SQLite 데이터베이스를 사용
    • SQLite는 가벼운 데이터베이스로 사용하기에 적합
    • 높은 수준의 동시성을 지원하지 않음
    • 그렇지만 주로 읽기 전용인 응용 프로그램을 위해서는 아주 좋은 선택

2.5 Django 설치하기

  • 가상환경 생성하기

      python -m venv django_simple
      cd django_simple
      source bin/activate
    
  • Django 설치하기

      pip install django
      python -m django --version
    

2.6 기본 코드 작성해보기

2.6.1 django 버전 확인해보기

  • 파일로 생성해도 되고 파이썬 CLI 환경에서 코드 입력 및 실행해도 됨
python -m django --version
import django

print(django.get_version())

2.6.2 Django 기반 심플 웹서버 실행해 보기

  • django 프로젝트 생성

      django-admin startproject mytestsite .
    
    • mytestsite(프로젝트 명) 다음에 . 을 입력할 것을 권장함
    • . 을 입력하지 않아도 문제는 없으나 mytestsite라는 프로젝트 폴더가 생성되고 그 안에 프로젝트를 위한 설정이 새롭게 추가되므로 폴더 구조가 꽤 번거로워짐
  • 웹서버 실행하기

      python manage.py runserver
    
  • 웹 브라우저에서 http://127.0.0.1:8000/ 로 접속하면 심플 웹서버가 실행 중임을 확인할 수 있음

2.6.3 mytestsite에 들어있는 파일 확인

  • manage.py
    • Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티
  • mysite/
    • 디렉토리 내부에는 프로젝트를 위한 실제 Python 패키지들이 저장됨
    • 이 디렉토리 내의 이름을 이용하여, (mysite.urls 와 같은 식으로) 프로젝트의 어디서나 Python 패키지들을 임포트할 수 있음
  • mysite/__ init __.py
    • Python으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일
  • mysite/settings.py
    • 현재 Django 프로젝트의 환경 및 구성을 저장
    • Django settings에서 환경 설정이 어떻게 동작하는지 확인할 수 있음
  • mysite/urls.py
    • 현재 Django project 의 URL 선언을 저장
    • Django 로 작성된 사이트의 “목차” 라고 할 수 있음
  • mysite/asgi.py
    • 현재 프로젝트를 서비스하기 위한 ASGI-호환 웹 서버의 진입점
  • mysite/wsgi.py
    • 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점