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