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 상에서 명시적으로 INNER / OUTER JOIN 연산을 정의할 수 없음
- 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에게 기여할 수 있는 준비가 됐다면 필요함
- pip 도구를 이용한 PyPi(Python Package Repository)에서 설치
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 호환 웹 서버의 진입점