동음이의어에 대한 내용은 장고 문서 참고하십시오.
<colbgcolor=#0c4b33><colcolor=#fff> 최신 버전 | 5.1.x |
언어 | Python |
링크 | 공식 홈페이지 |
1. 개요
Django는 2005년부터 시작된 Python의 오픈 소스 웹 프레임워크이자 풀 스택 프레임워크이다.D가 묵음이기 때문에 '드장고'가 아닌 쟁고[ˈdʒæŋɡoʊ] 정도로 읽으면 된다.
Django 소프트웨어 재단은 소셜 댓글 서비스 디스커스(Disqus)를 만든 곳이기도 하다. Python을 이용해 제작한다.
Django는 Python 기반 웹 프레임워크 중에 가장 널리 퍼져있다. 일반적으로 파이썬을 웹 서비스에 쓴다고 하면 Django 또는 Flask를 쓴다고 생각하면 된다. 둘의 차이는 풀 스택 프레임워크(Django)냐 아니냐 정도.
MVT[1] 패턴에서 Model의 경우 데이터베이스와 연동이 편하게 만들어져 있다.
기본적으로 Model에 해당하는 DBMS는 SQLite를 사용하게 되어있으며, Django Admin 기능을 통해 쉽게 조회/편집이 가능하다.[2]
Django가 웹브라우저의 요청을 받았을 때 요청에서 응답까지의 흐름을 잘 나타낸 다이어그램 |
2. 특징
강력한 풀스택 웹 프레임워크답게 기본적으로 제공하는 것들이 많다.3. 단점
- 성능 이슈: 아무래도 100% 다 쓰기 어려운 방대한 기능들을 제공하기 때문에. 소규모 프로젝트에서는 불필요한 기능들로 인한 성능 저하가 발생할 수 있다. 또한, ORM 특성[4]상 쿼리 호출시 모델 클래스에 정의된 속성을 필드로 프로젝션하므로 불필요한 정보가 딸려들어와 이로 인한 성능 저하가 발생하기도 한다. [5]
- ORM 자유도: ORM 상에서 명시적으로 INNER / OUTER JOIN 연산을 정의할 수 없다. 물론 select_related나 prefetch_related[6]를 사용하여 직/간접적인 JOIN을 강제할 수 있으나, 이 또한 모델간 관계에 따라 사용이 제한되므로 작성된 ORM 문장이 실제로 실행되는 방식을 이해하지 못한다면 n+1 문제[7]로 인한 성능 저하를 맛볼 수 있다. 그렇기에 SQL 성능이 중요한 비즈니스 로직에서는 ORM 호출문이 실행됨에 따라 쿼리가 어떻게 변환되어 호출되는지를 파악하기 위해 프로파일링 패키지 (django-silk, Django Debug Toolbar) 등을 활용하여 쿼리 분석 및 최적화가 필요하다.
- ORM에서 지원하지 않는 기능을 활용한 쿼리를 사용하고자 한다면 별도의 뷰 (View)를 구성하거나, extra 또는 Raw SQL을 이용하여 직접 쿼리문을 호출해야 한다. 이마저도 각 레코드가 모델 인스턴스로 변환되기 때문에 쿼리 결과를 모델 인스턴스로 변환하는 것이 어렵거나 성능 이슈가 우려되는 경우에는 커서 컨텍스트 매니저를 이용하여 DB에서 직접 데이터를 인출하기도 한다.[8][9]
4. 역사
장고는 2003~2004년에 로렌스 저널-월드(Lawrence Journal-World)라는 신문사의 인턴 웹 프로그래머였던 에이드리안 홀로바티(Adrian Holovaty)와 사이먼 윌리슨(Simon Willison)이 파이썬을 이용해 애플리케이션을 만들기 시작하면서 처음 개발되었다.2003년 로렌스 신문사의 웹사이트는 PHP 기반으로 쓰여졌었는데, 홀로바티와 윌리슨은 당시 PHP 버전은 객체지향을 지원하지 않아서 (PHP 4.3) 규모가 큰 웹사이트에 적합하지 않다고 생각했고 평소에 관심을 가지고 있던 파이썬으로 웹 개발을 하기로 결심했다. 하지만 규모가 큰 웹 개발에 적합한 파이썬 도구가 없다는 것을 깨닫고 새롭게 장고를 개발하게 된 것이다.
사실 처음 장고를 개발할때엔 웹 프레임워크보다는 그냥 CMS를 개발하는 것이라고 생각했다고 한다. 개발자가 개발 당시의 기억들을 풀어놓은 글을 읽고 싶다면 여기(영어)에 사이먼 윌리슨 본인이 직접 쓴 글이 있다. (공동 개발자인 에이드리안도 따봉을 눌렀다!) 장고라는 이름은 홀로바티가 좋아하던 기타리스트 장고 라인하르트에서 따온 것이라고 한다.
또한 장고는 사실 오직 로렌스 웹사이트를 구동하기 위해 개발된 것이었지만, 홀로바티와 윌리슨이 로렌스의 오너 기업인 더 월드 컴퍼니(The World Company)를 설득하여 오픈 소스로 2005년 7월에 BSD 라이선스로 공개하게 되었다. 윌리슨은 더 월드 컴퍼니도 다른 오픈 소스 프로젝트를 많이 사용했기 때문에 쉽게 설득할 수 있었다고 얘기했다.
5. 릴리즈 정책
릴리즈 프로세스장고 버전은 1.0 부터 A.B.C 정책을 사용하기 시작하였으며 크게 기능 릴리즈, 패치 릴리즈, LTS 릴리즈로 나뉘어진다.
여기서 1 버전과 2 버전 이후로 버전 정책이 서로 다르지만 현재 지원이 완전히 종료된 1[10] 버전은 생략하고, 2 버전부터 사용중인 정책 기준으로 설명한다.
- 기능 릴리즈: A.0 ~ A.1로 끝나는 버전[11]이다. 이 버전들은 대략 8개월 단위로 출시되며, 약 1년 4개월[12]간 지원된다. 기능 릴리즈에는 이전 버전에 없던 신규 기능, 기존 기능의 개선 사항 등이 포함된다. LTS 버전의 밑거름이 되는 버전으로, 만약 이전 LTS에서 다음 LTS로 업그레이드를 준비한다면 기능 릴리즈 단위로 차근차근 업그레이드 및 테스트하는 것을 권장한다.
- 패치 릴리즈: A.B.C 형식에서 C에 해당하는 버전[13]으로, 보안 이슈나 데이터 유실 등의 크리티컬한 버그를 수정하는 패치 버전이다. 정말 업그레이드를 하기 어려운 사정이 있지 않은 이상, 기능 릴리즈와 100% 호환되므로 즉시 업데이트 하는 것이 좋다.
- LTS 릴리즈: A.2로 끝나는 버전[14]은 장기 지원 릴리즈에 걸맞게 출시로부터 3년[15]간 패치 릴리즈를 제공하는 것이 보장된 버전이다. 실 서비스에 사용할 목적이라면 LTS 버전을 기준으로 개발하고 운영하는 것을 추천한다.[16]
2024년 10월 기준으로 4.2[A], 5.0, 5.1 버전을 공식 사이트에서 다운로드 받을 수 있으며, 각 버전별 지원기간은 아래와 같다.
6. 사용 중인 곳
- 인스타그램: 세계에서 제일 큰 규모의 장고 웹사이트이다. 그래서 그런지 장고 소프트웨어 재단에 매년 3만불 이상을 기부하고 있고 2개의 플래티넘 법인 회원 중 하나이다. 다른 하나는 IntelliJ IDEA를 만든 JetBrains.
- 러닝스푼즈: Django 기반으로 LMS 플랫폼을 구축했다.
- 설표의장고: 한국 Django 이용자 커뮤니티. Django로 만들어진 웹사이트다. 소통공간의 역할만 하는 것이 아니라 장고로 커뮤니티 기능이 있는 웹사이트를 만들고 배포하는 방법도 무료로 제공하고 있다.
- 8퍼센트
- 스마트스터디
- 피알앤디컴퍼니: 내차팔기앱 헤이딜러를 운영하고 있다.
- 위시켓
- 번개장터
- 숨은고수Django와 Vue.js를 사용했다.
- 하얀설표 블로그
- 피플펀드
- 마이뮤직테이스트
- Laftel
- 딜리버리히어로코리아
- SendBird
- 투어라이브
- 화해(버드뷰)
- 딥네츄럴(레이블러)
- 오픈갤러리
- 로앤굿
- 데일리샷
- 위허들링(위잇딜라이트): Django, Django Rest Framework 사용
- 비바리퍼블리카(토스): 사내 서비스 개발에 사용
7. 관련 문서
8. 외부 링크
[1] Model-View-Template[2] Settings.py에서 DATABASE 부분을 수정하고 migrate 하면 DBMS를 PostgreSQL이나 MySQL, MariaDB 등으로 쉽게 변경할 수 있다.[3] 사용자 인증, django.shortcuts, Generic View, User model 등[4] Object–relational mapping이라는 정의에 알맞게 테이블은 모델 클래스가, 각 레코드는 모델 인스턴스가 된다[5] 물론 values나 only를 이용하여 사용할 필드를 제한할 수는 있다[6] 모델간의 상관관계에 따라 SQL 조인을 수행하지 않을 수 있다![7] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping[8] FROM 절 뒤에 오는 가상 테이블에 대한 쿼리를 ORM 구문으로 직접 정의하거나 관리하기 어렵기 때문에, 가상 테이블에 대한 조인이 필요한 경우 종종 사용하기도 함.[9] 여기까지 오게 되면 특정 RDBMS에 대한 쿼리를 작성할 수 밖에 없게 된다. 만약, 해당 프로젝트가 여러 RDBMS에 대한 호환성을 보장해야 한다면 작성한 쿼리를 표준 SQL로 통일하거나, RDBMS 종류별로 조건분기를 해야 할 것이다.[10] Python 2.x를 지원하는 버전[11] ex: 3.0, 4.1[12] 메인스트림 8개월, 연장 지원 8개월[13] ex: 3.2.7, 4.1.5[14] ex: 2.2, 3.2[15] 메인스트림 8개월, 연장 지원 2년 4개월[16] 장고로 일정 규모 이상의 서비스를 개발한다면 100% 순수 장고만을 이용하기는 어렵고, 누군가가 만들어둔 서드파티 패키지들을 같이 사용하게 되는데 종속 패키지 개발자가 유지보수에 아예 손을 놓지 않은 이상, 기능 릴리즈 단계부터 차근차근 호환성을 확보하여 대부분 LTS 버전과 호환되기 때문[A] LTS[A] [B] 현재 연장 지원 중[B] 현재 연장 지원 중[21] 현재 메인스트림 지원 중