Django

내위키
(장고 프레임워크에서 넘어옴)

파이썬 기반의 웹 프레임워크. 장고재단(Django Foundation)이 관리하고 있다. 공식 웹사이트는 여기로. 파이썬으로 웹 기반 서비스를 만들 때 Flask와 함께 가장 많이 쓰이고 있다. REST API 서비스를 개발할 때에는 FastAPI가 이게 파이썬 기반 맞나 할 정도로 빠른 속도를 무기로 뜨고 있으나 아직은 Django REST 프레임워크가 많이 쓰이는 편이다.

로렌스 저널-월드라는 미국 캔자스 로렌스 지역 일간신문에서 저널리스트 겸 웹 프로그래머로 근무하던 에이드리언 홀로바티(Adrian Holovaty)와 인턴으로 근무하던 웹 프로그래머인 사이먼 윌리슨(Simon Willison)이 2003년 가을부터 개발에 착수했다. 윌리슨의 인턴십이 끝나기 직전에 제이콥 캐플런-모스(Jacob Kaplan-Moss)가 회사에 고용되어 개발에 합류했고, 2005년에 BSD 라이선스로 첫 선을 보였다. 원래는 로렌스 저널-월드의 CMS 시스템을 위해서 개발을 시작한 것이지만 점점 기능이 확대되어 풀 스택 웹 프레임워크로 성장했다. 이름은 에이드리언 홀로바티가 좋아하던 집시 재즈 기타리스인 장고 라인하르트의 이름에서 따 온 것인데, 홀로바티는 기타 연주에도 능했고 자신이 직접 작곡한 음악으로 음반까지 낸 바 있다. 유튜브에도 그의 기타 연주 채널이 있고 구독자가 3만 명이 넘는다.

가장 큰 특징이라면 'batteries included'[1]라는 말로 상징되는, 풀 스택 프레임워크라는 점이다. 즉 외부 모듈 없이도 Django가 제공하는 기능만으로도 일반적인 웹 서비스를 제공하는 데 문제가 없다는 뜻이다. 이는 경쟁자로 가장 많이 손꼽히는 Flask와는 대척점에 있다고 할 수 있는데, Flask는 마이크로 웹 프레임워크를 추구하고 있어서 기본적인 기능만 내장하고 필요한 다른 기능들은 외부 모듈을 붙여서 쓰도록 하는 반면, 풀 스택 프레임워크인 Django는 MVC 패턴을 기반으로 자체 템플릿 엔진, ORM, 심지어 고수준의 관리자 페이지까지도 몽땅 자체 지원한다.[2] 따라서 웬만한 웹사이트는 정말로 외부 모듈 필요 없이 Django만으로 관리자 기능까지 구축할 수 있다. 파이썬 ORM 중에서는 가장 완성도가 높아서 이것만 따로 떼어서 쓸 정도이기도 하다.[3] 다만 웹 서비스의 종류는 무척 다양하기 때문에 이에 따라 외부 모듈이 필요한 경우는 있다. 가장 많이 쓰는 외부 모듈 중 하나라면 Django REST 프레임워크.

넓은 사용층을 보유하고 있어서 주요한 개발환경들이 지원하고 있는 것도 장점이라면 장점이다. 비주얼 스튜디오 코드에도 Django 관련 플러그인이 여럿 있고 PyCharm은 무료 버전은 별볼일 없지만 유료 버전은 Django를 인식하여 비주얼 스튜디오 코드는 가볍게 넘어서는 강력한 지원 기능을 자랑한다. 또한 Django 공식 웹사이트의 문서가 방대하고 잘 정리되어 있는 것 역시도 장점이다.

데이터베이스는 sqlite를 기본으로 내장하고 있으며 PostgreSQL, MySQL(MariaDB), 오라클도 지원한다. 단 가장 잘 붙는 건 PostgreSQL이며 ArrayField처럼 이것만 지원하는 가능들이 좀 있으니 웬만하면 이걸로 쓰자. 무료로 쓸 수 있는 오픈 소스 데이터베이스라면 MySQL이나 여기서 갈라져 나온 MariaDB를 많이 생각하지만 PostgreSQL도 오랜 역사와 엔터프라이즈급의 강력한 성능을 자랑하는 데이터베이스다. NoSQL은 공식적으로는 지원하고 있지 않다. Django ORM을 그대로 몽고DB에 쓸 수 있는 Djongo 패키지가 있었지만 공식 지원은 아니며 그나마 2021년 6월 이후 더 이상 업데이트가 안 되고 있다.

개발 단계의 테스트를 위해 자체 간이 웹 서버도 내장하고 있다. 프로젝트 디렉터리 안에서 python manage.py runserver 명령으로 실행시키면 기본적으로 8000 포트로 접속할 수 있다. 그러나 이는 어디까지 개발 때 쓰라고 만들어 놓은 것이지 성능도 그렇고 보안 문제도 있기 때문에 실제 웹 서비스용으로는 쓰지 말라고 Django 측에서도 명시하고 있다. 실제 웹 서비스를 할 때에는 Apache 혹은 Nginx와 같은 제대로 된 웹 서버에 붙여서 써야 한다.

단점이라면 아무래도 덩치가 크다 보니 속도 문제가 종종 거론된다. 파이썬 자체가 인터프리트 언어로 속도 문제가 자주 시빗거리가 되는지라 여기에 온갖 기능을 다 때려넣어 덩치까지 무거운 Django의 성능은 종종 논란거리가 된다. 하지만 엔터프라이즈급 웹 서비스 중에도 Django로 잘만 굴러가는 사이트가 부지기수다. 가장 규모가 큰 서비스라면 인스타그램. 단, ORM을 비롯한 여러 부분을 마개조한 것으로 알려져 있다.[4] 또한 일반 웹사이트에 필요한 모든 부분을 Django가 제공한다는 것은 그만큼 개발자는 선택의 폭이 좁다는 뜻이 된다. Django가 제공하는 것보다 더 나은 대안이 있어도 편의성 문제가 워낙에 크다 보니 다른 대안을 갖다 쓰기가 쉽지 않다. 반면 Flask는 자체 기능은 정말 기본의 기본 수준이고, 개발자가 자기가 선호하는 외부 모듈을 이것저것 붙여서 구성할 수 있다.

속도를 높이기 위한 몇 가지 대안들이 있다. 속도 문제로 가장 많이 까이는 걸로는 템플릿 엔진이 있는데, 장고에서 만든 것이니 당연히 궁합은 가장 좋지만 병목현상을 일으키는 주범으로 지목되어 왔다. Jinja2 같은 템플릿 엔진을 고려해 보라고 심지어 Django 공식문서에서도 얘기할 정도.[5] PyPy를 사용하는 것도 방법이지만 웹 프레임워크에서는 별 차이가 없다는 견해도 있다. 예를 들어 템플릿 엔진은 PyPy 쪽이 더 빠르지만 데이터베이스 드라이버는 표준 구현체인 CPython이 더 낫다는 견해다. JIT 컴파일 방식을 사용하는 PyPy가 반복적인 코드 실행에는 더 유리하지만 C 언어로 만들어 붙인 모듈은 CPython 쪽과 더 잘 맞기 때문인 것으로 보인다. 또한 C 언어로 만든 일부 모듈은 PyPy에서 실행이 잘 안 되는 문제도 있다.


각주

  1. 말 그대로 해석하면 '배터리 탑재'인데, 원래는 파이썬의 모토로, 웬만한 일은 다 할 수 있을 정도로 광범위한 모듈을 제공한다는 뜻으로 풀이한다. 즉 뭔가를 할 수 있는 도구만 주는 게 아니라 실제 그 도구를 써먹는 데 필요한 파워를 외부에서 끌어올 필요 없이 자체 내장하고 있다는 뜻으로 볼 수 있을 듯.
  2. 필요에 따라 맞춤 설정할 수 있는 여지도 많기 때문에 서비스에 맞는 관리자 페이지를 구축할 수 있다.
  3. Flask에는 SQL-Alchemy 같은 ORM 모듈을 붙여 쓰기도 하지만 Django ORM이 워낙 좋고 많이들 쓰다 보니 이걸 Flask에 붙여서 쓰기도 할 정도다.
  4. 하긴, Django만큼이나 속도 문제로 말이 많은 Ruby on Rails로 서비스하는 웹사이트가 GitHub이고, 트위터도 한동안 이걸 쓰다가 나중에 Java로 갈아탔다.
  5. "Performance and optimization", Django 4.0 Documentation.